Commit 1b9c3f12 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

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.
parent 4428a700
......@@ -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);
}
/**
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment