diff options
author | Koni Marti <koni.marti@gmail.com> | 2022-05-25 11:16:13 +0200 |
---|---|---|
committer | Robin Jarry <robin@jarry.cc> | 2022-05-25 22:18:26 +0200 |
commit | 57bd9e318b7073692627bd72f067633609e26883 (patch) | |
tree | 5eccd6edbf2c1db01121a34884624bbce6fa8faf | |
parent | 0cc992b4e3ed26c0f9f8dab94024985c87853a64 (diff) | |
download | aerc-57bd9e318b7073692627bd72f067633609e26883.zip |
terminal: fix deadlock with finer-grained locking
Commit 1bac87e80414 ("terminal: fix race when closing a terminal") fixed
a race in Terminal.Draw by using a mutex. The current locking of the
entire Draw function could create a deadlock, however, since this
function itself might call Terminal.Close which is protected by the same
mutex. A finer-grained locking solves both the race and deadlock
problem.
Signed-off-by: Koni Marti <koni.marti@gmail.com>
Acked-by: Robin Jarry <robin@jarry.cc>
-rw-r--r-- | widgets/terminal.go | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/widgets/terminal.go b/widgets/terminal.go index 1d4c1df..e499e3e 100644 --- a/widgets/terminal.go +++ b/widgets/terminal.go @@ -232,9 +232,6 @@ func (term *Terminal) invalidate() { } func (term *Terminal) Draw(ctx *ui.Context) { - term.closeMutex.Lock() - defer term.closeMutex.Unlock() - if term.destroyed { return } @@ -252,7 +249,15 @@ func (term *Terminal) Draw(ctx *ui.Context) { if term.pty == nil { term.vterm.SetSize(ctx.Height(), ctx.Width()) + + term.closeMutex.Lock() + if term.cmd == nil { + term.closeMutex.Unlock() + return + } tty, err := pty.StartWithAttrs(term.cmd, &winsize, &syscall.SysProcAttr{Setsid: true, Setctty: true, Ctty: 1}) + term.closeMutex.Unlock() + term.pty = tty if err != nil { term.Close(err) |