future fixes: continuation barrier in place, handle multiple results from a future

svn: r17019
This commit is contained in:
Matthew Flatt 2009-11-23 23:00:08 +00:00
parent 1dd2109909
commit dcf2991736
9 changed files with 176 additions and 53 deletions

View File

@ -1,7 +1,24 @@
/*
MzScheme
Copyright (c) 2006-2009 PLT Scheme Inc.
#ifndef UNIT_TEST
# include "schpriv.h"
#endif
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301 USA.
*/
#include "schpriv.h"
//This will be TRUE if primitive tracking has been enabled
//by the program
@ -27,6 +44,8 @@ typedef struct future_t {
Scheme_Object *running_sema;
Scheme_Object *orig_lambda;
Scheme_Object *retval;
int multiple_count;
Scheme_Object **multiple_array;
int no_retval;
} future_t;
@ -54,7 +73,14 @@ static Scheme_Object *touch(int argc, Scheme_Object *argv[])
ft = (future_t *)argv[0];
while (1) {
if (ft->retval) return ft->retval;
if (ft->retval) {
if (SAME_OBJ(ft->retval, SCHEME_MULTIPLE_VALUES)) {
Scheme_Thread *p = scheme_current_thread;
p->ku.multiple.array = ft->multiple_array;
p->ku.multiple.count = ft->multiple_count;
}
return ft->retval;
}
if (ft->no_retval)
scheme_signal_error("touch: future previously aborted");
@ -80,8 +106,13 @@ static Scheme_Object *touch(int argc, Scheme_Object *argv[])
GC_CAN_IGNORE Scheme_Object *retval, *proc;
proc = ft->orig_lambda;
ft->orig_lambda = NULL; /* don't hold on to proc */
retval = _scheme_apply(proc, 0, NULL);
retval = scheme_apply_multi(proc, 0, NULL);
ft->retval = retval;
if (SAME_OBJ(retval, SCHEME_MULTIPLE_VALUES)) {
ft->multiple_array = p->ku.multiple.array;
ft->multiple_count = p->ku.multiple.count;
p->ku.multiple.array = NULL;
}
scheme_post_sema(ft->running_sema);
p->error_buf = savebuf;
}
@ -123,9 +154,6 @@ void scheme_init_futures(Scheme_Env *env)
#include "future.h"
#include <stdlib.h>
#include <string.h>
#ifdef UNIT_TEST
# include "./tests/unit_test.h"
#endif
static Scheme_Object *future(int argc, Scheme_Object *argv[]);
static Scheme_Object *touch(int argc, Scheme_Object *argv[]);
@ -188,6 +216,8 @@ static void *worker_thread_future_loop(void *arg);
static void invoke_rtcall(Scheme_Future_State * volatile fs, future_t * volatile future);
static future_t *enqueue_future(Scheme_Future_State *fs, future_t *ft);;
static future_t *get_pending_future(Scheme_Future_State *fs);
static void receive_special_result(future_t *f, Scheme_Object *retval, int clear);
static void send_special_result(future_t *f, Scheme_Object *retval);
#ifdef MZ_PRECISE_GC
# define scheme_future_setjmp(newbuf) scheme_jit_setjmp((newbuf).jb)
@ -605,7 +635,8 @@ Scheme_Object *touch(int argc, Scheme_Object *argv[])
ft->status = RUNNING;
pthread_mutex_unlock(&fs->future_mutex);
retval = _scheme_apply(ft->orig_lambda, 0, NULL);
retval = scheme_apply_multi(ft->orig_lambda, 0, NULL);
send_special_result(ft, retval);
pthread_mutex_lock(&fs->future_mutex);
ft->work_completed = 1;
@ -614,6 +645,8 @@ Scheme_Object *touch(int argc, Scheme_Object *argv[])
dequeue_future(fs, ft);
pthread_mutex_unlock(&fs->future_mutex);
receive_special_result(ft, retval, 0);
return retval;
}
pthread_mutex_unlock(&fs->future_mutex);
@ -654,6 +687,8 @@ Scheme_Object *touch(int argc, Scheme_Object *argv[])
scheme_signal_error("touch: future previously aborted");
}
receive_special_result(ft, retval, 0);
return retval;
}
@ -793,18 +828,24 @@ void *worker_thread_future_loop(void *arg)
v = NULL;
} else {
v = jitcode(ft->orig_lambda, 0, NULL);
if (SAME_OBJ(v, SCHEME_TAIL_CALL_WAITING)) {
v = scheme_ts_scheme_force_value_same_mark(v);
}
}
LOG("Finished running JIT code at %p.\n", ft->code);
// Get future again, since a GC may have occurred
ft = fts->current_ft;
//Set the return val in the descriptor
pthread_mutex_lock(&fs->future_mutex);
ft->work_completed = 1;
ft->retval = v;
/* In case of multiple values: */
send_special_result(ft, v);
//Update the status
ft->status = FINISHED;
dequeue_future(fs, ft);
@ -960,28 +1001,35 @@ unsigned long scheme_rtcall_alloc_void_pvoid(const char *who, int src_type, prim
return retval;
}
static void receive_special_result(future_t *f, Scheme_Object *retval)
static void receive_special_result(future_t *f, Scheme_Object *retval, int clear)
XFORM_SKIP_PROC
/* Called in future thread */
/* Called in future or runtime thread */
{
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;
if (clear)
f->multiple_array = NULL;
} else if (SAME_OBJ(retval, SCHEME_TAIL_CALL_WAITING)) {
Scheme_Thread *p = scheme_current_thread;
p->ku.apply.tail_rator = f->tail_rator;
p->ku.apply.tail_rands = f->tail_rands;
p->ku.apply.tail_num_rands = f->num_tail_rands;
if (clear) {
f->tail_rator = NULL;
f->tail_rands = NULL;
}
}
}
#include "jit_ts_future_glue.c"
static void send_special_result(future_t *f, Scheme_Object *retval)
XFORM_SKIP_PROC
/* Called in future or runtime thread */
{
if (SAME_OBJ(retval, SCHEME_MULTIPLE_VALUES)) {
Scheme_Thread *p = scheme_current_thread;
@ -990,6 +1038,7 @@ static void send_special_result(future_t *f, Scheme_Object *retval)
f->multiple_count = p->ku.multiple.count;
if (SAME_OBJ(p->ku.multiple.array, p->values_buffer))
p->values_buffer = NULL;
p->ku.multiple.array = NULL;
} else if (SAME_OBJ(retval, SCHEME_TAIL_CALL_WAITING)) {
Scheme_Thread *p = scheme_current_thread;
@ -1019,8 +1068,11 @@ static void do_invoke_rtcall(Scheme_Future_State *fs, future_t *future)
src = future->source_of_request;
if (future->source_type == FSRC_RATOR) {
int len;
if (SCHEME_PROCP(future->arg_s0))
src = scheme_get_proc_name(future->arg_s0, &len, 1);
if (SCHEME_PROCP(future->arg_s0)) {
const char *src2;
src2 = scheme_get_proc_name(future->arg_s0, &len, 1);
if (src2) src = src2;
}
} else if (future->source_type == FSRC_PRIM) {
const char *src2;
src2 = scheme_look_for_primitive(future->prim_func);
@ -1069,6 +1121,20 @@ static void do_invoke_rtcall(Scheme_Future_State *fs, future_t *future)
pthread_mutex_unlock(&fs->future_mutex);
}
static void *do_invoke_rtcall_k(void)
{
Scheme_Thread *p = scheme_current_thread;
Scheme_Future_State *fs = (Scheme_Future_State *)p->ku.k.p1;
future_t *future = (future_t *)p->ku.k.p2;
p->ku.k.p1 = NULL;
p->ku.k.p2 = NULL;
do_invoke_rtcall(fs, future);
return scheme_void;
}
static void invoke_rtcall(Scheme_Future_State * volatile fs, future_t * volatile future)
{
Scheme_Thread *p = scheme_current_thread;
@ -1087,7 +1153,15 @@ static void invoke_rtcall(Scheme_Future_State * volatile fs, future_t * volatile
pthread_mutex_unlock(&fs->future_mutex);
scheme_longjmp(*savebuf, 1);
} else {
do_invoke_rtcall(fs, future);
if (future->rt_prim_is_atomic) {
do_invoke_rtcall(fs, future);
} else {
/* call with continuation barrier. */
p->ku.k.p1 = fs;
p->ku.k.p2 = future;
(void)scheme_top_level_do(do_invoke_rtcall_k, 1);
}
}
p->error_buf = savebuf;
}

View File

@ -108,6 +108,8 @@ typedef struct future_t {
# include "jit_ts_protos.h"
extern Scheme_Object *scheme_ts_scheme_force_value_same_mark(Scheme_Object *v);
//Helper macros for argument marshaling
#ifdef FUTURES_ENABLED

View File

@ -81,11 +81,12 @@
[i (in-naturals)])
@string-append{ future->arg_@|(string t)|@|(number->string i)| = @|a|;})
"\n")
@(if (equal? arg-types '("Scheme_Object*")) @string-append{send_special_result(future, @(car arg-names));} "")
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
@(if (string=? result-type "void") "" @string-append{retval = @|fretval|;})
@(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 "Scheme_Object*") @string-append{receive_special_result(future, retval, 1);} "")
@(if (string=? result-type "void") "" "return retval;")
}
})
@ -104,6 +105,7 @@
{
prim_@|ts| f = (prim_@|ts|)future->prim_func;
@(if (string=? result-type "void") "" @string-append{@|result-type| retval;})
@(if (equal? arg-types '("Scheme_Object*")) @string-append{receive_special_result(future, future->arg_s0, 1);} "")
@(if (string=? result-type "void") "" "retval = ")
f(@(string-join
(for/list ([t (in-string (type->arg-string t))]

View File

@ -392,28 +392,6 @@ static void *decrement_cache_stack_pos(void *p)
THREAD_LOCAL_DECL(static Scheme_Object **fixup_runstack_base);
THREAD_LOCAL_DECL(static int fixup_already_in_place);
/* FIXME?: If _scheme_tail_apply_from_native_fixup_args is called from
a future thread, then the wrong thread-local `fixup_runstack_base'
was set. But exercising this code seems to be impossible, maybe
because current bytecode optimizations never produce the case that
_scheme_tail_apply_from_native_fixup_args() was design to support. */
static Scheme_Object *_scheme_tail_apply_from_native_fixup_args(Scheme_Object *rator,
int argc,
Scheme_Object **argv)
{
int already = fixup_already_in_place, i;
Scheme_Object **base;
base = fixup_runstack_base XFORM_OK_MINUS argc XFORM_OK_MINUS already;
/* Need to shift argc to end of base: */
for (i = 0; i < argc; i++) {
base[already + i] = argv[i];
}
return _scheme_tail_apply_from_native(rator, argc + already, base);
}
static Scheme_Object *make_global_ref(Scheme_Object *var)
{
GC_CAN_IGNORE Scheme_Object *o;
@ -2210,6 +2188,7 @@ extern int g_print_prims;
mz_patch_ucbranch(refcont); \
__END_TINY_JUMPS__(1); \
}
static Scheme_Object *noncm_prim_indirect(Scheme_Prim proc, int argc)
XFORM_SKIP_PROC
{
@ -2222,6 +2201,7 @@ static Scheme_Object *noncm_prim_indirect(Scheme_Prim proc, int argc)
else
return proc(argc, MZ_RUNSTACK);
}
static Scheme_Object *prim_indirect(Scheme_Primitive_Closure_Proc proc, int argc, Scheme_Object *self)
XFORM_SKIP_PROC
{
@ -2264,6 +2244,12 @@ static void *ts_prepare_retry_alloc(void *p, void *p2) XFORM_SKIP_PROC
return ret;
}
#endif
Scheme_Object *scheme_ts_scheme_force_value_same_mark(Scheme_Object *v)
{
return ts_scheme_force_value_same_mark(v);
}
#else
/* futures not enabled */
# define mz_prepare_direct_prim(n) mz_prepare(n)
@ -2275,6 +2261,23 @@ static void *ts_prepare_retry_alloc(void *p, void *p2) XFORM_SKIP_PROC
(mz_direct_only(direct_only), first_arg, mz_finishr_direct_prim(reg, prim_indirect))
#endif
static Scheme_Object *_scheme_tail_apply_from_native_fixup_args(Scheme_Object *rator,
int argc,
Scheme_Object **argv)
{
int already = fixup_already_in_place, i;
Scheme_Object **base;
base = fixup_runstack_base XFORM_OK_MINUS argc XFORM_OK_MINUS already;
/* Need to shift argc to end of base: */
for (i = 0; i < argc; i++) {
base[already + i] = argv[i];
}
return ts__scheme_tail_apply_from_native(rator, argc + already, base);
}
static int generate_pause_for_gc_and_retry(mz_jit_state *jitter,
int in_short_jumps,
int gc_reg, /* must not be JIT_R1 */
@ -2524,7 +2527,7 @@ static int generate_finish_tail_call(mz_jit_state *jitter, int direct_native)
jit_pusharg_i(JIT_R0);
jit_pusharg_p(JIT_V1);
if (direct_native > 1) { /* => some_args_already_in_place */
(void)mz_finish(ts__scheme_tail_apply_from_native_fixup_args);
(void)mz_finish(_scheme_tail_apply_from_native_fixup_args);
} else {
(void)mz_finish(ts__scheme_tail_apply_from_native);
}

View File

@ -16,7 +16,6 @@
define_ts_siS_s(_scheme_apply_multi_from_native, FSRC_RATOR)
define_ts_siS_s(_scheme_apply_from_native, FSRC_RATOR)
define_ts_siS_s(_scheme_tail_apply_from_native, FSRC_RATOR)
define_ts_siS_s(_scheme_tail_apply_from_native_fixup_args, FSRC_RATOR)
define_ts_s_s(scheme_force_value_same_mark, FSRC_OTHER)
define_ts_s_s(scheme_force_one_value_same_mark, FSRC_OTHER)
#if defined(INLINE_FP_OPS) && !defined(CAN_INLINE_ALLOC)

View File

@ -16,11 +16,12 @@
future->arg_s0 = g44;
future->arg_i1 = g45;
future->arg_S2 = g46;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
retval = future->retval_s;
future->retval_s = 0;
receive_special_result(future, retval);
receive_special_result(future, retval, 1);
return retval;
}
Scheme_Object* scheme_rtcall_iSs_s(const char *who, int src_type, prim_iSs_s f, int g47, Scheme_Object** g48, Scheme_Object* g49)
@ -41,11 +42,12 @@
future->arg_i0 = g47;
future->arg_S1 = g48;
future->arg_s2 = g49;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
retval = future->retval_s;
future->retval_s = 0;
receive_special_result(future, retval);
receive_special_result(future, retval, 1);
return retval;
}
Scheme_Object* scheme_rtcall_s_s(const char *who, int src_type, prim_s_s f, Scheme_Object* g50)
@ -64,11 +66,12 @@
future->source_of_request = who;
future->source_type = src_type;
future->arg_s0 = g50;
send_special_result(future, g50);
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
retval = future->retval_s;
future->retval_s = 0;
receive_special_result(future, retval);
receive_special_result(future, retval, 1);
return retval;
}
Scheme_Object* scheme_rtcall_n_s(const char *who, int src_type, prim_n_s f, Scheme_Native_Closure_Data* g51)
@ -87,11 +90,12 @@
future->source_of_request = who;
future->source_type = src_type;
future->arg_n0 = g51;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
retval = future->retval_s;
future->retval_s = 0;
receive_special_result(future, retval);
receive_special_result(future, retval, 1);
return retval;
}
Scheme_Object* scheme_rtcall__s(const char *who, int src_type, prim__s f )
@ -110,11 +114,12 @@
future->source_of_request = who;
future->source_type = src_type;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
retval = future->retval_s;
future->retval_s = 0;
receive_special_result(future, retval);
receive_special_result(future, retval, 1);
return retval;
}
Scheme_Object* scheme_rtcall_ss_s(const char *who, int src_type, prim_ss_s f, Scheme_Object* g52, Scheme_Object* g53)
@ -134,11 +139,12 @@
future->source_type = src_type;
future->arg_s0 = g52;
future->arg_s1 = g53;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
retval = future->retval_s;
future->retval_s = 0;
receive_special_result(future, retval);
receive_special_result(future, retval, 1);
return retval;
}
MZ_MARK_STACK_TYPE scheme_rtcall_ss_m(const char *who, int src_type, prim_ss_m f, Scheme_Object* g54, Scheme_Object* g55)
@ -158,6 +164,7 @@
future->source_type = src_type;
future->arg_s0 = g54;
future->arg_s1 = g55;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
retval = future->retval_m;
@ -182,11 +189,12 @@
future->source_type = src_type;
future->arg_S0 = g56;
future->arg_l1 = g57;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
retval = future->retval_s;
future->retval_s = 0;
receive_special_result(future, retval);
receive_special_result(future, retval, 1);
return retval;
}
Scheme_Object* scheme_rtcall_l_s(const char *who, int src_type, prim_l_s f, long g58)
@ -205,11 +213,12 @@
future->source_of_request = who;
future->source_type = src_type;
future->arg_l0 = g58;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
retval = future->retval_s;
future->retval_s = 0;
receive_special_result(future, retval);
receive_special_result(future, retval, 1);
return retval;
}
void scheme_rtcall_bsi_v(const char *who, int src_type, prim_bsi_v f, Scheme_Bucket* g59, Scheme_Object* g60, int g61)
@ -230,6 +239,7 @@
future->arg_b0 = g59;
future->arg_s1 = g60;
future->arg_i2 = g61;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
@ -255,6 +265,7 @@
future->arg_i0 = g62;
future->arg_i1 = g63;
future->arg_S2 = g64;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
@ -279,6 +290,7 @@
future->source_type = src_type;
future->arg_s0 = g65;
future->arg_s1 = g66;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
@ -302,6 +314,7 @@
future->source_of_request = who;
future->source_type = src_type;
future->arg_b0 = g67;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
@ -326,11 +339,12 @@
future->source_type = src_type;
future->arg_s0 = g68;
future->arg_l1 = g69;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
retval = future->retval_s;
future->retval_s = 0;
receive_special_result(future, retval);
receive_special_result(future, retval, 1);
return retval;
}
Scheme_Object* scheme_rtcall_iS_s(const char *who, int src_type, prim_iS_s f, int g70, Scheme_Object** g71)
@ -350,11 +364,12 @@
future->source_type = src_type;
future->arg_i0 = g70;
future->arg_S1 = g71;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
retval = future->retval_s;
future->retval_s = 0;
receive_special_result(future, retval);
receive_special_result(future, retval, 1);
return retval;
}
Scheme_Object* scheme_rtcall_S_s(const char *who, int src_type, prim_S_s f, Scheme_Object** g72)
@ -373,11 +388,12 @@
future->source_of_request = who;
future->source_type = src_type;
future->arg_S0 = g72;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
retval = future->retval_s;
future->retval_s = 0;
receive_special_result(future, retval);
receive_special_result(future, retval, 1);
return retval;
}
void scheme_rtcall_s_v(const char *who, int src_type, prim_s_v f, Scheme_Object* g73)
@ -396,6 +412,7 @@
future->source_of_request = who;
future->source_type = src_type;
future->arg_s0 = g73;
send_special_result(future, g73);
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
@ -421,11 +438,12 @@
future->arg_i0 = g74;
future->arg_S1 = g75;
future->arg_i2 = g76;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
retval = future->retval_s;
future->retval_s = 0;
receive_special_result(future, retval);
receive_special_result(future, retval, 1);
return retval;
}
void scheme_rtcall_siS_v(const char *who, int src_type, prim_siS_v f, Scheme_Object* g77, int g78, Scheme_Object** g79)
@ -446,6 +464,7 @@
future->arg_s0 = g77;
future->arg_i1 = g78;
future->arg_S2 = g79;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
@ -469,6 +488,7 @@
future->source_of_request = who;
future->source_type = src_type;
future->arg_z0 = g80;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
retval = future->retval_p;

