mirror of https://github.com/mpv-player/mpv
cache: fix previous commit
The cache reader thread actually unlocks the mutex protecting the underlying stream while reading from it. That's why other code goes out of its way to run certain stream operations on the cache thread. Do the same. We could have this simpler by creating a mechanism that would "park" the cache thread and make it wait for the lock (while we have it) in order to gain exclusive access. This could be done in the future.
This commit is contained in:
parent
374600cec0
commit
f4d62dc4a0
|
@ -124,6 +124,7 @@ enum {
|
|||
CACHE_CTRL_NONE = 0,
|
||||
CACHE_CTRL_QUIT = -1,
|
||||
CACHE_CTRL_PING = -2,
|
||||
CACHE_CTRL_SEEK = -3,
|
||||
|
||||
// we should fill buffer only if space>=FILL_LIMIT
|
||||
FILL_LIMIT = 16 * 1024,
|
||||
|
@ -505,6 +506,10 @@ static void *cache_thread(void *arg)
|
|||
}
|
||||
if (s->control > 0) {
|
||||
cache_execute_control(s);
|
||||
} else if (s->control == CACHE_CTRL_SEEK) {
|
||||
s->control_res = cache_update_stream_position(s);
|
||||
s->control = CACHE_CTRL_NONE;
|
||||
pthread_cond_signal(&s->wakeup);
|
||||
} else {
|
||||
cache_fill(s);
|
||||
}
|
||||
|
@ -579,7 +584,12 @@ static int cache_seek(stream_t *cache, int64_t pos)
|
|||
} else {
|
||||
cache->pos = s->read_filepos = s->read_min = pos;
|
||||
s->eof = false; // so that cache_read() will actually wait for new data
|
||||
r = cache_update_stream_position(s);
|
||||
s->control = CACHE_CTRL_SEEK;
|
||||
s->control_res = 0;
|
||||
double retry = 0;
|
||||
while (s->control != CACHE_CTRL_NONE && !mp_cancel_test(s->cache->cancel))
|
||||
cache_wakeup_and_wait(s, &retry);
|
||||
r = s->control_res;
|
||||
pthread_cond_signal(&s->wakeup);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue