From: RĂ©mi Denis-Courmont Date: Mon, 3 Aug 2009 16:35:37 +0000 (+0300) Subject: vlc_timer_gettime: fix corner-case dead lock X-Git-Tag: 1.1.0-ff~4593 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=1b9c3f12c850b65dc33d7d33bcaadcfdd128e84b;p=vlc vlc_timer_gettime: fix corner-case dead lock If vlc_cancel() while the timer thread is between mwait() and vlc_mutex_lock(), a dead lock would occur at vlc_join(). We need to release the timer lock first. --- diff --git a/src/misc/pthread.c b/src/misc/pthread.c index 47ac47831d..d31e38810b 100644 --- a/src/misc/pthread.c +++ b/src/misc/pthread.c @@ -812,11 +812,16 @@ void vlc_timer_destroy (vlc_timer_t timer) void vlc_timer_schedule (vlc_timer_t timer, bool absolute, mtime_t value, mtime_t interval) { + static vlc_mutex_t lock = VLC_STATIC_MUTEX; + + vlc_mutex_lock (&lock); vlc_mutex_lock (&timer->lock); if (timer->value) { + vlc_mutex_unlock (&timer->lock); vlc_cancel (timer->thread); vlc_join (timer->thread, NULL); + vlc_mutex_lock (&timer->lock); timer->value = 0; } if ((value != 0) @@ -827,6 +832,7 @@ void vlc_timer_schedule (vlc_timer_t timer, bool absolute, timer->interval = interval; } vlc_mutex_unlock (&timer->lock); + vlc_mutex_unlock (&lock); } /**