fix data race on searchTimer
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user