diff options
author | Tim Culverhouse <tim@timculverhouse.com> | 2022-09-29 07:02:58 -0500 |
---|---|---|
committer | Robin Jarry <robin@jarry.cc> | 2022-09-29 20:09:17 +0200 |
commit | ea58e76332cbe854ab3b812678bbf68165795908 (patch) | |
tree | 53c4626923734bfb05fafe84b7616bbaa7a29e10 | |
parent | 7701f22bf035c8321a8b148befa10ddd2f8b7044 (diff) | |
download | aerc-ea58e76332cbe854ab3b812678bbf68165795908.tar.gz |
worker: do not lock while callbacks are running
Commit 716ade896871 ("worker: lock access to callback maps") introduced
locks to the worker callback maps. The locks also locked the processing
of the callback, which had the unintended side effect of deadlocking the
worker if any callbacks attempted to post a new action or message.
Refactor the locks to only lock the worker while accessing the maps.
Fixes: 716ade896871 ("worker: lock access to callback maps")
Signed-off-by: Tim Culverhouse <tim@timculverhouse.com>
Acked-by: Robin Jarry <robin@jarry.cc>
-rw-r--r-- | worker/types/worker.go | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/worker/types/worker.go b/worker/types/worker.go index 61b96dae..ee2f9a32 100644 --- a/worker/types/worker.go +++ b/worker/types/worker.go @@ -87,13 +87,16 @@ func (worker *Worker) ProcessMessage(msg WorkerMessage) WorkerMessage { } if inResponseTo := msg.InResponseTo(); inResponseTo != nil { worker.Lock() - if f, ok := worker.actionCallbacks[inResponseTo.getId()]; ok { + f, ok := worker.actionCallbacks[inResponseTo.getId()] + worker.Unlock() + if ok { f(msg) if _, ok := msg.(*Done); ok { + worker.Lock() delete(worker.actionCallbacks, inResponseTo.getId()) + worker.Unlock() } } - worker.Unlock() } return msg } @@ -106,13 +109,16 @@ func (worker *Worker) ProcessAction(msg WorkerMessage) WorkerMessage { } if inResponseTo := msg.InResponseTo(); inResponseTo != nil { worker.Lock() - if f, ok := worker.messageCallbacks[inResponseTo.getId()]; ok { + f, ok := worker.messageCallbacks[inResponseTo.getId()] + worker.Unlock() + if ok { f(msg) if _, ok := msg.(*Done); ok { + worker.Lock() delete(worker.messageCallbacks, inResponseTo.getId()) + worker.Unlock() } } - worker.Unlock() } return msg } |