commit 15b856abccef75361ccd64221757c8b63ef1d441
parent be2918a6164989aba5b18b4f642501ddb8801c10
Author: Drew DeVault <sir@cmpwn.com>
Date: Thu, 21 Mar 2019 21:23:30 -0400
Make terminal closure thread safe
Diffstat:
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/widgets/terminal.go b/widgets/terminal.go
@@ -4,6 +4,7 @@ import (
gocolor "image/color"
"os"
"os/exec"
+ "sync"
"git.sr.ht/~sircmpwn/aerc2/lib/ui"
@@ -92,11 +93,12 @@ type Terminal struct {
cmd *exec.Cmd
colors map[tcell.Color]tcell.Color
ctx *ui.Context
- cursorShown bool
cursorPos vterm.Pos
+ cursorShown bool
damage []vterm.Rect
err error
focus bool
+ mutex sync.Mutex
onInvalidate func(d ui.Drawable)
pty *os.File
start chan interface{}
@@ -189,6 +191,8 @@ func (term *Terminal) flushTerminal() {
}
func (term *Terminal) Close(err error) {
+ term.mutex.Lock()
+ defer term.mutex.Unlock()
term.err = err
if term.vterm != nil {
term.vterm.Close()
@@ -229,6 +233,9 @@ func (term *Terminal) Draw(ctx *ui.Context) {
return
}
+ term.mutex.Lock()
+ defer term.mutex.Unlock()
+
winsize := pty.Winsize{
Cols: uint16(ctx.Width()),
Rows: uint16(ctx.Height()),
@@ -239,6 +246,7 @@ func (term *Terminal) Draw(ctx *ui.Context) {
tty, err := pty.StartWithSize(term.cmd, &winsize)
term.pty = tty
if err != nil {
+ term.mutex.Unlock()
term.Close(err)
return
}