From 66a0c2770317832988f7995358d13c7a25362c0d Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 4 Dec 2008 23:04:33 +0000 Subject: [PATCH] avoid shared mutation of break state across with-handlers procs svn: r12706 --- collects/scheme/private/more-scheme.ss | 29 +++++++++++++++----------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/collects/scheme/private/more-scheme.ss b/collects/scheme/private/more-scheme.ss index e6d89a7324..66aa55ca94 100644 --- a/collects/scheme/private/more-scheme.ss +++ b/collects/scheme/private/more-scheme.ss @@ -168,18 +168,23 @@ (check-for-break))) (define (select-handler/no-breaks e bpz l) - (cond - [(null? l) - (raise e)] - [((caar l) e) - (begin0 - ((cdar l) e) - (with-continuation-mark - break-enabled-key - bpz - (check-for-break)))] - [else - (select-handler/no-breaks e bpz (cdr l))])) + (with-continuation-mark + break-enabled-key + ;; make a fresh thread cell so that the shared one isn't mutated + (make-thread-cell #f) + (let loop ([l l]) + (cond + [(null? l) + (raise e)] + [((caar l) e) + (begin0 + ((cdar l) e) + (with-continuation-mark + break-enabled-key + bpz + (check-for-break)))] + [else + (loop (cdr l))])))) (define (select-handler/breaks-as-is e bpz l) (cond