Skip to content

Commit 8a5863f

Browse files
committed
Fix possible race in schedulePlayerSettingChange
1 parent 18cdc31 commit 8a5863f

1 file changed

Lines changed: 9 additions & 4 deletions

File tree

internal/player/prefs.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"github.com/yktoo/ymuse/internal/config"
2323
"github.com/yktoo/ymuse/internal/generated"
2424
"github.com/yktoo/ymuse/internal/util"
25+
"sync"
2526
"time"
2627
)
2728

@@ -65,6 +66,7 @@ type PrefsDialog struct {
6566
queueColumns []queueCol
6667
// Timer for delayed player setting change callback invocation
6768
playerSettingChangeTimer *time.Timer
69+
playerSettingChangeMutex sync.Mutex
6870
// Callbacks
6971
onQueueColumnsChanged func()
7072
onPlayerSettingChanged func()
@@ -337,15 +339,18 @@ func (d *PrefsDialog) populateColumns() {
337339

338340
func (d *PrefsDialog) schedulePlayerSettingChange() {
339341
// Cancel the currently scheduled callback, if any
342+
d.playerSettingChangeMutex.Lock()
343+
defer d.playerSettingChangeMutex.Unlock()
340344
if d.playerSettingChangeTimer != nil {
341345
d.playerSettingChangeTimer.Stop()
342346
}
347+
343348
// Schedule a new callback
344349
d.playerSettingChangeTimer = time.AfterFunc(time.Second, func() {
345-
util.WhenIdle("onPlayerSettingChanged()", func() {
346-
d.playerSettingChangeTimer = nil
347-
d.onPlayerSettingChanged()
348-
})
350+
d.playerSettingChangeMutex.Lock()
351+
d.playerSettingChangeTimer = nil
352+
d.playerSettingChangeMutex.Unlock()
353+
util.WhenIdle("onPlayerSettingChanged()", d.onPlayerSettingChanged)
349354
})
350355
}
351356

0 commit comments

Comments
 (0)