From 1f212951017d4336ef3976610d5c77f31481ce62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20F=2E=20Wittenberger?= Date: Wed, 1 Feb 2017 19:46:38 +0100 Subject: [PATCH] Handle possible EINTR in file-lock, file-lock/blocking and file-unlock. Signed-off-by: Peter Bex Conflicts: NEWS --- NEWS | 8 ++++++++ posixunix.scm | 26 +++++++++++++++++--------- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/NEWS b/NEWS index 7cbe20d..46636a9 100644 --- a/NEWS +++ b/NEWS @@ -58,6 +58,14 @@ - Removed support for (define-syntax (foo e r c) ...), which was undocumented and not officially supported anyway. + +4.12.1 + +- Core Libraries + - Unit "posix": If file-lock, file-lock/blocking or file-unlock are + interrupted by a signal, we now retry (thanks to Joerg Wittenberger). + + 4.12.0 - Security fixes diff --git a/posixunix.scm b/posixunix.scm index 7e9a21d..1cc6f1e 100644 --- a/posixunix.scm +++ b/posixunix.scm @@ -1242,16 +1242,22 @@ EOF (posix-error #:file-error loc msg (##sys#slot lock 1) (##sys#slot lock 2) (##sys#slot lock 3)) ) (set! file-lock (lambda (port . args) - (let ([lock (setup port args 'file-lock)]) - (if (fx< (##core#inline "C_flock_lock" port) 0) - (err "cannot lock file" lock 'file-lock) - lock) ) ) ) + (let loop () + (let ((lock (setup port args 'file-lock))) + (if (fx< (##core#inline "C_flock_lock" port) 0) + (select _errno + ((_eintr) (##sys#dispatch-interrupt loop)) + (else (err "cannot lock file" lock 'file-lock))) + lock) )) ) ) (set! file-lock/blocking (lambda (port . args) - (let ([lock (setup port args 'file-lock/blocking)]) - (if (fx< (##core#inline "C_flock_lockw" port) 0) - (err "cannot lock file" lock 'file-lock/blocking) - lock) ) ) ) + (let loop () + (let ((lock (setup port args 'file-lock/blocking))) + (if (fx< (##core#inline "C_flock_lockw" port) 0) + (select _errno + ((_eintr) (##sys#dispatch-interrupt loop)) + (else (err "cannot lock file" lock 'file-lock/blocking))) + lock) )) ) ) (set! file-test-lock (lambda (port . args) (let ([lock (setup port args 'file-test-lock)]) @@ -1263,7 +1269,9 @@ EOF (##sys#check-structure lock 'lock 'file-unlock) (##core#inline "C_flock_setup" _f_unlck (##sys#slot lock 2) (##sys#slot lock 3)) (when (fx< (##core#inline "C_flock_lock" (##sys#slot lock 1)) 0) - (posix-error #:file-error 'file-unlock "cannot unlock file" lock) ) ) ) + (select _errno + ((_eintr) (##sys#dispatch-interrupt (lambda () (file-unlock lock)))) + (else (posix-error #:file-error 'file-unlock "cannot unlock file" lock)))) ) ) ;;; FIFOs: -- 2.1.4