fix data race on searchTimer

This commit is contained in:
Drew Weymouth
2022-12-27 15:58:01 -08:00
parent 03e7e61c38
commit 000bf63484
+9
View File
@@ -2,6 +2,7 @@ package ui
import ( import (
"context" "context"
"sync"
"time" "time"
"fyne.io/fyne/v2" "fyne.io/fyne/v2"
@@ -24,6 +25,7 @@ type BrowsingPane struct {
searchBar *searchField searchBar *searchField
searchTimer *time.Timer searchTimer *time.Timer
searchTimerLock sync.Mutex
cancelPendingSearch context.CancelFunc cancelPendingSearch context.CancelFunc
curPage Page curPage Page
@@ -138,9 +140,12 @@ func (b *BrowsingPane) onSearchTextChanged(text string) {
if text == "" { if text == "" {
if b.cancelPendingSearch != nil { if b.cancelPendingSearch != nil {
b.cancelPendingSearch() b.cancelPendingSearch()
b.cancelPendingSearch = nil
} }
b.sendSearch("") b.sendSearch("")
} }
b.searchTimerLock.Lock()
defer b.searchTimerLock.Unlock()
if b.searchTimer == nil { if b.searchTimer == nil {
ctx, cancel := context.WithCancel(context.Background()) ctx, cancel := context.WithCancel(context.Background())
b.cancelPendingSearch = cancel b.cancelPendingSearch = cancel
@@ -148,9 +153,13 @@ func (b *BrowsingPane) onSearchTextChanged(text string) {
go func(ctx context.Context, trigger <-chan time.Time) { go func(ctx context.Context, trigger <-chan time.Time) {
select { select {
case <-ctx.Done(): case <-ctx.Done():
b.searchTimerLock.Lock()
defer b.searchTimerLock.Unlock()
b.searchTimer = nil b.searchTimer = nil
case <-trigger: case <-trigger:
b.sendSearch(b.searchBar.Text) b.sendSearch(b.searchBar.Text)
b.searchTimerLock.Lock()
defer b.searchTimerLock.Unlock()
b.searchTimer = nil b.searchTimer = nil
} }
}(ctx, b.searchTimer.C) }(ctx, b.searchTimer.C)