From 0332386251ba001c0b0ec65fbfa1c06b826c6e47 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Tue, 14 May 2013 23:53:38 +0200 Subject: substitute-binary: Work around thread-unsafe `regexp-exec'. * guix/scripts/substitute-binary.scm (%regexp-exec-mutex): New variable. (string->uri): New procedure. (fields->alist): Wrap `regexp-exec' call in `with-mutex'. --- guix/scripts/substitute-binary.scm | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'guix/scripts') diff --git a/guix/scripts/substitute-binary.scm b/guix/scripts/substitute-binary.scm index 5965e936f9..27a43b9e3f 100755 --- a/guix/scripts/substitute-binary.scm +++ b/guix/scripts/substitute-binary.scm @@ -84,6 +84,18 @@ (define (with-atomic-file-output file proc) (lambda (key . args) (false-if-exception (delete-file template)))))) +(define %regexp-exec-mutex + ;; In Guile 2.0.9, `regexp-exec' is thread-unsafe, so work around it. + ;; See . + (make-mutex)) + +(define string->uri + (let ((real (@ (web uri) string->uri))) + (lambda (uri) + "A thread-safe `string->uri'." + (with-mutex %regexp-exec-mutex + (real uri))))) + (define (fields->alist port) "Read recutils-style record from PORT and return them as a list of key/value pairs." @@ -94,7 +106,8 @@ (define field-rx (result '())) (cond ((eof-object? line) (reverse result)) - ((regexp-exec field-rx line) + ((with-mutex %regexp-exec-mutex + (regexp-exec field-rx line)) => (lambda (match) (loop (read-line port) -- cgit v1.2.3