diff options
author | wm4 <wm4@nowhere> | 2018-04-13 22:56:49 +0200 |
---|---|---|
committer | Jan Ekström <jeebjp@gmail.com> | 2018-04-15 21:07:13 +0300 |
commit | fdb39f313b1f62ea62e19a6c620a58625a329240 (patch) | |
tree | bb89583c6056469c0f1054485bdd47b104511087 /demux/demux.c | |
parent | 4381753207c0af92af480a25f403bdc8737071a6 (diff) |
demux: fix deadlock on "program" property changes
Tries to recursively lock a non-recursive lock, which usually ends in a
deadlock. Must have been broken by some past refactor.
Diffstat (limited to 'demux/demux.c')
-rw-r--r-- | demux/demux.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/demux/demux.c b/demux/demux.c index 4563a034a2..23ec713276 100644 --- a/demux/demux.c +++ b/demux/demux.c @@ -2945,6 +2945,8 @@ static void thread_demux_control(void *p) struct demux_internal *in = demuxer->in; int r = CONTROL_UNKNOWN; + pthread_mutex_unlock(&in->lock); + if (cmd == DEMUXER_CTRL_STREAM_CTRL) { struct demux_ctrl_stream_ctrl *c = arg; if (in->threading) @@ -2960,6 +2962,8 @@ static void thread_demux_control(void *p) r = demuxer->desc->control(demuxer->in->d_thread, cmd, arg); } + pthread_mutex_lock(&in->lock); + *args->r = r; } @@ -2990,7 +2994,9 @@ int demux_control(demuxer_t *demuxer, int cmd, void *arg) pthread_cond_wait(&in->wakeup, &in->lock); pthread_mutex_unlock(&in->lock); } else { + pthread_mutex_lock(&in->lock); thread_demux_control(&args); + pthread_mutex_unlock(&in->lock); } return r; |