On Thu, 10 Oct 2013 11:08:34 -0400, Derek Buitenhuis <[email protected]> wrote: > Sometimes, if pthread_ceate() failed, then pthread_cond_wait() could > accidentally be called in the worker threads after the unit 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 <[email protected]> > --- > libavcodec/pthread.c | 3 ++- > libavfilter/pthread.c | 3 ++- > 2 files changed, 4 insertions(+), 2 deletions(-) > > diff --git a/libavcodec/pthread.c b/libavcodec/pthread.c > index f4795f3..b0d9e27 100644 > --- a/libavcodec/pthread.c > +++ b/libavcodec/pthread.c > @@ -152,7 +152,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) { > diff --git a/libavfilter/pthread.c b/libavfilter/pthread.c > index a4f45c8..17e8e7b 100644 > --- a/libavfilter/pthread.c > +++ b/libavfilter/pthread.c > @@ -73,7 +73,8 @@ static void* attribute_align_arg worker(void *v) > if (c->current_job == nb_threads + c->nb_jobs) > 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) { > -- > 1.8.4.rc3 >
LGTM with typos foxed -- Anton Khirnov _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
