Skip to content

Commit

Permalink
Merge pull request jesseduffield#148 from jesseduffield/147_child_pro…
Browse files Browse the repository at this point in the history
…cesses

ensure the current task is stopped before exit
  • Loading branch information
jesseduffield authored Sep 7, 2019
2 parents a14e640 + 3f28a97 commit 54609a5
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 3 deletions.
5 changes: 4 additions & 1 deletion pkg/gui/gui.go
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ func NewGui(log *logrus.Entry, dockerCommand *commands.DockerCommand, oSCommand
Config: config,
Tr: tr,
statusManager: &statusManager{},
T: tasks.NewTaskManager(log),
T: tasks.NewTaskManager(log, tr),
ErrorChan: errorChan,
CyclableViews: cyclableViews,
}
Expand Down Expand Up @@ -247,6 +247,9 @@ func (gui *Gui) goEvery(interval time.Duration, function func() error) {

// Run setup the gui with keybindings and start the mainloop
func (gui *Gui) Run() error {
// closing our task manager which in turn closes the current task if there is any, so we aren't leaving processes lying around after closing lazydocker
defer gui.T.Close()

g, err := gocui.NewGui(gocui.OutputNormal, OverlappingEdges)
if err != nil {
return err
Expand Down
2 changes: 2 additions & 0 deletions pkg/i18n/english.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ type TranslationSet struct {
UnattachableContainerError string
CannotAttachStoppedContainerError string
CannotAccessDockerSocketError string
CannotKillChildError string

Donate string
Cancel string
Expand Down Expand Up @@ -110,6 +111,7 @@ func englishSet() TranslationSet {
UnattachableContainerError: "Container does not support attaching. You must either run the service with the '-it' flag or use `stdin_open: true, tty: true` in the docker-compose.yml file",
CannotAttachStoppedContainerError: "You cannot attach to a stopped container, you need to start it first (which you can actually do with the 'r' key) (yes I'm too lazy to do this automatically for you) (pretty cool that I get to communicate one-on-one with you in the form of an error message though)",
CannotAccessDockerSocketError: "Can't access docker socket at: unix:///var/run/docker.sock\nRun lazydocker as root or read https://docs.docker.com/install/linux/linux-postinstall/",
CannotKillChildError: "Waited three seconds for child process to stop. There may be an orphan process that continues to run on your system.",

Donate: "Donate",
Confirm: "Confirm",
Expand Down
36 changes: 34 additions & 2 deletions pkg/tasks/tasks.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package tasks

import (
"fmt"
"sync"
"time"

"github.com/jesseduffield/lazydocker/pkg/i18n"
"github.com/sirupsen/logrus"
)

Expand All @@ -13,19 +15,43 @@ type TaskManager struct {
waitingMutex sync.Mutex
taskIDMutex sync.Mutex
Log *logrus.Entry
Tr *i18n.TranslationSet
waitingTaskAlerts chan struct{}
newTaskId int
}

type Task struct {
stop chan struct{}
stopped bool
stopMutex sync.Mutex
notifyStopped chan struct{}
Log *logrus.Entry
f func(chan struct{})
}

func NewTaskManager(log *logrus.Entry) *TaskManager {
return &TaskManager{Log: log}
func NewTaskManager(log *logrus.Entry, translationSet *i18n.TranslationSet) *TaskManager {
return &TaskManager{Log: log, Tr: translationSet}
}

// Close closes the task manager, killing whatever task may currently be running
func (t *TaskManager) Close() {
if t.currentTask == nil {
return
}

c := make(chan struct{}, 1)

go func() {
t.currentTask.Stop()
c <- struct{}{}
}()

select {
case <-c:
return
case <-time.After(3 * time.Second):
fmt.Println(t.Tr.CannotKillChildError)
}
}

func (t *TaskManager) NewTask(f func(stop chan struct{})) error {
Expand Down Expand Up @@ -68,10 +94,16 @@ func (t *TaskManager) NewTask(f func(stop chan struct{})) error {
}

func (t *Task) Stop() {
t.stopMutex.Lock()
defer t.stopMutex.Unlock()
if t.stopped {
return
}
close(t.stop)
t.Log.Info("closed stop channel, waiting for notifyStopped message")
<-t.notifyStopped
t.Log.Info("received notifystopped message")
t.stopped = true
return
}

Expand Down

0 comments on commit 54609a5

Please sign in to comment.