Commit ced3f320 authored by Max Kellermann's avatar Max Kellermann

output/MultipleOutputs: reduce lock/unlock calls in EnableDisable()

Use ScopeLock to manage the lock; don't unlock after obtaining the "really_enabled" flag; keep the same lock during EnableWait() / DisableWait().
parent a9d72938
......@@ -323,13 +323,17 @@ public:
/**
* Enables the device.
*
* Caller must lock the mutex.
*/
void LockEnableWait();
void EnableWait();
/**
* Disables the device.
*
* Caller must lock the mutex.
*/
void LockDisableWait();
void DisableWait();
void LockPauseAsync();
......
......@@ -44,7 +44,11 @@ MultipleOutputs::MultipleOutputs(MixerListener &_mixer_listener)
MultipleOutputs::~MultipleOutputs()
{
for (auto i : outputs) {
i->LockDisableWait();
{
const ScopeLock lock(i->mutex);
i->DisableWait();
}
i->Finish();
}
}
......@@ -107,17 +111,13 @@ void
MultipleOutputs::EnableDisable()
{
for (auto ao : outputs) {
bool enabled;
ao->mutex.lock();
enabled = ao->really_enabled;
ao->mutex.unlock();
const ScopeLock lock(ao->mutex);
if (ao->enabled != enabled) {
if (ao->enabled != ao->really_enabled) {
if (ao->enabled)
ao->LockEnableWait();
ao->EnableWait();
else
ao->LockDisableWait();
ao->DisableWait();
}
}
}
......
......@@ -70,7 +70,7 @@ AudioOutput::LockCommandWait(Command cmd)
}
void
AudioOutput::LockEnableWait()
AudioOutput::EnableWait()
{
if (!thread.IsDefined()) {
if (plugin.enable == nullptr) {
......@@ -84,11 +84,11 @@ AudioOutput::LockEnableWait()
StartThread();
}
LockCommandWait(Command::ENABLE);
CommandWait(Command::ENABLE);
}
void
AudioOutput::LockDisableWait()
AudioOutput::DisableWait()
{
if (!thread.IsDefined()) {
if (plugin.disable == nullptr)
......@@ -101,7 +101,7 @@ AudioOutput::LockDisableWait()
return;
}
LockCommandWait(Command::DISABLE);
CommandWait(Command::DISABLE);
}
inline bool
......
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