From: Olivier Dion <olivier-dion@proton.me>
Currently the mutex is only unlocked when results are available.
However, it is not unlocked when we get a timeout from the condition
variable.
* module/ice-9/threads.scm (join-thread): Use with-mutex to ensure that
the thread data mutex is always unlocked.
---
module/ice-9/threads.scm | 23 +++++++++++------------
1 file changed, 11 insertions(+), 12 deletions(-)
diff --git a/module/ice-9/threads.scm b/module/ice-9/threads.scm
index c42bd266f..8993596e4 100644
--- a/module/ice-9/threads.scm
+++ b/module/ice-9/threads.scm
@@ -186,18 +186,17 @@ terminates, unless the target @var{thread} has already terminated."
(match (thread-join-data thread)
(#f (error "foreign thread cannot be joined" thread))
((cv . mutex)
- (lock-mutex mutex)
- (let lp ()
- (cond
- ((%thread-results cv)
- => (lambda (results)
- (unlock-mutex mutex)
- (apply values results)))
- ((if timeout
- (wait-condition-variable cv mutex timeout)
- (wait-condition-variable cv mutex))
- (lp))
- (else timeoutval))))))
+ (with-mutex mutex
+ (let lp ()
+ (cond
+ ((%thread-results cv)
+ => (lambda (results)
+ (apply values results)))
+ ((if timeout
+ (wait-condition-variable cv mutex timeout)
+ (wait-condition-variable cv mutex))
+ (lp))
+ (else timeoutval)))))))
(define* (try-mutex mutex)
"Try to lock @var{mutex}. If the mutex is already locked, return
--
2.37.3