Commit 1a411b1c authored by Max Kellermann's avatar Max Kellermann

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.
parent e7519829
......@@ -89,6 +89,17 @@ mixer_open(struct mixer *mixer)
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
mixer_close(struct mixer *mixer)
{
......@@ -97,10 +108,8 @@ mixer_close(struct mixer *mixer)
g_mutex_lock(mixer->mutex);
if (mixer->open) {
mixer->plugin->close(mixer);
mixer->open = false;
}
if (mixer->open)
mixer_close_internal(mixer);
g_mutex_unlock(mixer->mutex);
}
......@@ -121,7 +130,7 @@ mixer_failed(struct mixer *mixer)
{
assert(mixer->open);
mixer_close(mixer);
mixer_close_internal(mixer);
mixer->failed = true;
}
......
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