Commit ca06d9d3 authored by Max Kellermann's avatar Max Kellermann

input/buffered: fix deadlock bug

parent ed2db04f
ver 0.21.9 (not yet released) ver 0.21.9 (not yet released)
* input
- buffer: fix deadlock bug
* Android * Android
- fix crash on ARMv7 - fix crash on ARMv7
- request storage permission on Android 6+ - request storage permission on Android 6+
......
...@@ -165,6 +165,30 @@ BufferedInputStream::RunThread() noexcept ...@@ -165,6 +165,30 @@ BufferedInputStream::RunThread() noexcept
seek = false; seek = false;
client_cond.signal(); client_cond.signal();
} else if (!idle && !read_error && } else if (!idle && !read_error &&
offset != input->GetOffset() &&
!IsAvailable()) {
/* a past Seek() call was a no-op because data
was already available at that position, but
now we've reached a new position where
there is no more data in the buffer, and
our input is reading somewhere else (maybe
stuck at the end of the file); to find a
way out, we now seek our input to our
reading position to be able to fill our
buffer */
try {
input->Seek(offset);
} catch (...) {
/* this is really a seek error, but we
register it as a read_error,
because seek_error is only checked
by Seek(), and at our frontend (our
own InputStream interface) is in
"read" mode */
read_error = std::current_exception();
}
} else if (!idle && !read_error &&
input->IsAvailable() && !input->IsEOF()) { input->IsAvailable() && !input->IsEOF()) {
const auto read_offset = input->GetOffset(); const auto read_offset = input->GetOffset();
auto w = buffer.Write(read_offset); auto w = buffer.Write(read_offset);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment