guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

03/03: syscalls: Use 'define-c-struct' for 'fcntl-flock'.


From: Ludovic Courtès
Subject: 03/03: syscalls: Use 'define-c-struct' for 'fcntl-flock'.
Date: Fri, 06 May 2016 11:25:48 +0000

civodul pushed a commit to branch master
in repository guix.

commit d33c8b464915fb9bbe07434116fd6f3428e8cef0
Author: Ludovic Courtès <address@hidden>
Date:   Fri May 6 13:23:54 2016 +0200

    syscalls: Use 'define-c-struct' for 'fcntl-flock'.
    
    * guix/build/syscalls.scm (%struct-flock): Use 'define-c-struct'.
    (fcntl-flock): Use 'write-flock!' and 'make-bytevector' instead of
    'make-c-struct'.
---
 guix/build/syscalls.scm |   41 ++++++++++++++++++++++++-----------------
 1 file changed, 24 insertions(+), 17 deletions(-)

diff --git a/guix/build/syscalls.scm b/guix/build/syscalls.scm
index 86723c2..48ff227 100644
--- a/guix/build/syscalls.scm
+++ b/guix/build/syscalls.scm
@@ -643,13 +643,16 @@ system to PUT-OLD."
 ;;; Advisory file locking.
 ;;;
 
-(define %struct-flock
-  ;; 'struct flock' from <fcntl.h>.
-  (list short                                     ; l_type
-        short                                     ; l_whence
-        size_t                                    ; l_start
-        size_t                                    ; l_len
-        int))                                     ; l_pid
+(define-c-struct %struct-flock                    ;<fcntl.h>
+  sizeof-flock
+  list
+  read-flock
+  write-flock!
+  (type   short)
+  (whence short)
+  (start  size_t)
+  (length size_t)
+  (pid    int))
 
 (define F_SETLKW
   ;; On Linux-based systems, this is usually 7, but not always
@@ -690,21 +693,25 @@ exception if it's already taken."
             (fileno fd-or-port)
             fd-or-port))
 
+      (define bv
+        (make-bytevector sizeof-flock))
+
+      (write-flock! bv 0
+                    (operation->int operation) SEEK_SET
+                    0 0                           ;whole file
+                    0)
+
       ;; XXX: 'fcntl' is a vararg function, but here we happily use the
       ;; standard ABI; crossing fingers.
-      (let ((err (proc fd
+      (let ((ret (proc fd
                        (if wait?
                            F_SETLKW               ; lock & wait
                            F_SETLK)               ; non-blocking attempt
-                       (make-c-struct %struct-flock
-                                      (list (operation->int operation)
-                                            SEEK_SET
-                                            0 0   ; whole file
-                                            0)))))
-        (or (zero? err)
-
-            ;; Presumably we got EAGAIN or so.
-            (throw 'flock-error (errno)))))))
+                       (bytevector->pointer bv)))
+            (err (errno)))
+        (unless (zero? ret)
+          ;; Presumably we got EAGAIN or so.
+          (throw 'flock-error err))))))
 
 
 ;;;



reply via email to

[Prev in Thread] Current Thread [Next in Thread]