From f4d62dc4a0ae52883a081f1d0f955fd83d51e59a Mon Sep 17 00:00:00 2001 From: wm4 Date: Mon, 11 Jul 2016 22:16:06 +0200 Subject: [PATCH] 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. --- stream/cache.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/stream/cache.c b/stream/cache.c index 70a34f88df..02d618f18d 100644 --- a/stream/cache.c +++ b/stream/cache.c @@ -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); }