summaryrefslogtreecommitdiffstats
path: root/misc
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2016-09-16 16:11:33 +0200
committerwm4 <wm4@nowhere>2016-09-16 16:11:33 +0200
commit17e3e800e1b7bb568ea150fd8182b63966bff509 (patch)
tree50690b95e57dc42c92d15518915ff2cd74e2d45d /misc
parentccf3458f8aeca2bbf16b00ebf90f9da99c86bebd (diff)
downloadmpv-17e3e800e1b7bb568ea150fd8182b63966bff509.tar.bz2
mpv-17e3e800e1b7bb568ea150fd8182b63966bff509.tar.xz
dispatch: fix a race condition triggering an assert()
If we were waiting, and then exiting due to timeout, we still have to recheck the condition protected by the condition variable/mutex in order to get back to a consistent state. In this case, the queue was locked with mp_dispatch_lock(), and mp_dispatch_queue_process() got to return without waiting for unlock. Also caused commit 8716c2e8. Probably an argument for replacing the dispatch queue by a simple mutex.
Diffstat (limited to 'misc')
-rw-r--r--misc/dispatch.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/misc/dispatch.c b/misc/dispatch.c
index dca39e5fe1..40729d9e8d 100644
--- a/misc/dispatch.c
+++ b/misc/dispatch.c
@@ -249,7 +249,7 @@ void mp_dispatch_queue_process(struct mp_dispatch_queue *queue, double timeout)
} else if (wait > 0 && !queue->interrupted) {
struct timespec ts = mp_time_us_to_timespec(wait);
if (pthread_cond_timedwait(&queue->cond, &queue->lock, &ts))
- break;
+ wait = 0;
} else {
break;
}