From d062212ebc3142864a68d94cded2fbeffcf15597 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Fri, 4 Aug 2017 10:13:52 -0600 Subject: [PATCH] future: fix problem related to continuation marks Capturing, restoring, then capturing again a future's continuation marks did not work right. --- racket/src/racket/src/fun.c | 2 +- racket/src/racket/src/future.c | 3 ++- racket/src/racket/src/jit.c | 12 +++--------- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/racket/src/racket/src/fun.c b/racket/src/racket/src/fun.c index b8e6e9130c..2ecc783a79 100644 --- a/racket/src/racket/src/fun.c +++ b/racket/src/racket/src/fun.c @@ -9025,7 +9025,7 @@ Scheme_Lightweight_Continuation *scheme_capture_lightweight_continuation(Scheme_ seg = p->cont_mark_stack_segments[i >> SCHEME_LOG_MARK_SEGMENT_SIZE]; pos = i & SCHEME_MARK_SEGMENT_MASK; - memcpy(cont_mark_stack_slice + i, seg + pos, sizeof(Scheme_Cont_Mark)); + memcpy(cont_mark_stack_slice + j, seg + pos, sizeof(Scheme_Cont_Mark)); } return lw; diff --git a/racket/src/racket/src/future.c b/racket/src/racket/src/future.c index cf328b9050..0daf222ea8 100644 --- a/racket/src/racket/src/future.c +++ b/racket/src/racket/src/future.c @@ -2369,6 +2369,8 @@ void *worker_thread_future_loop(void *arg) Scheme_Object *rator, **argv; int argc; + scheme_fill_lwc_start(); + if (ft->suspended_lw_stack) { Scheme_Lightweight_Continuation *lc; @@ -2387,7 +2389,6 @@ void *worker_thread_future_loop(void *arg) argv = NULL; } - scheme_fill_lwc_start(); jitcode = ((Scheme_Native_Closure *)rator)->code->start_code; v = scheme_call_as_lightweight_continuation(jitcode, rator, argc, argv); if (SAME_OBJ(v, SCHEME_TAIL_CALL_WAITING)) diff --git a/racket/src/racket/src/jit.c b/racket/src/racket/src/jit.c index 2eae1f3ac6..860b13072a 100644 --- a/racket/src/racket/src/jit.c +++ b/racket/src/racket/src/jit.c @@ -132,16 +132,13 @@ THREAD_LOCAL_DECL(Scheme_Current_LWC *scheme_current_lwc); static Scheme_Object *do_call_as_lwc(Scheme_Native_Proc *code, void *data, int argc, - Scheme_Object **argv, - MZ_MARK_STACK_TYPE cont_mark_stack_start) + Scheme_Object **argv) { #ifdef JIT_THREAD_LOCAL # define THDLOC &BOTTOM_VARIABLE #else # define THDLOC NULL #endif - scheme_current_lwc->runstack_start = MZ_RUNSTACK; - scheme_current_lwc->cont_mark_stack_start = cont_mark_stack_start; return sjc.native_starter_code(data, argc, argv, THDLOC, code, (void **)&scheme_current_lwc->stack_start); #undef THDLOC } @@ -151,16 +148,13 @@ Scheme_Object *scheme_call_as_lightweight_continuation(Scheme_Native_Proc *code, int argc, Scheme_Object **argv) { - return do_call_as_lwc(code, data, argc, argv, MZ_CONT_MARK_STACK); + return do_call_as_lwc(code, data, argc, argv); } #ifdef MZ_USE_FUTURES Scheme_Object *scheme_force_value_same_mark_as_lightweight_continuation(Scheme_Object *v) { - /* Providing 0 as cont_mark_stack_start is the "same_mark" part: - it preserves any continuation marks that are in place as part - of the continuation. */ - return do_call_as_lwc(sjc.force_value_same_mark_code, NULL, 0, NULL, 0); + return do_call_as_lwc(sjc.force_value_same_mark_code, NULL, 0, NULL); } #endif