From 60887eddd0d8ea88aa4b9db91fbb8a561d0a59eb Mon Sep 17 00:00:00 2001 From: Stefan Haller Date: Wed, 2 Apr 2025 12:11:38 +0200 Subject: [PATCH] Use readLines channel only for command tasks And only while the task is running. This avoids accumulating lots of blocked goroutines when scrolling a view down more than 1024 times (the capacity of the readLines channel). --- pkg/tasks/tasks.go | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/pkg/tasks/tasks.go b/pkg/tasks/tasks.go index 965875349..6f6960d5f 100644 --- a/pkg/tasks/tasks.go +++ b/pkg/tasks/tasks.go @@ -91,16 +91,18 @@ func NewViewBufferManager( beforeStart: beforeStart, refreshView: refreshView, onEndOfInput: onEndOfInput, - readLines: make(chan LinesToRead, 1024), + readLines: nil, onNewKey: onNewKey, newGocuiTask: newGocuiTask, } } func (self *ViewBufferManager) ReadLines(n int) { - go utils.Safe(func() { - self.readLines <- LinesToRead{Total: n, InitialRefreshAfter: -1} - }) + if self.readLines != nil { + go utils.Safe(func() { + self.readLines <- LinesToRead{Total: n, InitialRefreshAfter: -1} + }) + } } func (self *ViewBufferManager) NewCmdTask(start func() (*exec.Cmd, io.Reader), prefix string, linesToRead LinesToRead, onDoneFn func()) func(TaskOpts) error { @@ -166,7 +168,6 @@ func (self *ViewBufferManager) NewCmdTask(start func() (*exec.Cmd, io.Reader), p loadingMutex := deadlock.Mutex{} - // not sure if it's the right move to redefine this or not self.readLines = make(chan LinesToRead, 1024) scanner := bufio.NewScanner(r) @@ -274,6 +275,8 @@ func (self *ViewBufferManager) NewCmdTask(start func() (*exec.Cmd, io.Reader), p } } + self.readLines = nil + refreshViewIfStale() if err := cmd.Wait(); err != nil { @@ -349,6 +352,8 @@ func (self *ViewBufferManager) NewTask(f func(TaskOpts) error, key string) error go utils.Safe(func() { defer completeGocuiTask() + self.readLines = nil + self.taskIDMutex.Lock() self.newTaskID++ taskID := self.newTaskID