diff options
author | Jesse Duffield <jessedduffield@gmail.com> | 2020-10-07 21:19:38 +1100 |
---|---|---|
committer | Jesse Duffield <jessedduffield@gmail.com> | 2020-10-10 00:23:01 +1100 |
commit | 79e59d5460d838203bc79ac86c0ba529305ba2a9 (patch) | |
tree | 7a7d6c48440f02945599606494ac64424d274f58 /pkg/tasks/tasks.go | |
parent | ba4c3e5bc475a7819fd954985105073ba239bf9e (diff) |
add some safe goroutines
WIP
Diffstat (limited to 'pkg/tasks/tasks.go')
-rw-r--r-- | pkg/tasks/tasks.go | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/pkg/tasks/tasks.go b/pkg/tasks/tasks.go index f6e3432f2..5854b4f46 100644 --- a/pkg/tasks/tasks.go +++ b/pkg/tasks/tasks.go @@ -10,6 +10,7 @@ import ( "time" "github.com/jesseduffield/lazygit/pkg/commands/oscommands" + "github.com/jesseduffield/lazygit/pkg/utils" "github.com/sirupsen/logrus" ) @@ -41,14 +42,14 @@ func NewViewBufferManager(log *logrus.Entry, writer io.Writer, beforeStart func( } func (m *ViewBufferManager) ReadLines(n int) { - go func() { + go utils.Safe(func() { m.readLines <- n - }() + }) } func (m *ViewBufferManager) NewCmdTask(r io.Reader, cmd *exec.Cmd, prefix string, linesToRead int, onDone func()) func(chan struct{}) error { return func(stop chan struct{}) error { - go func() { + go utils.Safe(func() { <-stop if err := oscommands.Kill(cmd); err != nil { if !strings.Contains(err.Error(), "process already finished") { @@ -58,7 +59,7 @@ func (m *ViewBufferManager) NewCmdTask(r io.Reader, cmd *exec.Cmd, prefix string if onDone != nil { onDone() } - }() + }) loadingMutex := sync.Mutex{} @@ -67,13 +68,13 @@ func (m *ViewBufferManager) NewCmdTask(r io.Reader, cmd *exec.Cmd, prefix string done := make(chan struct{}) - go func() { + go utils.Safe(func() { scanner := bufio.NewScanner(r) scanner.Split(bufio.ScanLines) loaded := false - go func() { + go utils.Safe(func() { ticker := time.NewTicker(time.Millisecond * 100) defer ticker.Stop() select { @@ -88,7 +89,7 @@ func (m *ViewBufferManager) NewCmdTask(r io.Reader, cmd *exec.Cmd, prefix string case <-stop: return } - }() + }) outer: for { @@ -139,7 +140,7 @@ func (m *ViewBufferManager) NewCmdTask(r io.Reader, cmd *exec.Cmd, prefix string } close(done) - }() + }) m.readLines <- linesToRead @@ -157,10 +158,10 @@ func (t *ViewBufferManager) Close() { c := make(chan struct{}) - go func() { + go utils.Safe(func() { t.currentTask.Stop() c <- struct{}{} - }() + }) select { case <-c: @@ -175,7 +176,7 @@ func (t *ViewBufferManager) Close() { // 2) string based, where the manager can also be asked to read more lines func (m *ViewBufferManager) NewTask(f func(stop chan struct{}) error) error { - go func() { + go utils.Safe(func() { m.taskIDMutex.Lock() m.newTaskId++ taskID := m.newTaskId @@ -202,14 +203,14 @@ func (m *ViewBufferManager) NewTask(f func(stop chan struct{}) error) error { f: f, } - go func() { + go utils.Safe(func() { if err := f(stop); err != nil { m.Log.Error(err) // might need an onError callback } close(notifyStopped) - }() - }() + }) + }) return nil } |