aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec
diff options
context:
space:
mode:
authorDerek Buitenhuis <derek.buitenhuis@gmail.com>2013-10-10 11:05:40 -0400
committerLuca Barbato <lu_zero@gentoo.org>2014-01-07 09:43:58 +0100
commit48d57650f121d3d9e977832e9006bb334337d921 (patch)
tree66f86d155bdf330c3800d14ef4c63de6527d8e1d /libavcodec
parent371659d1ad71cac41732c5d9d7a32ee1cf173c95 (diff)
downloadffmpeg-48d57650f121d3d9e977832e9006bb334337d921.tar.gz
pthread: Fix deadlock during thread initialization
Sometimes, if pthread_create() failed, then pthread_cond_wait() could accidentally be called in the worker threads after the uninit function had already called pthread_cond_broadcast(), leading to a deadlock. Don't call pthread_cond_wait() if c->done is set. Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com> (cherry picked from commit 1a5a6ac01b0ad2cf3d2128372ea41f3c1cfc2d3f)
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/pthread.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/libavcodec/pthread.c b/libavcodec/pthread.c
index 64cff43983..af1c9455f8 100644
--- a/libavcodec/pthread.c
+++ b/libavcodec/pthread.c
@@ -206,7 +206,8 @@ static void* attribute_align_arg worker(void *v)
if (c->current_job == thread_count + c->job_count)
pthread_cond_signal(&c->last_job_cond);
- pthread_cond_wait(&c->current_job_cond, &c->current_job_lock);
+ if (!c->done)
+ pthread_cond_wait(&c->current_job_cond, &c->current_job_lock);
our_job = self_id;
if (c->done) {