Fixed deadlock with message listener

This commit is contained in:
Leon Mika 2024-05-01 21:45:47 +10:00
parent b2ddc62555
commit 29d425c77e
3 changed files with 11 additions and 8 deletions

View file

@ -187,7 +187,7 @@ func main() {
jobsController.SetMessageSender(p.Send)
scriptController.Init()
scriptController.SetMessageSender(p.Send)
commandController.SetMessageSender(p.Send)
go commandController.StartMessageSender(p.Send)
log.Println("launching")
if err := p.Start(); err != nil {

View file

@ -22,9 +22,9 @@ type CommandController struct {
uclInst *ucl.Inst
historyProvider IterProvider
commandList *CommandList
msgSender func(tea.Msg)
lookupExtensions []CommandLookupExtension
completionProvider CommandCompletionProvider
msgChan chan tea.Msg
}
func NewCommandController(historyProvider IterProvider) *CommandController {
@ -32,6 +32,7 @@ func NewCommandController(historyProvider IterProvider) *CommandController {
historyProvider: historyProvider,
commandList: nil,
lookupExtensions: nil,
msgChan: make(chan tea.Msg),
}
cc.uclInst = ucl.New(
ucl.WithOut(ucl.LineHandler(cc.printLine)),
@ -45,8 +46,10 @@ func (c *CommandController) AddCommands(ctx *CommandList) {
c.commandList = ctx
}
func (c *CommandController) SetMessageSender(msg func(tea.Msg)) {
c.msgSender = msg
func (c *CommandController) StartMessageSender(msgSender func(tea.Msg)) {
for msg := range c.msgChan {
msgSender(msg)
}
}
func (c *CommandController) AddCommandLookupExtension(ext CommandLookupExtension) {
@ -183,8 +186,10 @@ func (c *CommandController) cmdInvoker(ctx context.Context, name string, args uc
}
func (c *CommandController) printLine(s string) {
if c.msgSender != nil {
c.msgSender(events.StatusMsg(s))
select {
case c.msgChan <- events.StatusMsg(s):
default:
log.Println(s)
}
}

View file

@ -170,8 +170,6 @@ func NewModel(
itemType = models.NullItemType
case args.HasSwitch("TO"):
itemType = models.ExprValueItemType
default:
return events.Error(errors.New("unrecognised item type"))
}
return wc.SetAttributeValue(dtv.SelectedItemIndex(), itemType, fieldName)