mixer_control: don't lock the mutex twice in mixer_failed()
The function mixer_failed() expects the mixer mutex to be already locked, yet it calls mixer_close(), which attempts to lock the mutex again, deadlocking itself.
This commit is contained in:
parent
e7519829ac
commit
1a411b1ced
@ -89,6 +89,17 @@ mixer_open(struct mixer *mixer)
|
|||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
mixer_close_internal(struct mixer *mixer)
|
||||||
|
{
|
||||||
|
assert(mixer != NULL);
|
||||||
|
assert(mixer->plugin != NULL);
|
||||||
|
assert(mixer->open);
|
||||||
|
|
||||||
|
mixer->plugin->close(mixer);
|
||||||
|
mixer->open = false;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
mixer_close(struct mixer *mixer)
|
mixer_close(struct mixer *mixer)
|
||||||
{
|
{
|
||||||
@ -97,10 +108,8 @@ mixer_close(struct mixer *mixer)
|
|||||||
|
|
||||||
g_mutex_lock(mixer->mutex);
|
g_mutex_lock(mixer->mutex);
|
||||||
|
|
||||||
if (mixer->open) {
|
if (mixer->open)
|
||||||
mixer->plugin->close(mixer);
|
mixer_close_internal(mixer);
|
||||||
mixer->open = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_mutex_unlock(mixer->mutex);
|
g_mutex_unlock(mixer->mutex);
|
||||||
}
|
}
|
||||||
@ -121,7 +130,7 @@ mixer_failed(struct mixer *mixer)
|
|||||||
{
|
{
|
||||||
assert(mixer->open);
|
assert(mixer->open);
|
||||||
|
|
||||||
mixer_close(mixer);
|
mixer_close_internal(mixer);
|
||||||
|
|
||||||
mixer->failed = true;
|
mixer->failed = true;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user