From 2f59eaeecfa8e3e2a9beb77c9b5138de064004f3 Mon Sep 17 00:00:00 2001 From: Daniel Barber Date: Sat, 15 Feb 2020 12:24:09 -0500 Subject: [PATCH] Woops, we were reading this outside of the lock! --- .../MPDClient/Extensions/MPDClient+Idle.swift | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/Persephone/MPDClient/Extensions/MPDClient+Idle.swift b/Persephone/MPDClient/Extensions/MPDClient+Idle.swift index 2cb7309..6052c72 100644 --- a/Persephone/MPDClient/Extensions/MPDClient+Idle.swift +++ b/Persephone/MPDClient/Extensions/MPDClient+Idle.swift @@ -11,10 +11,10 @@ import mpdclient extension MPDClient { func noIdle() { - if isIdle { - do { - idleLock.lock() - defer { idleLock.unlock() } + do { + idleLock.lock() + defer { idleLock.unlock() } + if isIdle { mpd_send_noidle(connection) isIdle = false } @@ -22,14 +22,21 @@ extension MPDClient { } func idle(_ force: Bool = false) { - if (!self.isIdle && self.commandQueue.operationCount == 1) || force { - do { - idleLock.lock() - defer { idleLock.unlock() } + let shouldIdle: Bool + + do { + idleLock.lock() + defer { idleLock.unlock() } + shouldIdle = (!self.isIdle && self.commandQueue.operationCount == 1) || force + if shouldIdle { mpd_send_idle(self.connection) self.isIdle = true } + } + + // noIdle could happen here which will crash + if shouldIdle { let result = mpd_recv_idle(self.connection, true) self.handleIdleResult(result) }