futures minor re-org to prepare for mixing futures and places

svn: r16934
This commit is contained in:
Matthew Flatt 2009-11-21 04:05:23 +00:00
parent 35b62665ae
commit 41bf71fa06
9 changed files with 516 additions and 567 deletions

File diff suppressed because it is too large Load Diff

View File

@ -23,16 +23,8 @@ int scheme_make_prim_w_arity(prim_t func, char *name, int arg1, int arg2);
#include "pthread.h"
#include <stdio.h>
extern pthread_t g_rt_threadid;
extern Scheme_Object *start_primitive_tracking(int argc, Scheme_Object *argv[]);
extern Scheme_Object *end_primitive_tracking(int argc, Scheme_Object *argv[]);
extern Scheme_Object *future(int argc, Scheme_Object *argv[]);
extern Scheme_Object *touch(int argc, Scheme_Object *argv[]);
extern Scheme_Object *processor_count(int argc, Scheme_Object *argv[]);
extern void futures_init(void);
typedef void (*prim_void_void_3args_t)(Scheme_Object **);
typedef void *(*prim_alloc_void_pvoid_t)();
typedef unsigned long (*prim_alloc_void_pvoid_t)();
typedef Scheme_Object* (*prim_obj_int_pobj_obj_t)(Scheme_Object*, int, Scheme_Object**);
typedef Scheme_Object* (*prim_int_pobj_obj_t)(int, Scheme_Object**);
typedef Scheme_Object* (*prim_int_pobj_obj_obj_t)(int, Scheme_Object**, Scheme_Object*);
@ -57,9 +49,6 @@ typedef struct future_t {
int work_completed;
pthread_cond_t *can_continue_cv;
long runstack_size;
Scheme_Object **runstack;
Scheme_Object **runstack_start;
Scheme_Object *orig_lambda;
void *code;
@ -70,7 +59,7 @@ typedef struct future_t {
const char *source_of_request;
int source_type;
void *alloc_retval;
unsigned long alloc_retval;
int alloc_retval_counter;
void *prim_func;
@ -110,24 +99,6 @@ typedef struct future_t {
struct future_t *next_waiting_atomic;
} future_t;
#ifdef UNIT_TEST
//If unit testing, expose internal functions and vars to
//the test suite
extern future_t *g_future_queue;
extern int g_next_futureid;
extern pthread_t g_rt_threadid;
extern void *worker_thread_future_loop(void *arg);
extern void *invoke_rtcall(future_t *future);
extern future_t *enqueue_future(void);
extern future_t *get_pending_future(void);
extern future_t *get_my_future(void);
extern future_t *get_future_by_threadid(pthread_t threadid);
extern future_t *get_future(int futureid);
extern future_t *get_last_future(void);
extern void clear_futures(void);
#endif
//Primitive instrumentation stuff
//Signature flags for primitive invocations
@ -147,8 +118,8 @@ extern void clear_futures(void);
/*GDB_BREAK;*/ \
}
extern void scheme_rtcall_void_void_3args(const char *who, int src_type, void (*f)());
extern void *scheme_rtcall_alloc_void_pvoid(const char *who, int src_type, void (*f)());
extern void scheme_rtcall_void_void_3args(const char *who, int src_type, prim_void_void_3args_t f);
extern unsigned long scheme_rtcall_alloc_void_pvoid(const char *who, int src_type, prim_alloc_void_pvoid_t f);
#else
@ -205,6 +176,9 @@ extern void *scheme_rtcall_alloc_void_pvoid(const char *who, int src_type, void
#define LOG_RTCALL_ENV_ENV_VOID(a,b)
#endif
extern void *scheme_on_demand_jit_code;
extern void scheme_on_demand_generate_lambda(Scheme_Native_Closure *nc, int argc, Scheme_Object **argv);
void scheme_future_block_until_gc();
void scheme_future_continue_after_gc();
void scheme_check_future_work();

View File

@ -64,11 +64,12 @@
@|result-type| scheme_rtcall_@|ts|(const char *who, int src_type, prim_@|ts| f@|(if (null? arg-types) "" ",")| @|args|)
{
START_XFORM_SKIP;
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
future_t *future;
double tm;
@(if (string=? result-type "void") "" @string-append{@|result-type| retval;})
future = current_ft;
future = fts->current_ft;
future->prim_protocol = SIG_@|ts|;
future->prim_func = f;
tm = scheme_get_inexact_milliseconds();
@ -81,8 +82,8 @@
[i (in-naturals)])
@string-append{ future->arg_@|(string t)|@|(number->string i)| = @|a|;})
"\n")
future_do_runtimecall((void*)f, 0);
future = current_ft;
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);} "")

