From 8a5863fd69f1bef03369a0f244fb70d0fafa8c69 Mon Sep 17 00:00:00 2001 From: Dmitry Kann Date: Thu, 13 Aug 2020 18:10:25 +0200 Subject: [PATCH] Fix possible race in schedulePlayerSettingChange --- internal/player/prefs.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/internal/player/prefs.go b/internal/player/prefs.go index 6c9e0ce..140753a 100644 --- a/internal/player/prefs.go +++ b/internal/player/prefs.go @@ -22,6 +22,7 @@ import ( "github.com/yktoo/ymuse/internal/config" "github.com/yktoo/ymuse/internal/generated" "github.com/yktoo/ymuse/internal/util" + "sync" "time" ) @@ -65,6 +66,7 @@ type PrefsDialog struct { queueColumns []queueCol // Timer for delayed player setting change callback invocation playerSettingChangeTimer *time.Timer + playerSettingChangeMutex sync.Mutex // Callbacks onQueueColumnsChanged func() onPlayerSettingChanged func() @@ -337,15 +339,18 @@ func (d *PrefsDialog) populateColumns() { func (d *PrefsDialog) schedulePlayerSettingChange() { // Cancel the currently scheduled callback, if any + d.playerSettingChangeMutex.Lock() + defer d.playerSettingChangeMutex.Unlock() if d.playerSettingChangeTimer != nil { d.playerSettingChangeTimer.Stop() } + // Schedule a new callback d.playerSettingChangeTimer = time.AfterFunc(time.Second, func() { - util.WhenIdle("onPlayerSettingChanged()", func() { - d.playerSettingChangeTimer = nil - d.onPlayerSettingChanged() - }) + d.playerSettingChangeMutex.Lock() + d.playerSettingChangeTimer = nil + d.playerSettingChangeMutex.Unlock() + util.WhenIdle("onPlayerSettingChanged()", d.onPlayerSettingChanged) }) }