From 2781f1a4b8e324cf122a6d0cdb7dfa4e8b31ca72 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 19 Nov 2009 23:39:31 +0000 Subject: [PATCH] fix use of multiple values in futures svn: r16907 --- src/mzscheme/src/future.c | 36 ++++++ src/mzscheme/src/future.h | 7 +- src/mzscheme/src/gen-jit-ts.ss | 9 +- src/mzscheme/src/jit_ts.c | 6 +- src/mzscheme/src/jit_ts_def.c | 10 ++ src/mzscheme/src/jit_ts_future_glue.c | 171 +++++++++++++++---------- src/mzscheme/src/jit_ts_protos.h | 39 +++--- src/mzscheme/src/jit_ts_runtime_glue.c | 29 +++++ src/mzscheme/src/mzmark.c | 2 + src/mzscheme/src/mzmarksrc.c | 1 + 10 files changed, 220 insertions(+), 90 deletions(-) diff --git a/src/mzscheme/src/future.c b/src/mzscheme/src/future.c index dfa6130a00..fce07075ca 100644 --- a/src/mzscheme/src/future.c +++ b/src/mzscheme/src/future.c @@ -84,6 +84,7 @@ static void *g_signal_handle = NULL; static struct NewGC *g_shared_GC; static future_t *g_future_queue = NULL; static future_t *g_future_waiting_atomic = NULL; +static Scheme_Object *g_thread_skeleton; int g_next_futureid = 0; pthread_t g_rt_threadid = 0; @@ -104,6 +105,7 @@ static future_t **g_current_ft; static Scheme_Object ***g_scheme_current_runstack; static Scheme_Object ***g_scheme_current_runstack_start; static void **g_jit_future_storage; +static Scheme_Object **g_current_thread; static int *gc_counter_ptr; THREAD_LOCAL_DECL(static int worker_gc_counter); @@ -340,6 +342,11 @@ void futures_init(void) are all place-specific. */ gc_counter_ptr = &scheme_did_gc_count; g_shared_GC = GC; + + /* Make enough of a thread record to deal with multiple values. */ + g_thread_skeleton = (Scheme_Object *)MALLOC_ONE_TAGGED(Scheme_Thread); + g_thread_skeleton->type = scheme_thread_type; + pthread_create(&threadid, &attr, worker_thread_future_loop, &i); sema_wait(&ready_sema); @@ -347,6 +354,7 @@ void futures_init(void) scheme_register_static(g_scheme_current_runstack, sizeof(void*)); scheme_register_static(g_scheme_current_runstack_start, sizeof(void*)); scheme_register_static(g_jit_future_storage, 2 * sizeof(void*)); + scheme_register_static(g_current_thread, sizeof(void*)); g_pool_threads[i] = threadid; } @@ -382,6 +390,9 @@ static void end_gc_not_ok(future_t *ft, int with_lock) ft->runstack - ft->runstack_start, ft->runstack_size); } + + /* FIXME: clear scheme_current_thread->ku.multiple.array ? */ + if (with_lock) pthread_mutex_lock(&gc_ok_m); --gc_not_ok; @@ -724,6 +735,7 @@ void *worker_thread_future_loop(void *arg) scheme_init_os_thread(); GC = g_shared_GC; + scheme_current_thread = g_thread_skeleton; //Set processor affinity /*pthread_mutex_lock(&g_future_queue_mutex); @@ -753,6 +765,7 @@ void *worker_thread_future_loop(void *arg) g_scheme_current_runstack = &scheme_current_runstack; g_scheme_current_runstack_start = &scheme_current_runstack_start; g_jit_future_storage = &jit_future_storage[0]; + g_current_thread = &scheme_current_thread; sema_signal(&ready_sema); wait_for_work: @@ -952,8 +965,31 @@ void *rtcall_alloc_void_pvoid(void (*f)()) END_XFORM_SKIP; } +static void receive_special_result(future_t *f, Scheme_Object *retval) +{ + if (SAME_OBJ(retval, SCHEME_MULTIPLE_VALUES)) { + Scheme_Thread *p = scheme_current_thread; + + p->ku.multiple.array = f->multiple_array; + p->ku.multiple.count = f->multiple_count; + f->multiple_array = NULL; + } +} + #include "jit_ts_future_glue.c" +static void send_special_result(future_t *f, Scheme_Object *retval) +{ + if (SAME_OBJ(retval, SCHEME_MULTIPLE_VALUES)) { + Scheme_Thread *p = scheme_current_thread; + + f->multiple_array = p->ku.multiple.array; + f->multiple_count = p->ku.multiple.count; + if (SAME_OBJ(p->ku.multiple.array, p->values_buffer)) + p->values_buffer = NULL; + } +} + //Does the work of actually invoking a primitive on behalf of a //future. This function is always invoked on the main (runtime) //thread. diff --git a/src/mzscheme/src/future.h b/src/mzscheme/src/future.h index 774b7043c9..f7fb0c6eb6 100644 --- a/src/mzscheme/src/future.h +++ b/src/mzscheme/src/future.h @@ -72,18 +72,23 @@ typedef struct future_t { Scheme_Bucket *arg_b0; int arg_i0; long arg_l0; + size_t arg_z0; Scheme_Native_Closure_Data *arg_n0; Scheme_Object *arg_s1; Scheme_Object **arg_S1; int arg_i1; long arg_l1; - Scheme_Object **arg_s2; + Scheme_Object *arg_s2; Scheme_Object **arg_S2; int arg_i2; Scheme_Object *retval_s; + void *retval_p; /* use only with conservative GC */ MZ_MARK_STACK_TYPE retval_m; + Scheme_Object **multiple_array; + int multiple_count; + Scheme_Object *retval; struct future_t *prev; struct future_t *next; diff --git a/src/mzscheme/src/gen-jit-ts.ss b/src/mzscheme/src/gen-jit-ts.ss index b11dc24e51..428c41881c 100644 --- a/src/mzscheme/src/gen-jit-ts.ss +++ b/src/mzscheme/src/gen-jit-ts.ss @@ -8,8 +8,10 @@ [(#\b) "Scheme_Bucket*"] [(#\n) "Scheme_Native_Closure_Data*"] [(#\m) "MZ_MARK_STACK_TYPE"] + [(#\p) "void*"] [(#\i) "int"] [(#\l) "long"] + [(#\z) "size_t"] [(#\v) "void"] [else (error 'char->type "unknown: ~e" c)])) @@ -77,7 +79,8 @@ future_do_runtimecall((void*)f, 0); future = current_ft; @(if (string=? result-type "void") "" @string-append{retval = @|fretval|;}) - @(if (string=? result-type "void") "" @string-append{@|fretval| = NULL;}) + @(if (string=? result-type "void") "" @string-append{@|fretval| = 0;}) + @(if (string=? result-type "Scheme_Object*") @string-append{receive_special_result(future, retval);} "") @(if (string=? result-type "void") "" "return retval;") END_XFORM_SKIP; } @@ -104,6 +107,7 @@ @string-append{future->arg_@|(string t)|@|(number->string i)|}) ", ")); @(if (string=? result-type "void") "" @string-append{future->retval_@(substring ts (sub1 (string-length ts))) = retval;}) + @(if (string=? result-type "Scheme_Object*") @string-append{send_special_result(future, retval);} "") break; } }) @@ -144,7 +148,8 @@ S_s s_v iSi_s - siS_v)) + siS_v + z_p)) (with-output-to-file "jit_ts_def.c" #:exists 'replace diff --git a/src/mzscheme/src/jit_ts.c b/src/mzscheme/src/jit_ts.c index e7c08b5c8b..6d96530909 100644 --- a/src/mzscheme/src/jit_ts.c +++ b/src/mzscheme/src/jit_ts.c @@ -9,6 +9,8 @@ v = void b = Scheme_Bucket* n = Scheme_Native_Closure_Data* + p = void*, CGC only + z = size_t m = MZ_MARK_STACK_TYPE */ define_ts_siS_s(_scheme_apply_multi_from_native) @@ -34,8 +36,8 @@ define_ts_l_s(make_ivector) define_ts_l_s(make_vector) #endif #ifdef JIT_PRECISE_GC -define_ts_l_s(GC_malloc_one_small_dirty_tagged) -define_ts_l_s(GC_malloc_one_small_tagged) +define_ts_z_p(GC_malloc_one_small_dirty_tagged) +define_ts_z_p(GC_malloc_one_small_tagged) #endif define_ts_n_s(scheme_make_native_closure) define_ts_n_s(scheme_make_native_case_closure) diff --git a/src/mzscheme/src/jit_ts_def.c b/src/mzscheme/src/jit_ts_def.c index 4add12c66d..2d98325f88 100644 --- a/src/mzscheme/src/jit_ts_def.c +++ b/src/mzscheme/src/jit_ts_def.c @@ -188,3 +188,13 @@ static void ts_ ## id(Scheme_Object* g40, int g41, Scheme_Object** g42) \ id(g40, g41, g42); \ END_XFORM_SKIP; \ } +#define define_ts_z_p(id) \ +static void* ts_ ## id(size_t g43) \ +{ \ + START_XFORM_SKIP; \ + if (scheme_use_rtcall) \ + return scheme_rtcall_z_p(id, g43); \ + else \ + return id(g43); \ + END_XFORM_SKIP; \ +} diff --git a/src/mzscheme/src/jit_ts_future_glue.c b/src/mzscheme/src/jit_ts_future_glue.c index 894f3cd735..1d152a76b3 100644 --- a/src/mzscheme/src/jit_ts_future_glue.c +++ b/src/mzscheme/src/jit_ts_future_glue.c @@ -1,4 +1,4 @@ - Scheme_Object* scheme_rtcall_siS_s(prim_siS_s f, Scheme_Object* g43, int g44, Scheme_Object** g45) + Scheme_Object* scheme_rtcall_siS_s(prim_siS_s f, Scheme_Object* g44, int g45, Scheme_Object** g46) { START_XFORM_SKIP; future_t *future; @@ -7,17 +7,18 @@ future = current_ft; future->prim_protocol = SIG_siS_s; future->prim_func = f; - future->arg_s0 = g43; - future->arg_i1 = g44; - future->arg_S2 = g45; + future->arg_s0 = g44; + future->arg_i1 = g45; + future->arg_S2 = g46; future_do_runtimecall((void*)f, 0); future = current_ft; retval = future->retval_s; - future->retval_s = NULL; + future->retval_s = 0; + receive_special_result(future, retval); return retval; END_XFORM_SKIP; } - Scheme_Object* scheme_rtcall_iSs_s(prim_iSs_s f, int g46, Scheme_Object** g47, Scheme_Object* g48) + Scheme_Object* scheme_rtcall_iSs_s(prim_iSs_s f, int g47, Scheme_Object** g48, Scheme_Object* g49) { START_XFORM_SKIP; future_t *future; @@ -26,17 +27,18 @@ future = current_ft; future->prim_protocol = SIG_iSs_s; future->prim_func = f; - future->arg_i0 = g46; - future->arg_S1 = g47; - future->arg_s2 = g48; + future->arg_i0 = g47; + future->arg_S1 = g48; + future->arg_s2 = g49; future_do_runtimecall((void*)f, 0); future = current_ft; retval = future->retval_s; - future->retval_s = NULL; + future->retval_s = 0; + receive_special_result(future, retval); return retval; END_XFORM_SKIP; } - Scheme_Object* scheme_rtcall_s_s(prim_s_s f, Scheme_Object* g49) + Scheme_Object* scheme_rtcall_s_s(prim_s_s f, Scheme_Object* g50) { START_XFORM_SKIP; future_t *future; @@ -45,15 +47,16 @@ future = current_ft; future->prim_protocol = SIG_s_s; future->prim_func = f; - future->arg_s0 = g49; + future->arg_s0 = g50; future_do_runtimecall((void*)f, 0); future = current_ft; retval = future->retval_s; - future->retval_s = NULL; + future->retval_s = 0; + receive_special_result(future, retval); return retval; END_XFORM_SKIP; } - Scheme_Object* scheme_rtcall_n_s(prim_n_s f, Scheme_Native_Closure_Data* g50) + Scheme_Object* scheme_rtcall_n_s(prim_n_s f, Scheme_Native_Closure_Data* g51) { START_XFORM_SKIP; future_t *future; @@ -62,11 +65,12 @@ future = current_ft; future->prim_protocol = SIG_n_s; future->prim_func = f; - future->arg_n0 = g50; + future->arg_n0 = g51; future_do_runtimecall((void*)f, 0); future = current_ft; retval = future->retval_s; - future->retval_s = NULL; + future->retval_s = 0; + receive_special_result(future, retval); return retval; END_XFORM_SKIP; } @@ -83,11 +87,12 @@ future_do_runtimecall((void*)f, 0); future = current_ft; retval = future->retval_s; - future->retval_s = NULL; + future->retval_s = 0; + receive_special_result(future, retval); return retval; END_XFORM_SKIP; } - Scheme_Object* scheme_rtcall_ss_s(prim_ss_s f, Scheme_Object* g51, Scheme_Object* g52) + Scheme_Object* scheme_rtcall_ss_s(prim_ss_s f, Scheme_Object* g52, Scheme_Object* g53) { START_XFORM_SKIP; future_t *future; @@ -96,16 +101,17 @@ future = current_ft; future->prim_protocol = SIG_ss_s; future->prim_func = f; - future->arg_s0 = g51; - future->arg_s1 = g52; + future->arg_s0 = g52; + future->arg_s1 = g53; future_do_runtimecall((void*)f, 0); future = current_ft; retval = future->retval_s; - future->retval_s = NULL; + future->retval_s = 0; + receive_special_result(future, retval); return retval; END_XFORM_SKIP; } - MZ_MARK_STACK_TYPE scheme_rtcall_ss_m(prim_ss_m f, Scheme_Object* g53, Scheme_Object* g54) + MZ_MARK_STACK_TYPE scheme_rtcall_ss_m(prim_ss_m f, Scheme_Object* g54, Scheme_Object* g55) { START_XFORM_SKIP; future_t *future; @@ -114,16 +120,17 @@ future = current_ft; future->prim_protocol = SIG_ss_m; future->prim_func = f; - future->arg_s0 = g53; - future->arg_s1 = g54; + future->arg_s0 = g54; + future->arg_s1 = g55; future_do_runtimecall((void*)f, 0); future = current_ft; retval = future->retval_m; - future->retval_m = NULL; + future->retval_m = 0; + return retval; END_XFORM_SKIP; } - Scheme_Object* scheme_rtcall_Sl_s(prim_Sl_s f, Scheme_Object** g55, long g56) + Scheme_Object* scheme_rtcall_Sl_s(prim_Sl_s f, Scheme_Object** g56, long g57) { START_XFORM_SKIP; future_t *future; @@ -132,16 +139,17 @@ future = current_ft; future->prim_protocol = SIG_Sl_s; future->prim_func = f; - future->arg_S0 = g55; - future->arg_l1 = g56; + future->arg_S0 = g56; + future->arg_l1 = g57; future_do_runtimecall((void*)f, 0); future = current_ft; retval = future->retval_s; - future->retval_s = NULL; + future->retval_s = 0; + receive_special_result(future, retval); return retval; END_XFORM_SKIP; } - Scheme_Object* scheme_rtcall_l_s(prim_l_s f, long g57) + Scheme_Object* scheme_rtcall_l_s(prim_l_s f, long g58) { START_XFORM_SKIP; future_t *future; @@ -150,15 +158,16 @@ future = current_ft; future->prim_protocol = SIG_l_s; future->prim_func = f; - future->arg_l0 = g57; + future->arg_l0 = g58; future_do_runtimecall((void*)f, 0); future = current_ft; retval = future->retval_s; - future->retval_s = NULL; + future->retval_s = 0; + receive_special_result(future, retval); return retval; END_XFORM_SKIP; } - void scheme_rtcall_bsi_v(prim_bsi_v f, Scheme_Bucket* g58, Scheme_Object* g59, int g60) + void scheme_rtcall_bsi_v(prim_bsi_v f, Scheme_Bucket* g59, Scheme_Object* g60, int g61) { START_XFORM_SKIP; future_t *future; @@ -167,17 +176,18 @@ future = current_ft; future->prim_protocol = SIG_bsi_v; future->prim_func = f; - future->arg_b0 = g58; - future->arg_s1 = g59; - future->arg_i2 = g60; + future->arg_b0 = g59; + future->arg_s1 = g60; + future->arg_i2 = g61; future_do_runtimecall((void*)f, 0); future = current_ft; + END_XFORM_SKIP; } - void scheme_rtcall_iiS_v(prim_iiS_v f, int g61, int g62, Scheme_Object** g63) + void scheme_rtcall_iiS_v(prim_iiS_v f, int g62, int g63, Scheme_Object** g64) { START_XFORM_SKIP; future_t *future; @@ -186,17 +196,18 @@ future = current_ft; future->prim_protocol = SIG_iiS_v; future->prim_func = f; - future->arg_i0 = g61; - future->arg_i1 = g62; - future->arg_S2 = g63; + future->arg_i0 = g62; + future->arg_i1 = g63; + future->arg_S2 = g64; future_do_runtimecall((void*)f, 0); future = current_ft; + END_XFORM_SKIP; } - void scheme_rtcall_ss_v(prim_ss_v f, Scheme_Object* g64, Scheme_Object* g65) + void scheme_rtcall_ss_v(prim_ss_v f, Scheme_Object* g65, Scheme_Object* g66) { START_XFORM_SKIP; future_t *future; @@ -205,16 +216,17 @@ future = current_ft; future->prim_protocol = SIG_ss_v; future->prim_func = f; - future->arg_s0 = g64; - future->arg_s1 = g65; + future->arg_s0 = g65; + future->arg_s1 = g66; future_do_runtimecall((void*)f, 0); future = current_ft; + END_XFORM_SKIP; } - void scheme_rtcall_b_v(prim_b_v f, Scheme_Bucket* g66) + void scheme_rtcall_b_v(prim_b_v f, Scheme_Bucket* g67) { START_XFORM_SKIP; future_t *future; @@ -223,15 +235,16 @@ future = current_ft; future->prim_protocol = SIG_b_v; future->prim_func = f; - future->arg_b0 = g66; + future->arg_b0 = g67; future_do_runtimecall((void*)f, 0); future = current_ft; + END_XFORM_SKIP; } - Scheme_Object* scheme_rtcall_sl_s(prim_sl_s f, Scheme_Object* g67, long g68) + Scheme_Object* scheme_rtcall_sl_s(prim_sl_s f, Scheme_Object* g68, long g69) { START_XFORM_SKIP; future_t *future; @@ -240,16 +253,17 @@ future = current_ft; future->prim_protocol = SIG_sl_s; future->prim_func = f; - future->arg_s0 = g67; - future->arg_l1 = g68; + future->arg_s0 = g68; + future->arg_l1 = g69; future_do_runtimecall((void*)f, 0); future = current_ft; retval = future->retval_s; - future->retval_s = NULL; + future->retval_s = 0; + receive_special_result(future, retval); return retval; END_XFORM_SKIP; } - Scheme_Object* scheme_rtcall_iS_s(prim_iS_s f, int g69, Scheme_Object** g70) + Scheme_Object* scheme_rtcall_iS_s(prim_iS_s f, int g70, Scheme_Object** g71) { START_XFORM_SKIP; future_t *future; @@ -258,16 +272,17 @@ future = current_ft; future->prim_protocol = SIG_iS_s; future->prim_func = f; - future->arg_i0 = g69; - future->arg_S1 = g70; + future->arg_i0 = g70; + future->arg_S1 = g71; future_do_runtimecall((void*)f, 0); future = current_ft; retval = future->retval_s; - future->retval_s = NULL; + future->retval_s = 0; + receive_special_result(future, retval); return retval; END_XFORM_SKIP; } - Scheme_Object* scheme_rtcall_S_s(prim_S_s f, Scheme_Object** g71) + Scheme_Object* scheme_rtcall_S_s(prim_S_s f, Scheme_Object** g72) { START_XFORM_SKIP; future_t *future; @@ -276,15 +291,16 @@ future = current_ft; future->prim_protocol = SIG_S_s; future->prim_func = f; - future->arg_S0 = g71; + future->arg_S0 = g72; future_do_runtimecall((void*)f, 0); future = current_ft; retval = future->retval_s; - future->retval_s = NULL; + future->retval_s = 0; + receive_special_result(future, retval); return retval; END_XFORM_SKIP; } - void scheme_rtcall_s_v(prim_s_v f, Scheme_Object* g72) + void scheme_rtcall_s_v(prim_s_v f, Scheme_Object* g73) { START_XFORM_SKIP; future_t *future; @@ -293,15 +309,16 @@ future = current_ft; future->prim_protocol = SIG_s_v; future->prim_func = f; - future->arg_s0 = g72; + future->arg_s0 = g73; future_do_runtimecall((void*)f, 0); future = current_ft; + END_XFORM_SKIP; } - Scheme_Object* scheme_rtcall_iSi_s(prim_iSi_s f, int g73, Scheme_Object** g74, int g75) + Scheme_Object* scheme_rtcall_iSi_s(prim_iSi_s f, int g74, Scheme_Object** g75, int g76) { START_XFORM_SKIP; future_t *future; @@ -310,17 +327,18 @@ future = current_ft; future->prim_protocol = SIG_iSi_s; future->prim_func = f; - future->arg_i0 = g73; - future->arg_S1 = g74; - future->arg_i2 = g75; + future->arg_i0 = g74; + future->arg_S1 = g75; + future->arg_i2 = g76; future_do_runtimecall((void*)f, 0); future = current_ft; retval = future->retval_s; - future->retval_s = NULL; + future->retval_s = 0; + receive_special_result(future, retval); return retval; END_XFORM_SKIP; } - void scheme_rtcall_siS_v(prim_siS_v f, Scheme_Object* g76, int g77, Scheme_Object** g78) + void scheme_rtcall_siS_v(prim_siS_v f, Scheme_Object* g77, int g78, Scheme_Object** g79) { START_XFORM_SKIP; future_t *future; @@ -329,13 +347,32 @@ future = current_ft; future->prim_protocol = SIG_siS_v; future->prim_func = f; - future->arg_s0 = g76; - future->arg_i1 = g77; - future->arg_S2 = g78; + future->arg_s0 = g77; + future->arg_i1 = g78; + future->arg_S2 = g79; future_do_runtimecall((void*)f, 0); future = current_ft; + + END_XFORM_SKIP; +} + void* scheme_rtcall_z_p(prim_z_p f, size_t g80) +{ + START_XFORM_SKIP; + future_t *future; + void* retval; + + future = current_ft; + future->prim_protocol = SIG_z_p; + future->prim_func = f; + future->arg_z0 = g80; + future_do_runtimecall((void*)f, 0); + future = current_ft; + retval = future->retval_p; + future->retval_p = 0; + + return retval; END_XFORM_SKIP; } diff --git a/src/mzscheme/src/jit_ts_protos.h b/src/mzscheme/src/jit_ts_protos.h index f065f74c5d..136bfdad9c 100644 --- a/src/mzscheme/src/jit_ts_protos.h +++ b/src/mzscheme/src/jit_ts_protos.h @@ -1,57 +1,60 @@ #define SIG_siS_s 5 typedef Scheme_Object* (*prim_siS_s)(Scheme_Object*, int, Scheme_Object**); -Scheme_Object* scheme_rtcall_siS_s(prim_siS_s f, Scheme_Object* g115, int g116, Scheme_Object** g117); +Scheme_Object* scheme_rtcall_siS_s(prim_siS_s f, Scheme_Object* g118, int g119, Scheme_Object** g120); #define SIG_iSs_s 6 typedef Scheme_Object* (*prim_iSs_s)(int, Scheme_Object**, Scheme_Object*); -Scheme_Object* scheme_rtcall_iSs_s(prim_iSs_s f, int g118, Scheme_Object** g119, Scheme_Object* g120); +Scheme_Object* scheme_rtcall_iSs_s(prim_iSs_s f, int g121, Scheme_Object** g122, Scheme_Object* g123); #define SIG_s_s 7 typedef Scheme_Object* (*prim_s_s)(Scheme_Object*); -Scheme_Object* scheme_rtcall_s_s(prim_s_s f, Scheme_Object* g121); +Scheme_Object* scheme_rtcall_s_s(prim_s_s f, Scheme_Object* g124); #define SIG_n_s 8 typedef Scheme_Object* (*prim_n_s)(Scheme_Native_Closure_Data*); -Scheme_Object* scheme_rtcall_n_s(prim_n_s f, Scheme_Native_Closure_Data* g122); +Scheme_Object* scheme_rtcall_n_s(prim_n_s f, Scheme_Native_Closure_Data* g125); #define SIG__s 9 typedef Scheme_Object* (*prim__s)(); Scheme_Object* scheme_rtcall__s(prim__s f ); #define SIG_ss_s 10 typedef Scheme_Object* (*prim_ss_s)(Scheme_Object*, Scheme_Object*); -Scheme_Object* scheme_rtcall_ss_s(prim_ss_s f, Scheme_Object* g123, Scheme_Object* g124); +Scheme_Object* scheme_rtcall_ss_s(prim_ss_s f, Scheme_Object* g126, Scheme_Object* g127); #define SIG_ss_m 11 typedef MZ_MARK_STACK_TYPE (*prim_ss_m)(Scheme_Object*, Scheme_Object*); -MZ_MARK_STACK_TYPE scheme_rtcall_ss_m(prim_ss_m f, Scheme_Object* g125, Scheme_Object* g126); +MZ_MARK_STACK_TYPE scheme_rtcall_ss_m(prim_ss_m f, Scheme_Object* g128, Scheme_Object* g129); #define SIG_Sl_s 12 typedef Scheme_Object* (*prim_Sl_s)(Scheme_Object**, long); -Scheme_Object* scheme_rtcall_Sl_s(prim_Sl_s f, Scheme_Object** g127, long g128); +Scheme_Object* scheme_rtcall_Sl_s(prim_Sl_s f, Scheme_Object** g130, long g131); #define SIG_l_s 13 typedef Scheme_Object* (*prim_l_s)(long); -Scheme_Object* scheme_rtcall_l_s(prim_l_s f, long g129); +Scheme_Object* scheme_rtcall_l_s(prim_l_s f, long g132); #define SIG_bsi_v 14 typedef void (*prim_bsi_v)(Scheme_Bucket*, Scheme_Object*, int); -void scheme_rtcall_bsi_v(prim_bsi_v f, Scheme_Bucket* g130, Scheme_Object* g131, int g132); +void scheme_rtcall_bsi_v(prim_bsi_v f, Scheme_Bucket* g133, Scheme_Object* g134, int g135); #define SIG_iiS_v 15 typedef void (*prim_iiS_v)(int, int, Scheme_Object**); -void scheme_rtcall_iiS_v(prim_iiS_v f, int g133, int g134, Scheme_Object** g135); +void scheme_rtcall_iiS_v(prim_iiS_v f, int g136, int g137, Scheme_Object** g138); #define SIG_ss_v 16 typedef void (*prim_ss_v)(Scheme_Object*, Scheme_Object*); -void scheme_rtcall_ss_v(prim_ss_v f, Scheme_Object* g136, Scheme_Object* g137); +void scheme_rtcall_ss_v(prim_ss_v f, Scheme_Object* g139, Scheme_Object* g140); #define SIG_b_v 17 typedef void (*prim_b_v)(Scheme_Bucket*); -void scheme_rtcall_b_v(prim_b_v f, Scheme_Bucket* g138); +void scheme_rtcall_b_v(prim_b_v f, Scheme_Bucket* g141); #define SIG_sl_s 18 typedef Scheme_Object* (*prim_sl_s)(Scheme_Object*, long); -Scheme_Object* scheme_rtcall_sl_s(prim_sl_s f, Scheme_Object* g139, long g140); +Scheme_Object* scheme_rtcall_sl_s(prim_sl_s f, Scheme_Object* g142, long g143); #define SIG_iS_s 19 typedef Scheme_Object* (*prim_iS_s)(int, Scheme_Object**); -Scheme_Object* scheme_rtcall_iS_s(prim_iS_s f, int g141, Scheme_Object** g142); +Scheme_Object* scheme_rtcall_iS_s(prim_iS_s f, int g144, Scheme_Object** g145); #define SIG_S_s 20 typedef Scheme_Object* (*prim_S_s)(Scheme_Object**); -Scheme_Object* scheme_rtcall_S_s(prim_S_s f, Scheme_Object** g143); +Scheme_Object* scheme_rtcall_S_s(prim_S_s f, Scheme_Object** g146); #define SIG_s_v 21 typedef void (*prim_s_v)(Scheme_Object*); -void scheme_rtcall_s_v(prim_s_v f, Scheme_Object* g144); +void scheme_rtcall_s_v(prim_s_v f, Scheme_Object* g147); #define SIG_iSi_s 22 typedef Scheme_Object* (*prim_iSi_s)(int, Scheme_Object**, int); -Scheme_Object* scheme_rtcall_iSi_s(prim_iSi_s f, int g145, Scheme_Object** g146, int g147); +Scheme_Object* scheme_rtcall_iSi_s(prim_iSi_s f, int g148, Scheme_Object** g149, int g150); #define SIG_siS_v 23 typedef void (*prim_siS_v)(Scheme_Object*, int, Scheme_Object**); -void scheme_rtcall_siS_v(prim_siS_v f, Scheme_Object* g148, int g149, Scheme_Object** g150); +void scheme_rtcall_siS_v(prim_siS_v f, Scheme_Object* g151, int g152, Scheme_Object** g153); +#define SIG_z_p 24 +typedef void* (*prim_z_p)(size_t); +void* scheme_rtcall_z_p(prim_z_p f, size_t g154); diff --git a/src/mzscheme/src/jit_ts_runtime_glue.c b/src/mzscheme/src/jit_ts_runtime_glue.c index 9ea93cabc5..6fa9143cb1 100644 --- a/src/mzscheme/src/jit_ts_runtime_glue.c +++ b/src/mzscheme/src/jit_ts_runtime_glue.c @@ -5,6 +5,7 @@ case SIG_siS_s: retval = f(future->arg_s0, future->arg_i1, future->arg_S2); future->retval_s = retval; + send_special_result(future, retval); break; } case SIG_iSs_s: @@ -14,6 +15,7 @@ case SIG_iSs_s: retval = f(future->arg_i0, future->arg_S1, future->arg_s2); future->retval_s = retval; + send_special_result(future, retval); break; } case SIG_s_s: @@ -23,6 +25,7 @@ case SIG_s_s: retval = f(future->arg_s0); future->retval_s = retval; + send_special_result(future, retval); break; } case SIG_n_s: @@ -32,6 +35,7 @@ case SIG_n_s: retval = f(future->arg_n0); future->retval_s = retval; + send_special_result(future, retval); break; } case SIG__s: @@ -41,6 +45,7 @@ case SIG__s: retval = f(); future->retval_s = retval; + send_special_result(future, retval); break; } case SIG_ss_s: @@ -50,6 +55,7 @@ case SIG_ss_s: retval = f(future->arg_s0, future->arg_s1); future->retval_s = retval; + send_special_result(future, retval); break; } case SIG_ss_m: @@ -59,6 +65,7 @@ case SIG_ss_m: retval = f(future->arg_s0, future->arg_s1); future->retval_m = retval; + break; } case SIG_Sl_s: @@ -68,6 +75,7 @@ case SIG_Sl_s: retval = f(future->arg_S0, future->arg_l1); future->retval_s = retval; + send_special_result(future, retval); break; } case SIG_l_s: @@ -77,6 +85,7 @@ case SIG_l_s: retval = f(future->arg_l0); future->retval_s = retval; + send_special_result(future, retval); break; } case SIG_bsi_v: @@ -86,6 +95,7 @@ case SIG_bsi_v: f(future->arg_b0, future->arg_s1, future->arg_i2); + break; } case SIG_iiS_v: @@ -95,6 +105,7 @@ case SIG_iiS_v: f(future->arg_i0, future->arg_i1, future->arg_S2); + break; } case SIG_ss_v: @@ -104,6 +115,7 @@ case SIG_ss_v: f(future->arg_s0, future->arg_s1); + break; } case SIG_b_v: @@ -113,6 +125,7 @@ case SIG_b_v: f(future->arg_b0); + break; } case SIG_sl_s: @@ -122,6 +135,7 @@ case SIG_sl_s: retval = f(future->arg_s0, future->arg_l1); future->retval_s = retval; + send_special_result(future, retval); break; } case SIG_iS_s: @@ -131,6 +145,7 @@ case SIG_iS_s: retval = f(future->arg_i0, future->arg_S1); future->retval_s = retval; + send_special_result(future, retval); break; } case SIG_S_s: @@ -140,6 +155,7 @@ case SIG_S_s: retval = f(future->arg_S0); future->retval_s = retval; + send_special_result(future, retval); break; } case SIG_s_v: @@ -149,6 +165,7 @@ case SIG_s_v: f(future->arg_s0); + break; } case SIG_iSi_s: @@ -158,6 +175,7 @@ case SIG_iSi_s: retval = f(future->arg_i0, future->arg_S1, future->arg_i2); future->retval_s = retval; + send_special_result(future, retval); break; } case SIG_siS_v: @@ -167,5 +185,16 @@ case SIG_siS_v: f(future->arg_s0, future->arg_i1, future->arg_S2); + + break; + } +case SIG_z_p: + { + prim_z_p f = (prim_z_p)future->prim_func; + void* retval; + retval = + f(future->arg_z0); + future->retval_p = retval; + break; } diff --git a/src/mzscheme/src/mzmark.c b/src/mzscheme/src/mzmark.c index c680d4c4e2..39d52678fe 100644 --- a/src/mzscheme/src/mzmark.c +++ b/src/mzscheme/src/mzmark.c @@ -5433,6 +5433,7 @@ static int future_MARK(void *p) { gcMARK(f->arg_S2); gcMARK(f->retval_s); gcMARK(f->retval); + gcMARK(f->multiple_array); gcMARK(f->prev); gcMARK(f->next); gcMARK(f->next_waiting_atomic); @@ -5455,6 +5456,7 @@ static int future_FIXUP(void *p) { gcFIXUP(f->arg_S2); gcFIXUP(f->retval_s); gcFIXUP(f->retval); + gcFIXUP(f->multiple_array); gcFIXUP(f->prev); gcFIXUP(f->next); gcFIXUP(f->next_waiting_atomic); diff --git a/src/mzscheme/src/mzmarksrc.c b/src/mzscheme/src/mzmarksrc.c index ebde7f7438..b772e4f527 100644 --- a/src/mzscheme/src/mzmarksrc.c +++ b/src/mzscheme/src/mzmarksrc.c @@ -2236,6 +2236,7 @@ future { gcMARK(f->arg_S2); gcMARK(f->retval_s); gcMARK(f->retval); + gcMARK(f->multiple_array); gcMARK(f->prev); gcMARK(f->next); gcMARK(f->next_waiting_atomic);