output/alsa: make the "active" attribute thread-safe

This commit is contained in:
Max Kellermann 2018-04-26 16:12:32 +02:00
parent 7d546f80f9
commit 485ed0b156
1 changed files with 12 additions and 4 deletions

View File

@ -123,8 +123,7 @@ class AlsaOutput final
* After Open(), has this output been activated by a Play()
* command?
*
* This attribute is not thread-safe. It is only used by the
* client thread (the thread which calls AudioOutput public methods).
* Protected by #mutex.
*/
bool active;
@ -162,7 +161,7 @@ class AlsaOutput final
Alsa::PeriodBuffer period_buffer;
/**
* Protects #cond, #error, #drain.
* Protects #cond, #error, #active, #drain.
*/
mutable Mutex mutex;
@ -228,6 +227,12 @@ private:
#endif
);
gcc_pure
bool LockIsActive() const noexcept {
const std::lock_guard<Mutex> lock(mutex);
return active;
}
/**
* Activate the output by registering the sockets in the
* #EventLoop. Before calling this, filling the ring buffer
@ -784,7 +789,7 @@ AlsaOutput::CancelInternal() noexcept
void
AlsaOutput::Cancel() noexcept
{
if (!active) {
if (!LockIsActive()) {
/* early cancel, quick code path without thread
synchronization */
@ -880,6 +885,9 @@ AlsaOutput::DispatchSockets() noexcept
try {
{
const std::lock_guard<Mutex> lock(mutex);
assert(active);
if (drain) {
{
ScopeUnlock unlock(mutex);