From 4cba153259a1be1a65379326074ca6dfd1b68d4a Mon Sep 17 00:00:00 2001 From: Richard Westhaver Date: Sat, 3 May 2025 16:08:14 -0400 Subject: [PATCH] Replace queues with semaphores in broadcast-task Closes a TODO comment by lmj. Tests pass for me on sbcl linux x64 but may be worth testing on other targets/lisps. --- src/kernel/core.lisp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/kernel/core.lisp b/src/kernel/core.lisp index 644d21f..f12f01b 100644 --- a/src/kernel/core.lisp +++ b/src/kernel/core.lisp @@ -495,15 +495,14 @@ Calling `broadcast-task' from inside a worker is an error." (*kernel* (check-kernel)) (worker-count (kernel-worker-count)) (channel (make-channel)) - ;; TODO: replace queues with semaphores - (from-workers (make-queue)) - (to-workers (make-queue))) + (from-workers (bt:make-semaphore)) + (to-workers (bt:make-semaphore))) (repeat worker-count (submit-task channel (lambda () - (push-queue t from-workers) - (pop-queue to-workers) + (bt:signal-semaphore from-workers) + (bt:wait-on-semaphore to-workers) (apply function args)))) - (repeat worker-count (pop-queue from-workers)) - (repeat worker-count (push-queue t to-workers)) + (repeat worker-count (bt:wait-on-semaphore from-workers)) + (repeat worker-count (bt:signal-semaphore to-workers)) (map-into (make-array worker-count) (lambda () (receive-result channel))))) (defun track-exit ()