Commit message (Collapse) | Author | Age | Files | Lines | |
---|---|---|---|---|---|
* | widgets/terminal: fix damage race condition | Simon Ser | 2019-05-19 | 1 | -1/+12 |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Terminal.damage is accessed when drawing and when invalidating the widget. For this reason we need to protect it with a mutex. This seems to fix various damage issues I've been experiencing (where some regions of the terminal weren't correctly repainted). Race detector trace: Read at 0x00c0000c6670 by main goroutine: git.sr.ht/~sircmpwn/aerc/widgets.(*Terminal).Draw() /home/simon/src/aerc/widgets/terminal.go:292 +0x191 git.sr.ht/~sircmpwn/aerc/lib/ui.(*Grid).Draw() /home/simon/src/aerc/lib/ui/grid.go:117 +0x575 git.sr.ht/~sircmpwn/aerc/lib/ui.(*Grid).Draw() /home/simon/src/aerc/lib/ui/grid.go:117 +0x575 git.sr.ht/~sircmpwn/aerc/widgets.(*MessageViewer).Draw() /home/simon/src/aerc/widgets/msgviewer.go:231 +0x253 git.sr.ht/~sircmpwn/aerc/lib/ui.(*TabContent).Draw() /home/simon/src/aerc/lib/ui/tab.go:124 +0x12e git.sr.ht/~sircmpwn/aerc/lib/ui.(*Grid).Draw() /home/simon/src/aerc/lib/ui/grid.go:117 +0x575 git.sr.ht/~sircmpwn/aerc/widgets.(*Aerc).Draw() /home/simon/src/aerc/widgets/aerc.go:95 +0x5a git.sr.ht/~sircmpwn/aerc/lib/ui.(*UI).Tick() /home/simon/src/aerc/lib/ui/ui.go:93 +0x1dd main.main() /home/simon/src/aerc/aerc.go:105 +0x539 Previous write at 0x00c0000c6670 by goroutine 37: git.sr.ht/~sircmpwn/aerc/widgets.(*Terminal).onDamage-fm() /home/simon/src/aerc/widgets/terminal.go:429 +0x131 git.sr.ht/~sircmpwn/go-libvterm._go_handle_damage() /home/simon/go/pkg/mod/git.sr.ht/~sircmpwn/go-libvterm@v0.0.0-20190421201021-3184f6f13687/vterm.go:481 +0xf9 git.sr.ht/~sircmpwn/go-libvterm._cgoexpwrap_5e22200b58b7__go_handle_damage() _cgo_gotypes.go:731 +0x58 runtime.call32() /usr/lib/go/src/runtime/asm_amd64.s:519 +0x3a git.sr.ht/~sircmpwn/go-libvterm.(*VTerm).Write.func1() /home/simon/go/pkg/mod/git.sr.ht/~sircmpwn/go-libvterm@v0.0.0-20190421201021-3184f6f13687/vterm.go:329 +0x9d git.sr.ht/~sircmpwn/go-libvterm.(*VTerm).Write() /home/simon/go/pkg/mod/git.sr.ht/~sircmpwn/go-libvterm@v0.0.0-20190421201021-3184f6f13687/vterm.go:329 +0x7f git.sr.ht/~sircmpwn/aerc/widgets.NewTerminal.func1() /home/simon/src/aerc/widgets/terminal.go:131 +0x18c Goroutine 37 (running) created at: git.sr.ht/~sircmpwn/aerc/widgets.NewTerminal() /home/simon/src/aerc/widgets/terminal.go:121 +0x23f git.sr.ht/~sircmpwn/aerc/widgets.NewMessageViewer() /home/simon/src/aerc/widgets/msgviewer.go:147 +0xfbe git.sr.ht/~sircmpwn/aerc/commands/account.ViewMessage() /home/simon/src/aerc/commands/account/view-message.go:26 +0x4a4 git.sr.ht/~sircmpwn/aerc/commands.(*Commands).ExecuteCommand() /home/simon/src/aerc/commands/commands.go:47 +0x1f0 main.main.func1() /home/simon/src/aerc/aerc.go:76 +0x205 git.sr.ht/~sircmpwn/aerc/widgets.(*Aerc).BeginExCommand.func1() /home/simon/src/aerc/widgets/aerc.go:262 +0x89 git.sr.ht/~sircmpwn/aerc/widgets.(*ExLine).Event() /home/simon/src/aerc/widgets/exline.go:47 +0x222 git.sr.ht/~sircmpwn/aerc/widgets.(*Aerc).Event() /home/simon/src/aerc/widgets/aerc.go:133 +0x83c git.sr.ht/~sircmpwn/aerc/widgets.(*Aerc).simulate() /home/simon/src/aerc/widgets/aerc.go:126 +0x12a git.sr.ht/~sircmpwn/aerc/widgets.(*Aerc).Event() /home/simon/src/aerc/widgets/aerc.go:148 +0x766 git.sr.ht/~sircmpwn/aerc/lib/ui.(*UI).Tick() /home/simon/src/aerc/lib/ui/ui.go:86 +0x11b main.main() /home/simon/src/aerc/aerc.go:105 +0x539 | ||||
* | s/aerc2/aerc/g | Drew DeVault | 2019-05-17 | 1 | -1/+1 |
| | |||||
* | Implement :{next,prev}-field in compose view | Drew DeVault | 2019-05-12 | 1 | -0/+3 |
| | |||||
* | "Press any key to close" for completed processes | Drew DeVault | 2019-05-11 | 1 | -0/+6 |
| | |||||
* | lib/ui: introduce Invalidatable | Simon Ser | 2019-04-27 | 1 | -21/+15 |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Many Drawable implementations have their own Invalidate and OnInvalidate functions, with an unexported onInvalidate field. However OnInvalidate and Invalidate are usually not called in the same goroutine. This results in a race on this field, e.g.: Read at 0x00c000094748 by goroutine 7: git.sr.ht/~sircmpwn/aerc2/widgets.NewDirectoryList.func1() /home/simon/src/aerc2/widgets/dirlist.go:85 +0x56 git.sr.ht/~sircmpwn/aerc2/widgets.(*Spinner).Start.func1() /home/simon/src/aerc2/widgets/spinner.go:93 +0x1bb Previous write at 0x00c000094748 by main goroutine: [failed to restore the stack] Goroutine 7 (running) created at: git.sr.ht/~sircmpwn/aerc2/widgets.(*Spinner).Start() /home/simon/src/aerc2/widgets/spinner.go:46 +0x8f git.sr.ht/~sircmpwn/aerc2/widgets.NewDirectoryList() /home/simon/src/aerc2/widgets/dirlist.go:37 +0x286 git.sr.ht/~sircmpwn/aerc2/widgets.NewAccountView() /home/simon/src/aerc2/widgets/account.go:50 +0x5ca git.sr.ht/~sircmpwn/aerc2/widgets.NewAerc() /home/simon/src/aerc2/widgets/aerc.go:60 +0x800 main.main() /home/simon/src/aerc2/aerc.go:65 +0x33e To fix this, introduce a new type, Invalidatable, which protects the field. Unfortunately the Drawable must be passed to the callback function in Invalidate, so we still need to re-implement this in each Invalidatable user. | ||||
* | Re-render terminal on invalidate | Drew DeVault | 2019-04-15 | 1 | -4/+13 |
| | |||||
* | Clear damage on each terminal.Draw call | Drew DeVault | 2019-04-05 | 1 | -0/+2 |
| | |||||
* | Fix wrong row due to typo | Tom Lebreux | 2019-04-05 | 1 | -1/+1 |
| | | | | Signed-off-by: Tom Lebreux <tomlebreux@cock.li> | ||||
* | Fix crash on command not found | Drew DeVault | 2019-03-30 | 1 | -37/+42 |
| | |||||
* | Implement :pipe | Drew DeVault | 2019-03-30 | 1 | -6/+14 |
| | |||||
* | Expire status errors on input | Drew DeVault | 2019-03-21 | 1 | -6/+8 |
| | |||||
* | term: don't mess with cursor when unfocused | Drew DeVault | 2019-03-21 | 1 | -6/+15 |
| | |||||
* | Enable alt screen on built-in terminal | Drew DeVault | 2019-03-21 | 1 | -0/+1 |
| | |||||
* | Make terminal closure thread safe | Drew DeVault | 2019-03-21 | 1 | -1/+9 |
| | |||||
* | Use GetCursorPos instead of stored position | Drew DeVault | 2019-03-21 | 1 | -1/+4 |
| | |||||
* | Skip writes if term is closed | Drew DeVault | 2019-03-21 | 1 | -1/+1 |
| | |||||
* | Improve cursor handling in embedded terminal | Drew DeVault | 2019-03-21 | 1 | -8/+19 |
| | |||||
* | Fix cursor handling in embedded terminal | Drew DeVault | 2019-03-21 | 1 | -14/+8 |
| | |||||
* | Forward key events to child terminal | Drew DeVault | 2019-03-21 | 1 | -1/+135 |
| | |||||
* | moar colors | Drew DeVault | 2019-03-17 | 1 | -4/+10 |
| | |||||
* | s/:term-close/:close/g | Drew DeVault | 2019-03-17 | 1 | -1/+0 |
| | |||||
* | Wrap Terminal in TermHost | Drew DeVault | 2019-03-17 | 1 | -1/+1 |
| | |||||
* | Add :term-close | Drew DeVault | 2019-03-17 | 1 | -12/+30 |
| | |||||
* | Handle terminal title, login shell | Drew DeVault | 2019-03-17 | 1 | -0/+13 |
| | |||||
* | Fix terminal colors; wait until tty size is known | Drew DeVault | 2019-03-17 | 1 | -21/+75 |
| | |||||
* | Add basic terminal widget | Drew DeVault | 2019-03-17 | 1 | -0/+179 |