fixes to futures gc interaction code

svn: r16851
This commit is contained in:
James Swaine 2009-11-17 21:27:02 +00:00
parent 1f2a09d31a
commit 7ac3dd6a76
2 changed files with 52 additions and 20 deletions

View File

@ -37,7 +37,16 @@ static pthread_cond_t g_future_pending_cv = PTHREAD_COND_INITIALIZER;
static pthread_mutex_t gc_ok_m = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t gc_ok_m = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t gc_ok_c = PTHREAD_COND_INITIALIZER; static pthread_cond_t gc_ok_c = PTHREAD_COND_INITIALIZER;
static int gc_not_ok; static int gc_not_ok;
#ifdef MZ_PRECISE_GC
extern THREAD_LOCAL unsigned long GC_gen0_alloc_page_ptr; extern THREAD_LOCAL unsigned long GC_gen0_alloc_page_ptr;
#endif
future_t **g_current_ft;
Scheme_Object ***g_scheme_current_runstack;
Scheme_Object ***g_scheme_current_runstack_start;
static void register_traversers(void);
extern void scheme_on_demand_generate_lambda(Scheme_Native_Closure *nc, int argc, Scheme_Object **argv);
static void start_gc_not_ok(); static void start_gc_not_ok();
static void end_gc_not_ok(); static void end_gc_not_ok();
@ -295,6 +304,10 @@ void futures_init(void)
g_rt_threadid = pthread_self(); g_rt_threadid = pthread_self();
g_signal_handle = scheme_get_signal_handle(); g_signal_handle = scheme_get_signal_handle();
#ifdef MZ_PRECISE_GC
register_traversers();
#endif
//Create the worker thread pool. These threads will //Create the worker thread pool. These threads will
//'queue up' and wait for futures to become available //'queue up' and wait for futures to become available
pthread_attr_init(&attr); pthread_attr_init(&attr);
@ -303,6 +316,11 @@ void futures_init(void)
{ {
pthread_create(&threadid, &attr, worker_thread_future_loop, &i); pthread_create(&threadid, &attr, worker_thread_future_loop, &i);
sema_wait(&ready_sema); sema_wait(&ready_sema);
scheme_register_static(g_current_ft, sizeof(void*));
scheme_register_static(g_scheme_current_runstack, sizeof(void*));
scheme_register_static(g_scheme_current_runstack_start, sizeof(void*));
g_pool_threads[i] = threadid; g_pool_threads[i] = threadid;
} }
@ -329,8 +347,11 @@ void scheme_future_block_until_gc()
int i; int i;
for (i = 0; i < THREAD_POOL_SIZE; i++) { for (i = 0; i < THREAD_POOL_SIZE; i++) {
*(g_fuel_pointers[i]) = 0; if (g_fuel_pointers[i] != NULL)
*(g_stack_boundary_pointers[i]) += INITIAL_C_STACK_SIZE; {
*(g_fuel_pointers[i]) = 0;
*(g_stack_boundary_pointers[i]) += INITIAL_C_STACK_SIZE;
}
} }
asm("mfence"); asm("mfence");
@ -346,8 +367,12 @@ void scheme_future_continue_after_gc()
int i; int i;
for (i = 0; i < THREAD_POOL_SIZE; i++) { for (i = 0; i < THREAD_POOL_SIZE; i++) {
*(g_fuel_pointers[i]) = 1; if (g_fuel_pointers[i] != NULL)
*(g_stack_boundary_pointers[i]) -= INITIAL_C_STACK_SIZE; {
*(g_fuel_pointers[i]) = 1;
*(g_stack_boundary_pointers[i]) -= INITIAL_C_STACK_SIZE;
}
} }
} }
@ -402,13 +427,12 @@ Scheme_Object *future(int argc, Scheme_Object *argv[])
LOG_THISCALL; LOG_THISCALL;
#endif #endif
int init_runstack_size, main_runstack_size; int init_runstack_size;
int futureid; int futureid;
future_t *ft; future_t *ft;
Scheme_Native_Closure *nc; Scheme_Native_Closure *nc;
Scheme_Native_Closure_Data *ncd; Scheme_Native_Closure_Data *ncd;
Scheme_Object *lambda = argv[0]; Scheme_Object *lambda = argv[0];
Scheme_Type type = SCHEME_TYPE(lambda);
nc = (Scheme_Native_Closure*)lambda; nc = (Scheme_Native_Closure*)lambda;
ncd = nc->code; ncd = nc->code;
@ -429,8 +453,13 @@ Scheme_Object *future(int argc, Scheme_Object *argv[])
printf("Allocating Scheme stack of %d bytes for future %d.\n", init_runstack_size, futureid); printf("Allocating Scheme stack of %d bytes for future %d.\n", init_runstack_size, futureid);
#endif #endif
ft->runstack_start = scheme_alloc_runstack(init_runstack_size); {
ft->runstack = ft->runstack_start + init_runstack_size; Scheme_Object **rs_start, **rs;
rs_start = scheme_alloc_runstack(init_runstack_size);
rs = rs_start XFORM_OK_PLUS init_runstack_size;
ft->runstack_start = rs_start;
ft->runstack = rs;
}
//pthread_mutex_unlock(&g_future_queue_mutex); //pthread_mutex_unlock(&g_future_queue_mutex);
@ -584,14 +613,16 @@ void *worker_thread_future_loop(void *arg)
scheme_fuel_counter = 1; scheme_fuel_counter = 1;
scheme_jit_stack_boundary = ((unsigned long)&v) - INITIAL_C_STACK_SIZE; scheme_jit_stack_boundary = ((unsigned long)&v) - INITIAL_C_STACK_SIZE;
g_fuel_pointers[id] = &scheme_scheme_fuel_counter; g_fuel_pointers[id] = &scheme_fuel_counter;
g_stack_boundary_pointers[id] = &scheme_scheme_jit_stack_boundary; g_stack_boundary_pointers[id] = &scheme_jit_stack_boundary;
#ifdef MZ_PRECISE_GC
GC_gen0_alloc_page_ptr = 1; /* weirdly, disables inline allocation */ GC_gen0_alloc_page_ptr = 1; /* weirdly, disables inline allocation */
#endif
REGISTER_SO(current_ft); g_current_ft = &current_ft;
REGISTER_SO(scheme_current_runstack); g_scheme_current_runstack = &scheme_current_runstack;
REGISTER_SO(scheme_current_runstack_start); g_scheme_current_runstack_start = &scheme_current_runstack_start;
sema_signal(&ready_sema); sema_signal(&ready_sema);
wait_for_work: wait_for_work:
@ -782,7 +813,7 @@ int rtcall_obj_int_pobj_obj(
#endif #endif
printf("scheme_fuel_counter = %d\n", scheme_fuel_counter); printf("scheme_fuel_counter = %d\n", scheme_fuel_counter);
printf("scheme_jit_stack_boundary = %p\n", scheme_jit_stack_boundary); printf("scheme_jit_stack_boundary = %p\n", (void*)scheme_jit_stack_boundary);
printf("scheme_current_runstack = %p\n", scheme_current_runstack); printf("scheme_current_runstack = %p\n", scheme_current_runstack);
printf("scheme_current_runstack_start = %p\n", scheme_current_runstack_start); printf("scheme_current_runstack_start = %p\n", scheme_current_runstack_start);
printf("stack address = %p\n", &future); printf("stack address = %p\n", &future);
@ -970,8 +1001,9 @@ void *invoke_rtcall(future_t *future)
future_t *enqueue_future(void) future_t *enqueue_future(void)
{ {
future_t *last = get_last_future(); future_t *last, *ft;
future_t *ft = MALLOC_ONE_TAGGED(future_t); last = get_last_future();
ft = MALLOC_ONE_TAGGED(future_t);
ft->so.type = scheme_future_type; ft->so.type = scheme_future_type;
if (NULL == last) if (NULL == last)
{ {
@ -1016,7 +1048,7 @@ future_t *get_future_by_threadid(pthread_t threadid)
future_t *ft = g_future_queue; future_t *ft = g_future_queue;
if (NULL == ft) if (NULL == ft)
{ {
printf("Couldn't find a future with thread ID %p!\n", threadid); printf("Couldn't find a future with thread ID %p!\n", (void*)threadid);
return NULL; return NULL;
} }
@ -1030,7 +1062,7 @@ future_t *get_future_by_threadid(pthread_t threadid)
ft = ft->next; ft = ft->next;
} }
printf("Couldn't find a future with thread ID %p!\n", threadid); printf("Couldn't find a future with thread ID %p!\n", (void*)threadid);
return NULL; return NULL;
END_XFORM_SKIP; END_XFORM_SKIP;
} }

View File

@ -479,7 +479,7 @@ extern int rtcall_obj_int_pobj_obj(
#endif #endif
#if 1 #if 1
#define LOG(a...) do { fprintf(stderr, "%x:%s:%s:%d ", (unsigned) pthread_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(f) LOG("(function=%p)", f)