Remove without-interrupts from runtime/random.scm.
authorMatt Birkholz <puck@birchwood-abbey.net>
Fri, 19 Jun 2015 17:51:15 +0000 (10:51 -0700)
committerMatt Birkholz <puck@birchwood-abbey.net>
Mon, 6 Jul 2015 05:45:45 +0000 (22:45 -0700)
Use a mutex to serialize access to the default random state.  Serial
access to other random states is still the responsibility of the user.

src/runtime/random.scm

index 6fbcc33f716598b4be8279eda80569ca680a3863..94bbc8b3e9b948b95d2166154fa8ebb09c69d2f1 100644 (file)
@@ -52,8 +52,16 @@ USA.
 (define-integrable b 4294967291 #|(- (expt 2 32) 5)|#)
 (define-integrable b. 4294967291. #|(exact->inexact b)|#)
 
+(define-integrable (with-random-state-lock state thunk)
+  (if (eq? state default-random-source)
+      (with-thread-mutex-lock default-random-source-mutex
+       (lambda ()
+         (without-interruption thunk)))
+      (thunk)))
+
 (define (flo:random-element state)
-  (let ((mask ((ucode-primitive set-interrupt-enables!) interrupt-mask/gc-ok)))
+  (with-random-state-lock state
+   (lambda ()
     (let ((index (random-state-index state))
          (vector (random-state-vector state)))
       (let ((element (flo:vector-ref vector index)))
@@ -75,8 +83,7 @@ USA.
                                   (if (fix:= (fix:+ index 1) r)
                                       0
                                       (fix:+ index 1))))
-       ((ucode-primitive set-interrupt-enables!) mask)
-       element))))
+       element)))))
 
 (define-integrable (int:random-element state)
   (flo:truncate->exact (flo:random-element state)))
@@ -357,7 +364,7 @@ USA.
       result)))
 
 (define (copy-random-state! source target)
-  (without-interrupts
+  (with-random-state-lock source
    (lambda ()
      (set-random-state-index! target (random-state-index source))
      (set-random-state-borrow! target (random-state-borrow source))
@@ -387,6 +394,7 @@ USA.
 (define flimit.)
 (define flimit)
 (define default-random-source)
+(define default-random-source-mutex)
 (define random-integer)
 (define random-real)
 
@@ -398,6 +406,7 @@ USA.
              (loop (flo:/ x 2.)))))
   (set! flimit (flo:truncate->exact flimit.))
   (set! default-random-source (simple-random-state))
+  (set! default-random-source-mutex (make-thread-mutex))
   (set! random-integer (random-source-make-integers default-random-source))
   (set! random-real (random-source-make-reals default-random-source))
   unspecific)