aercmsg: add AercFuncMsg and QueueFunc

Introduce AercFuncMsg and QueueFunc. These are used in combination to
queue a function to be run in the main goroutine. This can be used to
prevent data races in delayed function calls (ie from debounce

Signed-off-by: Tim Culverhouse <>
Acked-by: Robin Jarry <>
Tim Culverhouse 5 months ago committed by Robin Jarry
parent 556f346f96
commit 7016c6f86a

@ -247,6 +247,8 @@ func main() {
switch event := event.(type) {
case tcell.Event:
case *libui.AercFuncMsg:
case types.WorkerMessage:

@ -13,12 +13,22 @@ const (
var MsgChannel = make(chan AercMsg, 50)
type AercFuncMsg struct {
Func func()
// QueueRedraw sends a nil message into the MsgChannel. Nothing will handle this
// message, but a redraw will occur if the UI is marked as invalid
func QueueRedraw() {
MsgChannel <- nil
// QueueFunc queues a function to be called in the main goroutine. This can be
// used to prevent race conditions from delayed functions
func QueueFunc(fn func()) {
MsgChannel <- &AercFuncMsg{Func: fn}
// dirty is the dirty state of the UI. Any value other than 0 means the UI is in
// a dirty state. Dirty should only be accessed via atomic operations to
// maintain thread safety