diff --git a/worker/imap/cache.go b/worker/imap/cache.go index 62d450e..3c807c5 100644 --- a/worker/imap/cache.go +++ b/worker/imap/cache.go @@ -126,7 +126,8 @@ func (w *IMAPWorker) getCachedHeaders(msg *types.FetchMessageHeaders) []uint32 { }, nil) } if len(found) > 0 { - w.worker.PostAction(&types.FetchMessageFlags{ + // Post in a separate goroutine to prevent deadlocking + go w.worker.PostAction(&types.FetchMessageFlags{ Uids: found, }, nil) } diff --git a/worker/imap/flags.go b/worker/imap/flags.go index bda47e9..0cd0bb7 100644 --- a/worker/imap/flags.go +++ b/worker/imap/flags.go @@ -48,7 +48,8 @@ func (imapw *IMAPWorker) handleAnsweredMessages(msg *types.AnsweredMessages) { emitErr(err) return } - imapw.worker.PostAction(&types.FetchMessageHeaders{ + // Post in a separate goroutine to prevent deadlocking + go imapw.worker.PostAction(&types.FetchMessageHeaders{ Uids: msg.Uids, }, func(_msg types.WorkerMessage) { switch m := _msg.(type) { @@ -79,7 +80,8 @@ func (imapw *IMAPWorker) handleFlagMessages(msg *types.FlagMessages) { emitErr(err) return } - imapw.worker.PostAction(&types.FetchMessageHeaders{ + // Post in a separate goroutine to prevent deadlocking + go imapw.worker.PostAction(&types.FetchMessageHeaders{ Uids: msg.Uids, }, func(_msg types.WorkerMessage) { switch m := _msg.(type) { diff --git a/worker/types/worker.go b/worker/types/worker.go index 9e24798..ba396aa 100644 --- a/worker/types/worker.go +++ b/worker/types/worker.go @@ -35,6 +35,8 @@ func (worker *Worker) setId(msg WorkerMessage) { msg.setId(id) } +// PostAction posts an action to the worker. This method should not be called +// from the same goroutine that the worker runs in or deadlocks may occur func (worker *Worker) PostAction(msg WorkerMessage, cb func(msg WorkerMessage)) { worker.setId(msg) @@ -50,6 +52,8 @@ func (worker *Worker) PostAction(msg WorkerMessage, cb func(msg WorkerMessage)) } } +// PostMessage posts an message to the UI. This method should not be called +// from the same goroutine that the UI runs in or deadlocks may occur func (worker *Worker) PostMessage(msg WorkerMessage, cb func(msg WorkerMessage), ) {