View File

@ -2,6 +2,7 @@ case SIG_siS_s:
{
prim_siS_s f = (prim_siS_s)future->prim_func;
Scheme_Object* retval;
retval =
f(future->arg_s0, future->arg_i1, future->arg_S2);
future->retval_s = retval;
@ -12,6 +13,7 @@ case SIG_iSs_s:
{
prim_iSs_s f = (prim_iSs_s)future->prim_func;
Scheme_Object* retval;
retval =
f(future->arg_i0, future->arg_S1, future->arg_s2);
future->retval_s = retval;
@ -22,6 +24,7 @@ case SIG_s_s:
{
prim_s_s f = (prim_s_s)future->prim_func;
Scheme_Object* retval;
receive_special_result(future, future->arg_s0, 1);
retval =
f(future->arg_s0);
future->retval_s = retval;
@ -32,6 +35,7 @@ case SIG_n_s:
{
prim_n_s f = (prim_n_s)future->prim_func;
Scheme_Object* retval;
retval =
f(future->arg_n0);
future->retval_s = retval;
@ -42,6 +46,7 @@ case SIG__s:
{
prim__s f = (prim__s)future->prim_func;
Scheme_Object* retval;
retval =
f();
future->retval_s = retval;
@ -52,6 +57,7 @@ case SIG_ss_s:
{
prim_ss_s f = (prim_ss_s)future->prim_func;
Scheme_Object* retval;
retval =
f(future->arg_s0, future->arg_s1);
future->retval_s = retval;
@ -62,6 +68,7 @@ case SIG_ss_m:
{
prim_ss_m f = (prim_ss_m)future->prim_func;
MZ_MARK_STACK_TYPE retval;
retval =
f(future->arg_s0, future->arg_s1);
future->retval_m = retval;
@ -72,6 +79,7 @@ case SIG_Sl_s:
{
prim_Sl_s f = (prim_Sl_s)future->prim_func;
Scheme_Object* retval;
retval =
f(future->arg_S0, future->arg_l1);
future->retval_s = retval;
@ -82,6 +90,7 @@ case SIG_l_s:
{
prim_l_s f = (prim_l_s)future->prim_func;
Scheme_Object* retval;
retval =
f(future->arg_l0);
future->retval_s = retval;
@ -93,6 +102,7 @@ case SIG_bsi_v:
prim_bsi_v f = (prim_bsi_v)future->prim_func;
f(future->arg_b0, future->arg_s1, future->arg_i2);
@ -103,6 +113,7 @@ case SIG_iiS_v:
prim_iiS_v f = (prim_iiS_v)future->prim_func;
f(future->arg_i0, future->arg_i1, future->arg_S2);
@ -113,6 +124,7 @@ case SIG_ss_v:
prim_ss_v f = (prim_ss_v)future->prim_func;
f(future->arg_s0, future->arg_s1);
@ -123,6 +135,7 @@ case SIG_b_v:
prim_b_v f = (prim_b_v)future->prim_func;
f(future->arg_b0);
@ -132,6 +145,7 @@ case SIG_sl_s:
{
prim_sl_s f = (prim_sl_s)future->prim_func;
Scheme_Object* retval;
retval =
f(future->arg_s0, future->arg_l1);
future->retval_s = retval;
@ -142,6 +156,7 @@ case SIG_iS_s:
{
prim_iS_s f = (prim_iS_s)future->prim_func;
Scheme_Object* retval;
retval =
f(future->arg_i0, future->arg_S1);
future->retval_s = retval;
@ -152,6 +167,7 @@ case SIG_S_s:
{
prim_S_s f = (prim_S_s)future->prim_func;
Scheme_Object* retval;
retval =
f(future->arg_S0);
future->retval_s = retval;
@ -162,6 +178,7 @@ case SIG_s_v:
{
prim_s_v f = (prim_s_v)future->prim_func;
receive_special_result(future, future->arg_s0, 1);
f(future->arg_s0);
@ -172,6 +189,7 @@ case SIG_iSi_s:
{
prim_iSi_s f = (prim_iSi_s)future->prim_func;
Scheme_Object* retval;
retval =
f(future->arg_i0, future->arg_S1, future->arg_i2);
future->retval_s = retval;
@ -183,6 +201,7 @@ case SIG_siS_v:
prim_siS_v f = (prim_siS_v)future->prim_func;
f(future->arg_s0, future->arg_i1, future->arg_S2);
@ -192,6 +211,7 @@ 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;

View File

@ -5482,6 +5482,7 @@ static int sequential_future_MARK(void *p) {
gcMARK(f->orig_lambda);
gcMARK(f->running_sema);
gcMARK(f->retval);
gcMARK(f->multiple_array);
return
gcBYTES_TO_WORDS(sizeof(future_t));
}
@ -5491,6 +5492,7 @@ static int sequential_future_FIXUP(void *p) {
gcFIXUP(f->orig_lambda);
gcFIXUP(f->running_sema);
gcFIXUP(f->retval);
gcFIXUP(f->multiple_array);
return
gcBYTES_TO_WORDS(sizeof(future_t));
}

View File

@ -2254,6 +2254,7 @@ sequential_future {
gcMARK(f->orig_lambda);
gcMARK(f->running_sema);
gcMARK(f->retval);
gcMARK(f->multiple_array);
size:
gcBYTES_TO_WORDS(sizeof(future_t));
}