From ff2c84b118b68020805eae93f71c3a8fd13ca3d9 Mon Sep 17 00:00:00 2001 From: Mark H Weaver Date: Tue, 6 Nov 2012 18:03:39 -0500 Subject: [PATCH] Futures: Avoid creating the worker pool more than once. * module/ice-9/futures.scm (%create-workers!): Check to make sure the worker pool hasn't already been created within the critical section. --- module/ice-9/futures.scm | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/module/ice-9/futures.scm b/module/ice-9/futures.scm index 0f64b5c..afdf48f 100644 --- a/module/ice-9/futures.scm +++ b/module/ice-9/futures.scm @@ -158,13 +158,19 @@ touched." (define (%create-workers!) (lock-mutex %futures-mutex) - (set! %workers - (unfold (lambda (i) (>= i %worker-count)) - (lambda (i) - (call-with-new-thread process-futures)) - 1+ - 0)) - (set! create-workers! (lambda () #t)) + ;; setting 'create-workers!' to a no-op is an optimization, but it is + ;; still possible for '%create-workers!' to be called more than once + ;; from different threads. Therefore, to avoid creating %workers more + ;; than once (and thus creating too many threads), we check to make + ;; sure %workers is empty within the critical section. + (when (null? %workers) + (set! create-workers! (lambda () #t)) + (set! %workers + (unfold (lambda (i) (>= i %worker-count)) + (lambda (i) + (call-with-new-thread process-futures)) + 1+ + 0))) (unlock-mutex %futures-mutex)) (define create-workers! -- 1.7.10.4