From 1bcf56f5e9a81814b3f0f5b09de38bebf7f160b6 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Mon, 16 Apr 2012 13:33:50 -0600 Subject: [PATCH] fix problem with continuations and `call-in-nested-thread' Closes PR 12705 Merge to 5.3 --- collects/tests/racket/sandbox.rktl | 11 +++++++++++ collects/tests/racket/thread.rktl | 21 +++++++++++++++++++++ src/racket/src/fun.c | 2 +- src/racket/src/thread.c | 5 +++++ 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/collects/tests/racket/sandbox.rktl b/collects/tests/racket/sandbox.rktl index b19fe662ca..901944bb9c 100644 --- a/collects/tests/racket/sandbox.rktl +++ b/collects/tests/racket/sandbox.rktl @@ -602,4 +602,15 @@ r1) (test #t equal? r1 r2)) +;; ---------------------------------------- + +;; Backup test for one in "thread.rktl", since this sandbox test +;; originally exposed it: +(let () + (define sandbox (make-evaluator 'racket/base)) + (sandbox "(define result (call/cc (lambda (x) (lambda () (x 5)))))") + (sandbox "(if (procedure? result) (result) result)")) + +;; ---------------------------------------- + (report-errs) diff --git a/collects/tests/racket/thread.rktl b/collects/tests/racket/thread.rktl index 53f3956cab..57ea6d1c51 100644 --- a/collects/tests/racket/thread.rktl +++ b/collects/tests/racket/thread.rktl @@ -531,6 +531,27 @@ (arity-test call-in-nested-thread 1 2) +(test + 7 + 'nested-thread-stack-ownership-test + (let () + (define -k #f) + (call-in-nested-thread (lambda () + (call-with-continuation-barrier + (lambda () + (call-with-continuation-prompt + (lambda () + (with-continuation-mark + 'x + 'y + (let/cc k + (set! -k k) + (sync (thread (lambda () (k 5)))))))))))) + (call-in-nested-thread (lambda () + (call-with-continuation-prompt + (lambda () + (-k 7))))))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Test wait-multiple: diff --git a/src/racket/src/fun.c b/src/racket/src/fun.c index bbc1d6e6b1..92d3ff7a38 100644 --- a/src/racket/src/fun.c +++ b/src/racket/src/fun.c @@ -4729,7 +4729,7 @@ static Scheme_Cont *grab_continuation(Scheme_Thread *p, int for_prompt, int comp p->runstack_owner = owner; *owner = p; } - if (p->cont_mark_stack && !p->cont_mark_stack_owner) { + if (cont->ss.cont_mark_stack && !p->cont_mark_stack_owner) { Scheme_Thread **owner; owner = MALLOC_N(Scheme_Thread *, 1); p->cont_mark_stack_owner = owner; diff --git a/src/racket/src/thread.c b/src/racket/src/thread.c index 954baa11de..ca13532263 100644 --- a/src/racket/src/thread.c +++ b/src/racket/src/thread.c @@ -3343,6 +3343,11 @@ Scheme_Object *scheme_call_as_nested_thread(int argc, Scheme_Object *argv[], voi unschedule_in_set((Scheme_Object *)np, np->t_set_parent); + if (np->cont_mark_stack_owner + && ((*np->cont_mark_stack_owner) == np)) { + *np->cont_mark_stack_owner = NULL; + } + np->running = 0; *p->runstack_owner = p;