input/async: use class DeferredCall
This commit is contained in:
@@ -31,7 +31,9 @@ AsyncInputStream::AsyncInputStream(const char *_url,
|
||||
Mutex &_mutex, Cond &_cond,
|
||||
size_t _buffer_size,
|
||||
size_t _resume_at)
|
||||
:InputStream(_url, _mutex, _cond), DeferredMonitor(io_thread_get()),
|
||||
:InputStream(_url, _mutex, _cond),
|
||||
deferred_resume(io_thread_get(), BIND_THIS_METHOD(DeferredResume)),
|
||||
deferred_seek(io_thread_get(), BIND_THIS_METHOD(DeferredSeek)),
|
||||
allocation(_buffer_size),
|
||||
buffer((uint8_t *)allocation.get(), _buffer_size),
|
||||
resume_at(_resume_at),
|
||||
@@ -141,7 +143,7 @@ AsyncInputStream::Seek(offset_type new_offset, Error &error)
|
||||
seek_offset = new_offset;
|
||||
seek_state = SeekState::SCHEDULED;
|
||||
|
||||
DeferredMonitor::Schedule();
|
||||
deferred_seek.Schedule();
|
||||
|
||||
while (seek_state != SeekState::NONE)
|
||||
cond.wait(mutex);
|
||||
@@ -208,7 +210,7 @@ AsyncInputStream::Read(void *ptr, size_t read_size, Error &error)
|
||||
offset += (offset_type)nbytes;
|
||||
|
||||
if (paused && buffer.GetSize() < resume_at)
|
||||
DeferredMonitor::Schedule();
|
||||
deferred_resume.Schedule();
|
||||
|
||||
return nbytes;
|
||||
}
|
||||
@@ -240,16 +242,24 @@ AsyncInputStream::AppendToBuffer(const void *data, size_t append_size)
|
||||
}
|
||||
|
||||
void
|
||||
AsyncInputStream::RunDeferred()
|
||||
AsyncInputStream::DeferredResume()
|
||||
{
|
||||
const ScopeLock protect(mutex);
|
||||
|
||||
Resume();
|
||||
|
||||
if (seek_state == SeekState::SCHEDULED) {
|
||||
seek_state = SeekState::PENDING;
|
||||
buffer.Clear();
|
||||
paused = false;
|
||||
DoSeek(seek_offset);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
AsyncInputStream::DeferredSeek()
|
||||
{
|
||||
const ScopeLock protect(mutex);
|
||||
if (seek_state != SeekState::SCHEDULED)
|
||||
return;
|
||||
|
||||
Resume();
|
||||
|
||||
seek_state = SeekState::PENDING;
|
||||
buffer.Clear();
|
||||
paused = false;
|
||||
DoSeek(seek_offset);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user