aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Culverhouse <tim@timculverhouse.com>2022-09-29 07:02:58 -0500
committerRobin Jarry <robin@jarry.cc>2022-09-29 20:09:17 +0200
commitea58e76332cbe854ab3b812678bbf68165795908 (patch)
tree53c4626923734bfb05fafe84b7616bbaa7a29e10
parent7701f22bf035c8321a8b148befa10ddd2f8b7044 (diff)
downloadaerc-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.go14
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
}