syscalls: 'with-lock-file' catches ENOSYS.
* guix/build/syscalls.scm (call-with-file-lock): Catch ENOSYS raised by 'lock-file'.
This commit is contained in:
parent
89ceb86ad4
commit
5f0cf1df71
|
@ -1084,13 +1084,24 @@ exception if it's already taken."
|
||||||
#t)
|
#t)
|
||||||
|
|
||||||
(define (call-with-file-lock file thunk)
|
(define (call-with-file-lock file thunk)
|
||||||
(let ((port (lock-file file)))
|
(let ((port (catch 'system-error
|
||||||
|
(lambda ()
|
||||||
|
(lock-file file))
|
||||||
|
(lambda args
|
||||||
|
;; When using the statically-linked Guile in the initrd,
|
||||||
|
;; 'fcntl-flock' returns ENOSYS unconditionally. Ignore
|
||||||
|
;; that error since we're typically the only process running
|
||||||
|
;; at this point.
|
||||||
|
(if (= ENOSYS (system-error-errno args))
|
||||||
|
#f
|
||||||
|
(apply throw args))))))
|
||||||
(dynamic-wind
|
(dynamic-wind
|
||||||
(lambda ()
|
(lambda ()
|
||||||
#t)
|
#t)
|
||||||
thunk
|
thunk
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(unlock-file port)))))
|
(when port
|
||||||
|
(unlock-file port))))))
|
||||||
|
|
||||||
(define-syntax-rule (with-file-lock file exp ...)
|
(define-syntax-rule (with-file-lock file exp ...)
|
||||||
"Wait to acquire a lock on FILE and evaluate EXP in that context."
|
"Wait to acquire a lock on FILE and evaluate EXP in that context."
|
||||||
|
|
Loading…
Reference in New Issue