From: Olivier Dion <olivier-d...@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