summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2016-11-05 09:27:30 +0100
committerAndy Wingo <wingo@pobox.com>2016-11-05 10:30:54 +0100
commitb197a6a5afcb9a96a820005099bb226a2c760210 (patch)
treea8f3e26d9215627d321fb0e44cd913e24948149b
parentf1b7eaaa1a78f2a0b1be1f35ec583349322db02e (diff)
downloadguile-b197a6a5afcb9a96a820005099bb226a2c760210.tar.gz
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.
-rw-r--r--module/srfi/srfi-18.scm32
1 files changed, 17 insertions, 15 deletions
diff --git a/module/srfi/srfi-18.scm b/module/srfi/srfi-18.scm
index a19d5ba63..85ca91efb 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.