syscalls: Add 'restart-on-EINTR'.

* guix/build/syscalls.scm (call-with-restart-on-EINTR): New procedure.
  (restart-on-EINTR): New macro.
This commit is contained in:
Ludovic Courtès 2015-05-21 23:23:47 +02:00
parent 4520354282
commit ea98270443
1 changed files with 14 additions and 0 deletions

View File

@ -29,6 +29,7 @@
MS_REMOUNT MS_REMOUNT
MS_BIND MS_BIND
MS_MOVE MS_MOVE
restart-on-EINTR
mount mount
umount umount
mount-points mount-points
@ -89,6 +90,19 @@
(ref bv)))) (ref bv))))
(lambda () 0))) (lambda () 0)))
(define (call-with-restart-on-EINTR thunk)
(let loop ()
(catch 'system-error
thunk
(lambda args
(if (= (system-error-errno args) EINTR)
(loop)
(apply throw args))))))
(define-syntax-rule (restart-on-EINTR expr)
"Evaluate EXPR and restart upon EINTR. Return the value of EXPR."
(call-with-restart-on-EINTR (lambda () expr)))
(define (augment-mtab source target type options) (define (augment-mtab source target type options)
"Augment /etc/mtab with information about the given mount point." "Augment /etc/mtab with information about the given mount point."
(let ((port (open-file "/etc/mtab" "a"))) (let ((port (open-file "/etc/mtab" "a")))