futures: Fix potential deadlock.
authorLudovic Courtès <ludo@gnu.org>
Thu, 16 Dec 2010 16:37:02 +0000 (17:37 +0100)
committerLudovic Courtès <ludo@gnu.org>
Thu, 16 Dec 2010 22:45:24 +0000 (23:45 +0100)
* module/ice-9/futures.scm (process-futures): Fix potential deadlock,
  whereby %FUTURES-MUTEX would be acquired *after* FUTURE's mutex.

module/ice-9/futures.scm

index 1e9247d..0f1b0f1 100644 (file)
@@ -101,7 +101,8 @@ touched."
       (() (loop))
       ((future _ ...)
        (lock-mutex (future-mutex future))
-       (or (future-done? future)
+       (or (and (future-done? future)
+                (unlock-mutex (future-mutex future)))
            (begin
              ;; Do the actual work.
              (unregister-future! future)
@@ -115,9 +116,9 @@ touched."
              (lock-mutex (future-mutex future))
              (or (future-done? future)            ; lost the race?
                  (process-future! future))
+             (unlock-mutex (future-mutex future))
 
              (lock-mutex %futures-mutex)))
-       (unlock-mutex (future-mutex future))
        (loop)))))
 
 (define (touch future)