diff options
author | Andy Wingo <wingo@pobox.com> | 2016-11-05 09:27:30 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2016-11-05 10:30:54 +0100 |
commit | b197a6a5afcb9a96a820005099bb226a2c760210 (patch) | |
tree | a8f3e26d9215627d321fb0e44cd913e24948149b /module/srfi/srfi-18.scm | |
parent | f1b7eaaa1a78f2a0b1be1f35ec583349322db02e (diff) | |
download | guile-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.
Diffstat (limited to 'module/srfi/srfi-18.scm')
-rw-r--r-- | module/srfi/srfi-18.scm | 32 |
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. |