guile-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Guile-commits] 13/24: Move more functionality to SRFI-18 mutex-unlock!


From: Andy Wingo
Subject: [Guile-commits] 13/24: Move more functionality to SRFI-18 mutex-unlock!
Date: Sun, 6 Nov 2016 18:00:45 +0000 (UTC)

wingo pushed a commit to branch master
in repository guile.

commit b197a6a5afcb9a96a820005099bb226a2c760210
Author: Andy Wingo <address@hidden>
Date:   Sat Nov 5 09:27:30 2016 +0100

    Move more functionality to SRFI-18 mutex-unlock!
    
    * module/srfi/srfi-18.scm (mutex-unlock!): Implement the
      ignore-unlock-errors and wait-condition-variable behavior of
      mutex-unlock! directly, without relying on Guile.
---
 module/srfi/srfi-18.scm |   32 +++++++++++++++++---------------
 1 file changed, 17 insertions(+), 15 deletions(-)

diff --git a/module/srfi/srfi-18.scm b/module/srfi/srfi-18.scm
index a19d5ba..85ca91e 100644
--- a/module/srfi/srfi-18.scm
+++ b/module/srfi/srfi-18.scm
@@ -324,21 +324,23 @@
        #t)
       (else #f)))))
 
-(define mutex-unlock!
-  (case-lambda
-    ((mutex)
-     (set-mutex-owner! mutex #f)
-     (threads:unlock-mutex (mutex-prim mutex))
-     #t)
-    ((mutex cond)
-     (set-mutex-owner! mutex #f)
-     (threads:unlock-mutex (mutex-prim mutex)
-                           (condition-variable-prim cond)))
-    ((mutex cond timeout)
-     (set-mutex-owner! mutex #f)
-     (threads:unlock-mutex (mutex-prim mutex)
-                           (condition-variable-prim cond)
-                           timeout))))
+(define %unlock-sentinel (list 'unlock))
+(define* (mutex-unlock! mutex #:optional (cond-var %unlock-sentinel)
+                        (timeout %unlock-sentinel))
+  (when (mutex-owner mutex)
+    (set-mutex-owner! mutex #f)
+    (cond
+     ((eq? cond-var %unlock-sentinel)
+      (threads:unlock-mutex (mutex-prim mutex)))
+     ((eq? timeout %unlock-sentinel)
+      (threads:wait-condition-variable (condition-variable-prim cond-var)
+                                       (mutex-prim mutex))
+      (threads:unlock-mutex (mutex-prim mutex)))
+     ((threads:wait-condition-variable (condition-variable-prim cond-var)
+                                       (mutex-prim mutex)
+                                       timeout)
+      (threads:unlock-mutex (mutex-prim mutex)))
+     (else #f))))
 
 ;; CONDITION VARIABLES
 ;; These functions are all pass-thrus to the existing Guile implementations.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]