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:
parent
6a10123f4a
commit
964b362ceb
|
@ -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 {
|
||||||
|
|
Loading…
Reference in New Issue