diff --git a/pkgs/racket-test-core/tests/racket/sync.rktl b/pkgs/racket-test-core/tests/racket/sync.rktl index 7b8d205de8..77e5b962a5 100644 --- a/pkgs/racket-test-core/tests/racket/sync.rktl +++ b/pkgs/racket-test-core/tests/racket/sync.rktl @@ -1651,6 +1651,26 @@ (sync s)) (thread-wait t)) +;; ---------------------------------------- +;; regression test to check that when a choice evt replaces a single +;; event, an already-chosen event (perhaps represented as an index) is +;; not misinterpreted later + +(for ([i (in-range 10)]) + (define ch (make-channel)) + (define v + (sync (guard-evt + (lambda () + (thread (lambda () (channel-put ch 0))) + (sync (system-idle-evt)) + (choice-evt + (wrap-evt always-evt (lambda (v) 1)) + (wrap-evt always-evt (lambda (v) 2)) + (wrap-evt always-evt (lambda (v) 3))))) + ch)) + (unless (memq v '(0 1 2 3)) + (error "bad sync result" v))) + ;; ---------------------------------------- (report-errs) diff --git a/racket/src/bc/src/thread.c b/racket/src/bc/src/thread.c index b18e6448f9..b18f98b569 100644 --- a/racket/src/bc/src/thread.c +++ b/racket/src/bc/src/thread.c @@ -6560,7 +6560,10 @@ static void set_sync_target(Syncing *syncing, int i, Scheme_Object *target, /* Inline the set (in place) */ Scheme_Object **argv; Evt **ws; - + + if (syncing->result > i+1) + syncing->result += wts->argc-1; + argv = (Scheme_Object **)splice_ptr_array((void **)evt_set->argv, evt_set->argc, (void **)wts->argv,