aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2024-07-16 11:01:57 +0200
committerLudovic Courtès <ludo@gnu.org>2024-08-21 00:52:38 +0200
commit96cd163c14e68c66c6a4cf0b18261fc454f8c1ba (patch)
tree9678f821b0dfc3b7a105b5503e1f9abfca03985e
parentb87b96b9c7a2c5f34c34d69559cdee236ca50ec2 (diff)
downloadguix-96cd163c14e68c66c6a4cf0b18261fc454f8c1ba.tar
guix-96cd163c14e68c66c6a4cf0b18261fc454f8c1ba.tar.gz
syscalls: Add ‘mode’ parameter to ‘lock-file’.
* guix/build/syscalls.scm (lock-file): Add ‘mode’ parameter and honor it. * tests/syscalls.scm ("lock-file + unlock-file"): New test. Change-Id: I113fb4a8b35dd8782b9c0991574e39a4b4393333
-rw-r--r--guix/build/syscalls.scm14
-rw-r--r--tests/syscalls.scm13
2 files changed, 22 insertions, 5 deletions
diff --git a/guix/build/syscalls.scm b/guix/build/syscalls.scm
index 39bcffd516..2c20edf058 100644
--- a/guix/build/syscalls.scm
+++ b/guix/build/syscalls.scm
@@ -1398,14 +1398,18 @@ exception if it's already taken."
;; Presumably we got EAGAIN or so.
(throw 'flock-error err))))))
-(define* (lock-file file #:key (wait? #t))
- "Wait and acquire an exclusive lock on FILE. Return an open port."
- (let ((port (open-file file "w0")))
- (fcntl-flock port 'write-lock #:wait? wait?)
+(define* (lock-file file #:optional (mode "w0")
+ #:key (wait? #t))
+ "Wait and acquire an exclusive lock on FILE. Return an open port according
+to MODE."
+ (let ((port (open-file file mode)))
+ (fcntl-flock port
+ (if (output-port? port) 'write-lock 'read-lock)
+ #:wait? wait?)
port))
(define (unlock-file port)
- "Unlock PORT, a port returned by 'lock-file'."
+ "Unlock PORT, a port returned by 'lock-file', and close it."
(fcntl-flock port 'unlock)
(close-port port)
#t)
diff --git a/tests/syscalls.scm b/tests/syscalls.scm
index 7cf67c060d..13f4f11721 100644
--- a/tests/syscalls.scm
+++ b/tests/syscalls.scm
@@ -383,6 +383,19 @@
(close-port file)
result)))))))))
+(test-equal "lock-file + unlock-file"
+ 'hello
+ (call-with-temporary-directory
+ (lambda (directory)
+ (let* ((file (in-vicinity directory "lock"))
+ (out (lock-file file #:wait? #f)))
+ (display "hello" out)
+ (unlock-file out)
+ (let* ((in (lock-file file "r0"))
+ (content (read in)))
+ (unlock-file in)
+ content)))))
+
(test-equal "set-thread-name"
"Syscall Test"
(let ((name (thread-name)))