View File

@ -144,7 +144,7 @@ static void *vector_ref_code, *vector_ref_check_index_code, *vector_set_code, *v
static void *string_ref_code, *string_ref_check_index_code, *string_set_code, *string_set_check_index_code;
static void *bytes_ref_code, *bytes_ref_check_index_code, *bytes_set_code, *bytes_set_check_index_code;
static void *syntax_e_code;
void *on_demand_jit_code;
void *scheme_on_demand_jit_code;
static void *on_demand_jit_arity_code;
static void *get_stack_pointer_code;
static void *stack_cache_pop_code;
@ -296,6 +296,7 @@ void scheme_jit_fill_threadlocal_table();
# define tl_scheme_jit_stack_boundary tl_delta(scheme_jit_stack_boundary)
# define tl_jit_future_storage tl_delta(jit_future_storage)
# define tl_scheme_future_need_gc_pause tl_delta(scheme_future_need_gc_pause)
# define tl_scheme_use_rtcall tl_delta(scheme_use_rtcall)
#ifdef MZ_XFORM
START_XFORM_SKIP;
@ -2194,6 +2195,27 @@ extern int g_print_prims;
# define mz_prepare_direct_prim(n) mz_prepare(n)
# define mz_finishr_direct_prim(reg, proc) (jit_pusharg_p(reg), (void)mz_finish(proc))
# define mz_direct_only(p) /* skip this arg, so that total count <= 3 args */
/* Inlines check of scheme_use_rtcall: */
# define mz_generate_direct_prim(direct_only, first_arg, reg, prim_indirect) \
{ \
GC_CAN_IGNORE jit_insn *refdirect, *refcont; \
int argstate; \
jit_save_argstate(argstate); \
mz_tl_ldi_i(JIT_R0, tl_scheme_use_rtcall); \
__START_TINY_JUMPS__(1); \
refdirect = jit_beqi_i(jit_forward(), JIT_R0, 0); \
first_arg; \
mz_finishr_direct_prim(reg, prim_indirect); \
refcont = jit_jmpi(jit_forward()); \
CHECK_LIMIT(); \
mz_patch_branch(refdirect); \
jit_restore_argstate(argstate); \
direct_only; \
first_arg; \
mz_finishr(reg); \
mz_patch_ucbranch(refcont); \
__END_TINY_JUMPS__(1); \
}
static Scheme_Object *noncm_prim_indirect(Scheme_Prim proc, int argc)
{
START_XFORM_SKIP;
@ -2239,7 +2261,7 @@ static void ts_on_demand(void)
static void *ts_prepare_retry_alloc(void *p, void *p2)
{
START_XFORM_SKIP;
void *ret;
unsigned long ret;
if (scheme_use_rtcall) {
jit_future_storage[0] = p;
@ -2265,6 +2287,8 @@ static void *ts_prepare_retry_alloc(void *p, void *p2)
# define mz_direct_only(p) p
# define ts_on_demand on_demand
# define ts_prepare_retry_alloc prepare_retry_alloc
# define mz_generate_direct_prim(direct_only, first_arg, reg, prim_indirect) \
(mz_direct_only(direct_only), first_arg, mz_finishr_direct_prim(reg, prim_indirect))
#endif
static int generate_pause_for_gc_and_retry(mz_jit_state *jitter,
@ -2339,9 +2363,12 @@ static int generate_direct_prim_tail_call(mz_jit_state *jitter, int num_rands)
jit_movi_i(JIT_R1, num_rands);
mz_prepare_direct_prim(2); /* a prim takes 3 args, but a NONCM prim ignores the 3rd */
CHECK_LIMIT();
mz_direct_only(jit_pusharg_p(JIT_RUNSTACK));
jit_pusharg_i(JIT_R1);
mz_finishr_direct_prim(JIT_V1, noncm_prim_indirect);
{
/* May use JIT_R0 and create local branch: */
mz_generate_direct_prim(jit_pusharg_p(JIT_RUNSTACK),
jit_pusharg_i(JIT_R1),
JIT_V1, noncm_prim_indirect);
}
CHECK_LIMIT();
/* Return: */
mz_pop_threadlocal();
@ -2544,9 +2571,12 @@ static int generate_direct_prim_non_tail_call(mz_jit_state *jitter, int num_rand
jit_movi_i(JIT_R1, num_rands);
mz_prepare_direct_prim(2); /* a prim takes 3 args, but a NONCM prim ignores the 3rd */
CHECK_LIMIT();
mz_direct_only(jit_pusharg_p(JIT_RUNSTACK));
jit_pusharg_i(JIT_R1);
mz_finishr_direct_prim(JIT_V1, noncm_prim_indirect);
{
/* May use JIT_R0 and create local branch: */
mz_generate_direct_prim(jit_pusharg_p(JIT_RUNSTACK),
jit_pusharg_i(JIT_R1),
JIT_V1, noncm_prim_indirect);
}
CHECK_LIMIT();
jit_retval(JIT_R0);
VALIDATE_RESULT(JIT_R0);
@ -2839,9 +2869,14 @@ static int generate_non_tail_call(mz_jit_state *jitter, int num_rands, int direc
mz_prepare_direct_prim(3);
jit_pusharg_p(JIT_V1);
if (num_rands < 0) { jit_movr_p(JIT_V1, JIT_R0); } /* save argc to manually pop runstack */
mz_direct_only(jit_pusharg_p(JIT_RUNSTACK));
jit_pusharg_i(JIT_R2);
mz_finishr_direct_prim(JIT_R1, prim_indirect);
{
__END_SHORT_JUMPS__(1);
/* May use JIT_R0 and create local branch: */
mz_generate_direct_prim(jit_pusharg_p(JIT_RUNSTACK),
jit_pusharg_i(JIT_R2),
JIT_R1, prim_indirect);
__START_SHORT_JUMPS__(1);
}
CHECK_LIMIT();
jit_retval(JIT_R0);
VALIDATE_RESULT(JIT_R0);
@ -8232,9 +8267,12 @@ static int do_generate_common(mz_jit_state *jitter, void *_data)
}
JIT_UPDATE_THREAD_RSPTR();
mz_prepare_direct_prim(2);
mz_direct_only(jit_pusharg_p(JIT_RUNSTACK));
jit_pusharg_p(JIT_R1);
mz_finishr_direct_prim(JIT_R2, noncm_prim_indirect);
{
/* May use JIT_R0 and create local branch: */
mz_generate_direct_prim(jit_pusharg_p(JIT_RUNSTACK),
jit_pusharg_p(JIT_R1),
JIT_R2, noncm_prim_indirect);
}
CHECK_LIMIT();
jit_retval(JIT_R0);
VALIDATE_RESULT(JIT_R0);
@ -8262,7 +8300,7 @@ static int do_generate_common(mz_jit_state *jitter, void *_data)
/* Used as the code stub for a closure whose
code is not yet compiled. See generate_function_prolog
for the state of registers on entry */
on_demand_jit_code = jit_get_ip().ptr;
scheme_on_demand_jit_code = jit_get_ip().ptr;
jit_prolog(NATIVE_ARG_COUNT);
in = jit_arg_p();
jit_getarg_p(JIT_R0, in); /* closure */
@ -8332,7 +8370,7 @@ static int do_generate_common(mz_jit_state *jitter, void *_data)
mz_pop_locals();
jit_ret();
CHECK_LIMIT();
register_helper_func(jitter, on_demand_jit_code);
register_helper_func(jitter, scheme_on_demand_jit_code);
/* *** app_values_tail_slow_code *** */
/* RELIES ON jit_prolog(NATIVE_ARG_COUNT) FROM ABOVE */
@ -9556,7 +9594,7 @@ static void on_demand_with_args(Scheme_Object **in_argv)
argc = in_argv[1];
argv = (Scheme_Object **)in_argv[2];
if (((Scheme_Native_Closure *)c)->code->code == on_demand_jit_code)
if (((Scheme_Native_Closure *)c)->code->code == scheme_on_demand_jit_code)
scheme_on_demand_generate_lambda((Scheme_Native_Closure *)c, SCHEME_INT_VAL(argc), argv);
}
@ -9591,7 +9629,7 @@ Scheme_Native_Closure_Data *scheme_generate_lambda(Scheme_Closure_Data *data, in
ndata->iso.so.type = scheme_rt_native_code_plus_case;
#endif
}
ndata->code = on_demand_jit_code;
ndata->code = scheme_on_demand_jit_code;
ndata->u.tail_code = on_demand_jit_arity_code;
ndata->arity_code = on_demand_jit_arity_code;
ndata->u2.orig_code = data;
@ -9861,7 +9899,7 @@ static void generate_case_lambda(Scheme_Case_Lambda *c, Scheme_Native_Closure_Da
static int lambda_has_been_jitted(Scheme_Native_Closure_Data *ndata)
{
return (ndata->code != on_demand_jit_code);
return (ndata->code != scheme_on_demand_jit_code);
}
int scheme_native_arity_check(Scheme_Object *closure, int argc)

View File

@ -1,11 +1,12 @@
Scheme_Object* scheme_rtcall_siS_s(const char *who, int src_type, prim_siS_s f, Scheme_Object* g44, int g45, Scheme_Object** g46)
{
START_XFORM_SKIP;
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
future_t *future;
double tm;
Scheme_Object* retval;
future = current_ft;
future = fts->current_ft;
future->prim_protocol = SIG_siS_s;
future->prim_func = f;
tm = scheme_get_inexact_milliseconds();
@ -15,8 +16,8 @@
future->arg_s0 = g44;
future->arg_i1 = g45;
future->arg_S2 = g46;
future_do_runtimecall((void*)f, 0);
future = current_ft;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
retval = future->retval_s;
future->retval_s = 0;
receive_special_result(future, retval);
@ -26,11 +27,12 @@
Scheme_Object* scheme_rtcall_iSs_s(const char *who, int src_type, prim_iSs_s f, int g47, Scheme_Object** g48, Scheme_Object* g49)
{
START_XFORM_SKIP;
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
future_t *future;
double tm;
Scheme_Object* retval;
future = current_ft;
future = fts->current_ft;
future->prim_protocol = SIG_iSs_s;
future->prim_func = f;
tm = scheme_get_inexact_milliseconds();
@ -40,8 +42,8 @@
future->arg_i0 = g47;
future->arg_S1 = g48;
future->arg_s2 = g49;
future_do_runtimecall((void*)f, 0);
future = current_ft;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
retval = future->retval_s;
future->retval_s = 0;
receive_special_result(future, retval);
@ -51,11 +53,12 @@
Scheme_Object* scheme_rtcall_s_s(const char *who, int src_type, prim_s_s f, Scheme_Object* g50)
{
START_XFORM_SKIP;
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
future_t *future;
double tm;
Scheme_Object* retval;
future = current_ft;
future = fts->current_ft;
future->prim_protocol = SIG_s_s;
future->prim_func = f;
tm = scheme_get_inexact_milliseconds();
@ -63,8 +66,8 @@
future->source_of_request = who;
future->source_type = src_type;
future->arg_s0 = g50;
future_do_runtimecall((void*)f, 0);
future = current_ft;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
retval = future->retval_s;
future->retval_s = 0;
receive_special_result(future, retval);
@ -74,11 +77,12 @@
Scheme_Object* scheme_rtcall_n_s(const char *who, int src_type, prim_n_s f, Scheme_Native_Closure_Data* g51)
{
START_XFORM_SKIP;
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
future_t *future;
double tm;
Scheme_Object* retval;
future = current_ft;
future = fts->current_ft;
future->prim_protocol = SIG_n_s;
future->prim_func = f;
tm = scheme_get_inexact_milliseconds();
@ -86,8 +90,8 @@
future->source_of_request = who;
future->source_type = src_type;
future->arg_n0 = g51;
future_do_runtimecall((void*)f, 0);
future = current_ft;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
retval = future->retval_s;
future->retval_s = 0;
receive_special_result(future, retval);
@ -97,11 +101,12 @@
Scheme_Object* scheme_rtcall__s(const char *who, int src_type, prim__s f )
{
START_XFORM_SKIP;
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
future_t *future;
double tm;
Scheme_Object* retval;
future = current_ft;
future = fts->current_ft;
future->prim_protocol = SIG__s;
future->prim_func = f;
tm = scheme_get_inexact_milliseconds();
@ -109,8 +114,8 @@
future->source_of_request = who;
future->source_type = src_type;
future_do_runtimecall((void*)f, 0);
future = current_ft;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
retval = future->retval_s;
future->retval_s = 0;
receive_special_result(future, retval);
@ -120,11 +125,12 @@
Scheme_Object* scheme_rtcall_ss_s(const char *who, int src_type, prim_ss_s f, Scheme_Object* g52, Scheme_Object* g53)
{
START_XFORM_SKIP;
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
future_t *future;
double tm;
Scheme_Object* retval;
future = current_ft;
future = fts->current_ft;
future->prim_protocol = SIG_ss_s;
future->prim_func = f;
tm = scheme_get_inexact_milliseconds();
@ -133,8 +139,8 @@
future->source_type = src_type;
future->arg_s0 = g52;
future->arg_s1 = g53;
future_do_runtimecall((void*)f, 0);
future = current_ft;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
retval = future->retval_s;
future->retval_s = 0;
receive_special_result(future, retval);
@ -144,11 +150,12 @@
MZ_MARK_STACK_TYPE scheme_rtcall_ss_m(const char *who, int src_type, prim_ss_m f, Scheme_Object* g54, Scheme_Object* g55)
{
START_XFORM_SKIP;
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
future_t *future;
double tm;
MZ_MARK_STACK_TYPE retval;
future = current_ft;
future = fts->current_ft;
future->prim_protocol = SIG_ss_m;
future->prim_func = f;
tm = scheme_get_inexact_milliseconds();
@ -157,8 +164,8 @@
future->source_type = src_type;
future->arg_s0 = g54;
future->arg_s1 = g55;
future_do_runtimecall((void*)f, 0);
future = current_ft;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
retval = future->retval_m;
future->retval_m = 0;
@ -168,11 +175,12 @@
Scheme_Object* scheme_rtcall_Sl_s(const char *who, int src_type, prim_Sl_s f, Scheme_Object** g56, long g57)
{
START_XFORM_SKIP;
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
future_t *future;
double tm;
Scheme_Object* retval;
future = current_ft;
future = fts->current_ft;
future->prim_protocol = SIG_Sl_s;
future->prim_func = f;
tm = scheme_get_inexact_milliseconds();
@ -181,8 +189,8 @@
future->source_type = src_type;
future->arg_S0 = g56;
future->arg_l1 = g57;
future_do_runtimecall((void*)f, 0);
future = current_ft;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
retval = future->retval_s;
future->retval_s = 0;
receive_special_result(future, retval);
@ -192,11 +200,12 @@
Scheme_Object* scheme_rtcall_l_s(const char *who, int src_type, prim_l_s f, long g58)
{
START_XFORM_SKIP;
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
future_t *future;
double tm;
Scheme_Object* retval;
future = current_ft;
future = fts->current_ft;
future->prim_protocol = SIG_l_s;
future->prim_func = f;
tm = scheme_get_inexact_milliseconds();
@ -204,8 +213,8 @@
future->source_of_request = who;
future->source_type = src_type;
future->arg_l0 = g58;
future_do_runtimecall((void*)f, 0);
future = current_ft;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
retval = future->retval_s;
future->retval_s = 0;
receive_special_result(future, retval);
@ -215,11 +224,12 @@
void scheme_rtcall_bsi_v(const char *who, int src_type, prim_bsi_v f, Scheme_Bucket* g59, Scheme_Object* g60, int g61)
{
START_XFORM_SKIP;
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
future_t *future;
double tm;
future = current_ft;
future = fts->current_ft;
future->prim_protocol = SIG_bsi_v;
future->prim_func = f;
tm = scheme_get_inexact_milliseconds();
@ -229,8 +239,8 @@
future->arg_b0 = g59;
future->arg_s1 = g60;
future->arg_i2 = g61;
future_do_runtimecall((void*)f, 0);
future = current_ft;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
@ -240,11 +250,12 @@
void scheme_rtcall_iiS_v(const char *who, int src_type, prim_iiS_v f, int g62, int g63, Scheme_Object** g64)
{
START_XFORM_SKIP;
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
future_t *future;
double tm;
future = current_ft;
future = fts->current_ft;
future->prim_protocol = SIG_iiS_v;
future->prim_func = f;
tm = scheme_get_inexact_milliseconds();
@ -254,8 +265,8 @@
future->arg_i0 = g62;
future->arg_i1 = g63;
future->arg_S2 = g64;
future_do_runtimecall((void*)f, 0);
future = current_ft;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
@ -265,11 +276,12 @@
void scheme_rtcall_ss_v(const char *who, int src_type, prim_ss_v f, Scheme_Object* g65, Scheme_Object* g66)
{
START_XFORM_SKIP;
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
future_t *future;
double tm;
future = current_ft;
future = fts->current_ft;
future->prim_protocol = SIG_ss_v;
future->prim_func = f;
tm = scheme_get_inexact_milliseconds();
@ -278,8 +290,8 @@
future->source_type = src_type;
future->arg_s0 = g65;
future->arg_s1 = g66;
future_do_runtimecall((void*)f, 0);
future = current_ft;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
@ -289,11 +301,12 @@
void scheme_rtcall_b_v(const char *who, int src_type, prim_b_v f, Scheme_Bucket* g67)
{
START_XFORM_SKIP;
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
future_t *future;
double tm;
future = current_ft;
future = fts->current_ft;
future->prim_protocol = SIG_b_v;
future->prim_func = f;
tm = scheme_get_inexact_milliseconds();
@ -301,8 +314,8 @@
future->source_of_request = who;
future->source_type = src_type;
future->arg_b0 = g67;
future_do_runtimecall((void*)f, 0);
future = current_ft;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
@ -312,11 +325,12 @@
Scheme_Object* scheme_rtcall_sl_s(const char *who, int src_type, prim_sl_s f, Scheme_Object* g68, long g69)
{
START_XFORM_SKIP;
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
future_t *future;
double tm;
Scheme_Object* retval;
future = current_ft;
future = fts->current_ft;
future->prim_protocol = SIG_sl_s;
future->prim_func = f;
tm = scheme_get_inexact_milliseconds();
@ -325,8 +339,8 @@
future->source_type = src_type;
future->arg_s0 = g68;
future->arg_l1 = g69;
future_do_runtimecall((void*)f, 0);
future = current_ft;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
retval = future->retval_s;
future->retval_s = 0;
receive_special_result(future, retval);
@ -336,11 +350,12 @@
Scheme_Object* scheme_rtcall_iS_s(const char *who, int src_type, prim_iS_s f, int g70, Scheme_Object** g71)
{
START_XFORM_SKIP;
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
future_t *future;
double tm;
Scheme_Object* retval;
future = current_ft;
future = fts->current_ft;
future->prim_protocol = SIG_iS_s;
future->prim_func = f;
tm = scheme_get_inexact_milliseconds();
@ -349,8 +364,8 @@
future->source_type = src_type;
future->arg_i0 = g70;
future->arg_S1 = g71;
future_do_runtimecall((void*)f, 0);
future = current_ft;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
retval = future->retval_s;
future->retval_s = 0;
receive_special_result(future, retval);
@ -360,11 +375,12 @@
Scheme_Object* scheme_rtcall_S_s(const char *who, int src_type, prim_S_s f, Scheme_Object** g72)
{
START_XFORM_SKIP;
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
future_t *future;
double tm;
Scheme_Object* retval;
future = current_ft;
future = fts->current_ft;
future->prim_protocol = SIG_S_s;
future->prim_func = f;
tm = scheme_get_inexact_milliseconds();
@ -372,8 +388,8 @@
future->source_of_request = who;
future->source_type = src_type;
future->arg_S0 = g72;
future_do_runtimecall((void*)f, 0);
future = current_ft;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
retval = future->retval_s;
future->retval_s = 0;
receive_special_result(future, retval);
@ -383,11 +399,12 @@
void scheme_rtcall_s_v(const char *who, int src_type, prim_s_v f, Scheme_Object* g73)
{
START_XFORM_SKIP;
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
future_t *future;
double tm;
future = current_ft;
future = fts->current_ft;
future->prim_protocol = SIG_s_v;
future->prim_func = f;
tm = scheme_get_inexact_milliseconds();
@ -395,8 +412,8 @@
future->source_of_request = who;
future->source_type = src_type;
future->arg_s0 = g73;
future_do_runtimecall((void*)f, 0);
future = current_ft;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
@ -406,11 +423,12 @@
Scheme_Object* scheme_rtcall_iSi_s(const char *who, int src_type, prim_iSi_s f, int g74, Scheme_Object** g75, int g76)
{
START_XFORM_SKIP;
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
future_t *future;
double tm;
Scheme_Object* retval;
future = current_ft;
future = fts->current_ft;
future->prim_protocol = SIG_iSi_s;
future->prim_func = f;
tm = scheme_get_inexact_milliseconds();
@ -420,8 +438,8 @@
future->arg_i0 = g74;
future->arg_S1 = g75;
future->arg_i2 = g76;
future_do_runtimecall((void*)f, 0);
future = current_ft;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
retval = future->retval_s;
future->retval_s = 0;
receive_special_result(future, retval);
@ -431,11 +449,12 @@
void scheme_rtcall_siS_v(const char *who, int src_type, prim_siS_v f, Scheme_Object* g77, int g78, Scheme_Object** g79)
{
START_XFORM_SKIP;
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
future_t *future;
double tm;
future = current_ft;
future = fts->current_ft;
future->prim_protocol = SIG_siS_v;
future->prim_func = f;
tm = scheme_get_inexact_milliseconds();
@ -445,8 +464,8 @@
future->arg_s0 = g77;
future->arg_i1 = g78;
future->arg_S2 = g79;
future_do_runtimecall((void*)f, 0);
future = current_ft;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
@ -456,11 +475,12 @@
void* scheme_rtcall_z_p(const char *who, int src_type, prim_z_p f, size_t g80)
{
START_XFORM_SKIP;
Scheme_Future_Thread_State *fts = scheme_future_thread_state;
future_t *future;
double tm;
void* retval;
future = current_ft;
future = fts->current_ft;
future->prim_protocol = SIG_z_p;
future->prim_func = f;
tm = scheme_get_inexact_milliseconds();
@ -468,8 +488,8 @@
future->source_of_request = who;
future->source_type = src_type;
future->arg_z0 = g80;
future_do_runtimecall((void*)f, 0);
future = current_ft;
future_do_runtimecall(fts, (void*)f, 0);
future = fts->current_ft;
retval = future->retval_p;
future->retval_p = 0;

View File

@ -373,6 +373,8 @@ struct jit_local_state {
#define jit_prepare_d(nd) (_jitl.argssize += 2 * (nd))
#ifdef JIT_X86_64
# define jit_pusharg_i(rs) (_jitl.argssize++, MOVQrr(rs, JIT_CALLTMPSTART + _jitl.argssize - 1))
# define jit_save_argstate(curstate) curstate = _jitl.argssize;
# define jit_restore_argstate(curstate) _jitl.argssize = curstate;
# define jit_finish(sub) (jit_shift_args(), (void)jit_calli((sub)), jit_restore_locals())
# define jit_normal_finish(sub) jit_calli((sub))
# define jit_reg_is_arg(reg) ((reg == _EDI) || (reg ==_ESI) || (reg == _EDX))
@ -396,6 +398,8 @@ struct jit_local_state {
(MOVQrr(_R12, _ESI), MOVQrr(_R13, _EDI))
#else
# define jit_pusharg_i(rs) PUSHLr(rs)
# define jit_save_argstate(curstate) curstate = _jitl.argssize;
# define jit_restore_argstate(curstate) _jitl.argssize = curstate;
# define jit_finish(sub) ((void)jit_calli((sub)), ADDLir(sizeof(long) * _jitl.argssize, JIT_SP), _jitl.argssize = 0)
# define jit_finishr(reg) (jit_callr((reg)), ADDLir(sizeof(long) * _jitl.argssize, JIT_SP), _jitl.argssize = 0)
# define jit_normal_finish(sub) jit_finish(sub)

View File

@ -246,6 +246,8 @@ struct jit_local_state {
#define jit_prolog(n) _jit_prolog(&_jit, (n))
#define jit_pushr_i(rs) STWUrm((rs), -4, 1)
#define jit_pusharg_i(rs) (--_jitl.nextarg_puti, MRrr((3 + _jitl.nextarg_putd * 2 + _jitl.nextarg_putf + _jitl.nextarg_puti), (rs)))
#define jit_save_argstate(curstate) (curstate = _jitl.nextarg_puti)
#define jit_restore_argstate(curstate) (_jitl.nextarg_puti = curstate)
#define jit_ret() _jit_epilog(&_jit)
#define jit_retval_i(rd) MRrr((rd), 3)
#define jit_rsbi_i(d, rs, is) jit_chk_ims((is), SUBFICrri((d), (rs), (is)), SUBFCrrr((d), (rs), JIT_AUX))

View File

@ -5420,8 +5420,6 @@ static int future_SIZE(void *p) {
static int future_MARK(void *p) {
future_t *f = (future_t *)p;
gcMARK(f->runstack);
gcMARK(f->runstack_start);
gcMARK(f->orig_lambda);
gcMARK(f->arg_s0);
gcMARK(f->arg_S0);
@ -5445,8 +5443,6 @@ static int future_MARK(void *p) {
static int future_FIXUP(void *p) {
future_t *f = (future_t *)p;
gcFIXUP(f->runstack);
gcFIXUP(f->runstack_start);
gcFIXUP(f->orig_lambda);
gcFIXUP(f->arg_s0);
gcFIXUP(f->arg_S0);

View File

@ -2223,8 +2223,6 @@ START future;
future {
mark:
future_t *f = (future_t *)p;
gcMARK(f->runstack);
gcMARK(f->runstack_start);
gcMARK(f->orig_lambda);
gcMARK(f->arg_s0);
gcMARK(f->arg_S0);