Browse Source

syscalls: 'with-file-lock' re-grabs lock when reentering its dynamic extent.

* guix/build/syscalls.scm (call-with-file-lock)
(call-with-file-lock/no-wait): Initialize PORT in the 'dynamic-wind'
"in" handler.  This allows us to re-enter a captured continuation and
have the lock grabbed anew.
gn-latest-20200428
Ludovic Courtès 6 months ago
parent
commit
9a067fe7ee
No known key found for this signature in database GPG Key ID: 90B11993D9AEBB5
1 changed files with 33 additions and 31 deletions
  1. +33
    -31
      guix/build/syscalls.scm

+ 33
- 31
guix/build/syscalls.scm View File

@@ -1104,47 +1104,49 @@ exception if it's already taken."
#t)

(define (call-with-file-lock file thunk)
(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))))))
(let ((port #f))
(dynamic-wind
(lambda ()
#t)
(set! 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))))))
thunk
(lambda ()
(when port
(unlock-file port))))))

(define (call-with-file-lock/no-wait file thunk handler)
(let ((port (catch #t
(lambda ()
(lock-file file #:wait? #f))
(lambda (key . args)
(match key
('flock-error
(apply handler args)
;; No open port to the lock, so return #f.
#f)
('system-error
;; 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 (cons key args)))
#f
(apply throw key args)))
(_ (apply throw key args)))))))
(let ((port #f))
(dynamic-wind
(lambda ()
#t)
(set! port
(catch #t
(lambda ()
(lock-file file #:wait? #f))
(lambda (key . args)
(match key
('flock-error
(apply handler args)
;; No open port to the lock, so return #f.
#f)
('system-error
;; 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 (cons key args)))
#f
(apply throw key args)))
(_ (apply throw key args)))))))
thunk
(lambda ()
(when port


Loading…
Cancel
Save