future repairs

svn: r16884
This commit is contained in:
Matthew Flatt 2009-11-18 23:12:00 +00:00
parent b80c782046
commit 77ae545fe6
6 changed files with 708 additions and 738 deletions

View File

@ -702,7 +702,6 @@ static void *allocate_medium(const size_t request_size_bytes, const int type)
} }
} }
inline static mpage *gen0_create_new_nursery_mpage(NewGC *gc, const size_t page_size) { inline static mpage *gen0_create_new_nursery_mpage(NewGC *gc, const size_t page_size) {
mpage *newmpage; mpage *newmpage;
@ -1047,7 +1046,7 @@ inline static void resize_gen0(NewGC *gc, unsigned long new_size)
{ {
mpage *work = gc->thread_local_pages; mpage *work = gc->thread_local_pages;
while(work) { while(work) {
mpage *next = work->next; mpage *next = work->next;
gen0_free_jit_nursery_page(gc, work); gen0_free_jit_nursery_page(gc, work);
work = next; work = next;
} }
@ -2115,7 +2114,7 @@ void GC_mark(const void *const_p)
/* Allocate and prep the page */ /* Allocate and prep the page */
work = malloc_mpage(); work = malloc_mpage();
work->addr = malloc_dirty_pages(gc, APAGE_SIZE, APAGE_SIZE); work->addr = malloc_dirty_pages(gc, APAGE_SIZE, APAGE_SIZE);
work->generation = 1; work->generation = 1;
work->page_type = type; work->page_type = type;
work->size = work->previous_size = PREFIX_SIZE; work->size = work->previous_size = PREFIX_SIZE;
work->marked_on = 1; work->marked_on = 1;

File diff suppressed because it is too large Load Diff

View File

@ -32,7 +32,7 @@ extern Scheme_Object *num_processors(int argc, Scheme_Object *argv[]);
extern int future_do_runtimecall(void *func, void *retval); extern int future_do_runtimecall(void *func, void *retval);
extern void futures_init(void); extern void futures_init(void);
typedef void (*prim_void_void_t)(void); typedef void (*prim_void_void_3args_t)(Scheme_Object **);
typedef void *(*prim_alloc_void_pvoid_t)(void); typedef void *(*prim_alloc_void_pvoid_t)(void);
typedef Scheme_Object* (*prim_obj_int_pobj_obj_t)(Scheme_Object*, int, Scheme_Object**); 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_t)(int, Scheme_Object**);
@ -42,7 +42,7 @@ typedef void* (*prim_pvoid_pvoid_pvoid_t)(void*, void*);
typedef struct { typedef struct {
unsigned int sigtype; unsigned int sigtype;
prim_void_void_t void_void; prim_void_void_3args_t void_void_3args;
prim_alloc_void_pvoid_t alloc_void_pvoid; prim_alloc_void_pvoid_t alloc_void_pvoid;
prim_obj_int_pobj_obj_t obj_int_pobj_obj; prim_obj_int_pobj_obj_t obj_int_pobj_obj;
prim_int_pobj_obj_t int_pobj_obj; prim_int_pobj_obj_t int_pobj_obj;
@ -153,7 +153,7 @@ extern void print_ms_and_us(void);
//Signature flags for primitive invocations //Signature flags for primitive invocations
//Here the convention is SIG_[arg1type]_[arg2type]..._[return type] //Here the convention is SIG_[arg1type]_[arg2type]..._[return type]
#define SIG_VOID_VOID 1 //void -> void #define SIG_VOID_VOID_3ARGS 1 //void -> void, copy 3 args from runstack
#define SIG_ALLOC_VOID_PVOID 2 //void -> void* #define SIG_ALLOC_VOID_PVOID 2 //void -> void*
#define SIG_OBJ_INT_POBJ_OBJ 3 //Scheme_Object* -> int -> Scheme_Object** -> Scheme_Object* #define SIG_OBJ_INT_POBJ_OBJ 3 //Scheme_Object* -> int -> Scheme_Object** -> Scheme_Object*
#define SIG_INT_OBJARR_OBJ 4 //int -> Scheme_Object*[] -> Scheme_Object #define SIG_INT_OBJARR_OBJ 4 //int -> Scheme_Object*[] -> Scheme_Object
@ -170,7 +170,7 @@ extern void print_ms_and_us(void);
/*GDB_BREAK;*/ \ /*GDB_BREAK;*/ \
} }
extern int rtcall_void_void(void (*f)()); extern int rtcall_void_void_3args(void (*f)());
extern int rtcall_alloc_void_pvoid(void (*f)(), void **retval); extern int rtcall_alloc_void_pvoid(void (*f)(), void **retval);
extern int rtcall_obj_int_pobj_obj( extern int rtcall_obj_int_pobj_obj(
Scheme_Object* (*f)(Scheme_Object*, int, Scheme_Object**), Scheme_Object* (*f)(Scheme_Object*, int, Scheme_Object**),
@ -196,7 +196,7 @@ extern int rtcall_int_pobj_obj(
#define LOG(a...) do { pthread_t self; self = pthread_self(); fprintf(stderr, "%x:%s:%s:%d ", (unsigned) self, __FILE__, __FUNCTION__, __LINE__); fprintf(stderr, a); fprintf(stderr, "\n"); fflush(stdout); } while(0) #define LOG(a...) do { pthread_t self; self = pthread_self(); fprintf(stderr, "%x:%s:%s:%d ", (unsigned) self, __FILE__, __FUNCTION__, __LINE__); fprintf(stderr, a); fprintf(stderr, "\n"); fflush(stdout); } while(0)
#define LOG_THISCALL LOG(__FUNCTION__) #define LOG_THISCALL LOG(__FUNCTION__)
#define LOG_RTCALL_VOID_VOID(f) LOG("(function=%p)", f) #define LOG_RTCALL_VOID_VOID_3ARGS(f) LOG("(function=%p)", f)
#define LOG_RTCALL_ALLOC_VOID_PVOID(f) LOG("(function=%p)", f) #define LOG_RTCALL_ALLOC_VOID_PVOID(f) LOG("(function=%p)", f)
#define LOG_RTCALL_OBJ_INT_POBJ_OBJ(f,a,b,c) LOG("(function = %p, a=%p, b=%d, c=%p)", f, a, b, c) #define LOG_RTCALL_OBJ_INT_POBJ_OBJ(f,a,b,c) LOG("(function = %p, a=%p, b=%d, c=%p)", f, a, b, c)
#define LOG_RTCALL_OBJ_INT_POBJ_VOID(a,b,c) LOG("(%p, %d, %p)", a, b,c) #define LOG_RTCALL_OBJ_INT_POBJ_VOID(a,b,c) LOG("(%p, %d, %p)", a, b,c)
@ -219,7 +219,7 @@ extern int rtcall_int_pobj_obj(
#define LOG(a...) #define LOG(a...)
#define LOG_THISCALL #define LOG_THISCALL
#define LOG_RTCALL_VOID_VOID(f) #define LOG_RTCALL_VOID_VOID_3ARGS(f)
#define LOG_RTCALL_ALLOC_VOID_PVOID(f) #define LOG_RTCALL_ALLOC_VOID_PVOID(f)
#define LOG_RTCALL_OBJ_INT_POBJ_OBJ(f,a,b,c) #define LOG_RTCALL_OBJ_INT_POBJ_OBJ(f,a,b,c)
#define LOG_RTCALL_OBJ_INT_POBJ_VOID(a,b,c) #define LOG_RTCALL_OBJ_INT_POBJ_VOID(a,b,c)

View File

@ -211,6 +211,7 @@ static void *generate_lambda_simple_arity_check(int num_params, int has_rest, in
static void generate_case_lambda(Scheme_Case_Lambda *c, Scheme_Native_Closure_Data *ndata, static void generate_case_lambda(Scheme_Case_Lambda *c, Scheme_Native_Closure_Data *ndata,
int is_method); int is_method);
static void on_demand(); static void on_demand();
static void on_demand_with_args(Scheme_Object **);
static int generate_non_tail_mark_pos_prefix(mz_jit_state *jitter); static int generate_non_tail_mark_pos_prefix(mz_jit_state *jitter);
static void generate_non_tail_mark_pos_suffix(mz_jit_state *jitter); static void generate_non_tail_mark_pos_suffix(mz_jit_state *jitter);
static void *generate_shared_call(int num_rands, mz_jit_state *old_jitter, int multi_ok, int is_tail, static void *generate_shared_call(int num_rands, mz_jit_state *old_jitter, int multi_ok, int is_tail,
@ -2235,7 +2236,7 @@ static Scheme_Object *ts_scheme_tail_apply_from_native(Scheme_Object *rator, int
static void ts_on_demand(void) static void ts_on_demand(void)
{ {
START_XFORM_SKIP; START_XFORM_SKIP;
if (rtcall_void_void(on_demand)) { if (rtcall_void_void_3args(on_demand_with_args)) {
return; return;
} }
@ -9471,18 +9472,23 @@ void scheme_on_demand_generate_lambda(Scheme_Native_Closure *nc, int argc, Schem
ndata->max_let_depth = max_depth; ndata->max_let_depth = max_depth;
} }
static void on_demand() static void on_demand_with_args(Scheme_Object **in_argv)
{ {
/* On runstack: closure (nearest), argc, argv (deepest) */ /* On runstack: closure (nearest), argc, argv (deepest) */
Scheme_Object *c, *argc, **argv; Scheme_Object *c, *argc, **argv;
c = MZ_RUNSTACK[0]; c = in_argv[0];
argc = MZ_RUNSTACK[1]; argc = in_argv[1];
argv = (Scheme_Object **)MZ_RUNSTACK[2]; argv = (Scheme_Object **)in_argv[2];
scheme_on_demand_generate_lambda((Scheme_Native_Closure *)c, SCHEME_INT_VAL(argc), argv); scheme_on_demand_generate_lambda((Scheme_Native_Closure *)c, SCHEME_INT_VAL(argc), argv);
} }
static void on_demand()
{
return on_demand_with_args(MZ_RUNSTACK);
}
Scheme_Native_Closure_Data *scheme_generate_lambda(Scheme_Closure_Data *data, int clear_code_after_jit, Scheme_Native_Closure_Data *scheme_generate_lambda(Scheme_Closure_Data *data, int clear_code_after_jit,
Scheme_Native_Closure_Data *case_lam) Scheme_Native_Closure_Data *case_lam)
{ {

View File

@ -428,6 +428,8 @@ void scheme_block_child_signals(int block);
void scheme_check_child_done(void); void scheme_check_child_done(void);
#endif #endif
void scheme_prepare_this_thread_for_GC(Scheme_Thread *t);
Scheme_Object **scheme_alloc_runstack(long len); Scheme_Object **scheme_alloc_runstack(long len);
void scheme_set_runstack_limits(Scheme_Object **rs, long len, long start, long end); void scheme_set_runstack_limits(Scheme_Object **rs, long len, long start, long end);

View File

@ -281,8 +281,6 @@ typedef struct {
static void register_traversers(void); static void register_traversers(void);
#endif #endif
static void prepare_this_thread_for_GC(Scheme_Thread *t);
static Scheme_Object *custodian_require_mem(int argc, Scheme_Object *args[]); static Scheme_Object *custodian_require_mem(int argc, Scheme_Object *args[]);
static Scheme_Object *custodian_limit_mem(int argc, Scheme_Object *args[]); static Scheme_Object *custodian_limit_mem(int argc, Scheme_Object *args[]);
static Scheme_Object *custodian_can_mem(int argc, Scheme_Object *args[]); static Scheme_Object *custodian_can_mem(int argc, Scheme_Object *args[]);
@ -3279,7 +3277,7 @@ Scheme_Object *scheme_call_as_nested_thread(int argc, Scheme_Object *argv[], voi
/* zero out anything we need now, because nestee disables /* zero out anything we need now, because nestee disables
GC cleaning for this thread: */ GC cleaning for this thread: */
prepare_this_thread_for_GC(p); scheme_prepare_this_thread_for_GC(p);
if (!p->runstack_owner) { if (!p->runstack_owner) {
Scheme_Thread **owner; Scheme_Thread **owner;
@ -4428,7 +4426,7 @@ void scheme_weak_suspend_thread(Scheme_Thread *r)
r->running |= MZTHREAD_SUSPENDED; r->running |= MZTHREAD_SUSPENDED;
prepare_this_thread_for_GC(r); scheme_prepare_this_thread_for_GC(r);
if (r == scheme_current_thread) { if (r == scheme_current_thread) {
select_thread(); select_thread();
@ -7329,7 +7327,7 @@ static void prepare_thread_for_GC(Scheme_Object *t)
scheme_clean_list_stack(p); scheme_clean_list_stack(p);
} }
static void prepare_this_thread_for_GC(Scheme_Thread *p) void scheme_prepare_this_thread_for_GC(Scheme_Thread *p)
{ {
if (p == scheme_current_thread) { if (p == scheme_current_thread) {
#ifdef RUNSTACK_IS_GLOBAL #ifdef RUNSTACK_IS_GLOBAL