dirlist: fix race condition in directory selection

This replaces a channel that is used like a context with a context.

Signed-off-by: Moritz Poldrack <git@moritz.sh>
Acked-by: Koni Marti <koni.marti@gmail.com>
This commit is contained in:
Moritz Poldrack 2022-06-25 20:47:24 +02:00 committed by Robin Jarry
parent 6a10123f4a
commit 964b362ceb
1 changed files with 30 additions and 23 deletions

View File

@ -1,6 +1,7 @@
package widgets package widgets
import ( import (
"context"
"fmt" "fmt"
"log" "log"
"math" "math"
@ -57,12 +58,15 @@ type DirectoryList struct {
selected string selected string
spinner *Spinner spinner *Spinner
worker *types.Worker worker *types.Worker
skipSelect chan bool skipSelect context.Context
skipSelectCancel context.CancelFunc
connected bool connected bool
} }
func NewDirectoryList(conf *config.AercConfig, acctConf *config.AccountConfig, func NewDirectoryList(conf *config.AercConfig, acctConf *config.AccountConfig,
logger *log.Logger, worker *types.Worker) DirectoryLister { logger *log.Logger, worker *types.Worker,
) DirectoryLister {
ctx, cancel := context.WithCancel(context.Background())
dirlist := &DirectoryList{ dirlist := &DirectoryList{
aercConf: conf, aercConf: conf,
@ -70,7 +74,8 @@ func NewDirectoryList(conf *config.AercConfig, acctConf *config.AccountConfig,
logger: logger, logger: logger,
store: lib.NewDirStore(), store: lib.NewDirStore(),
worker: worker, worker: worker,
skipSelect: make(chan bool), skipSelect: ctx,
skipSelectCancel: cancel,
} }
uiConf := dirlist.UiConfig() uiConf := dirlist.UiConfig()
dirlist.spinner = NewSpinner(&uiConf) dirlist.spinner = NewSpinner(&uiConf)
@ -135,10 +140,12 @@ func (dirlist *DirectoryList) ExpandFolder() {
func (dirlist *DirectoryList) Select(name string) { func (dirlist *DirectoryList) Select(name string) {
dirlist.selecting = name dirlist.selecting = name
close(dirlist.skipSelect) dirlist.skipSelectCancel()
dirlist.skipSelect = make(chan bool) ctx, cancel := context.WithCancel(context.Background())
dirlist.skipSelect = ctx
dirlist.skipSelectCancel = cancel
go func() { go func(ctx context.Context) {
defer logging.PanicHandler() defer logging.PanicHandler()
select { select {
@ -179,11 +186,11 @@ func (dirlist *DirectoryList) Select(name string) {
dirlist.Invalidate() dirlist.Invalidate()
}) })
dirlist.Invalidate() dirlist.Invalidate()
case <-dirlist.skipSelect: case <-ctx.Done():
dirlist.logger.Println("dirlist: skip", name) dirlist.logger.Println("dirlist: skip", name)
return return
} }
}() }(ctx)
} }
func (dirlist *DirectoryList) Selected() string { func (dirlist *DirectoryList) Selected() string {