futures minor re-org to prepare for mixing futures and places
svn: r16934
This commit is contained in:
parent
35b62665ae
commit
41bf71fa06
File diff suppressed because it is too large
Load Diff
|
@ -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();
|
||||
|
|
|
@ -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);} "")
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue
Block a user