future repairs
svn: r16881
This commit is contained in:
parent
3b92693146
commit
8c3e5060dd
|
@ -580,7 +580,6 @@ Scheme_Object *touch(int argc, Scheme_Object *argv[])
|
|||
LOG("done.\n");
|
||||
pthread_mutex_lock(&g_future_queue_mutex);
|
||||
|
||||
ft->rt_prim_retval = rtcall_retval;
|
||||
ft->rt_prim = NULL;
|
||||
|
||||
//Signal the waiting worker thread that it
|
||||
|
@ -717,7 +716,8 @@ int future_do_runtimecall(
|
|||
//void *args,
|
||||
void *retval)
|
||||
{
|
||||
future_t *future;
|
||||
START_XFORM_SKIP;
|
||||
future_t *future;
|
||||
|
||||
//If already running on the main thread
|
||||
//or no future is involved, do nothing
|
||||
|
@ -730,7 +730,7 @@ int future_do_runtimecall(
|
|||
}
|
||||
|
||||
//Fetch the future descriptor for this thread
|
||||
future = get_my_future();
|
||||
future = current_ft;
|
||||
|
||||
//set up the arguments for the runtime call
|
||||
//to be picked up by the main rt thread
|
||||
|
@ -755,16 +755,16 @@ int future_do_runtimecall(
|
|||
pthread_cond_wait(&worker_can_continue_cv, &g_future_queue_mutex);
|
||||
start_gc_not_ok();
|
||||
|
||||
//Fetch the future instance again, in case the GC has moved the pointer
|
||||
future = get_my_future();
|
||||
//Fetch the future instance again, in case the GC has moved the pointer
|
||||
future = current_ft;
|
||||
|
||||
//Clear rt call fields before releasing the lock on the descriptor
|
||||
future->rt_prim = NULL;
|
||||
|
||||
retval = future->rt_prim_retval;
|
||||
future->rt_prim_retval = NULL;
|
||||
pthread_mutex_unlock(&g_future_queue_mutex);
|
||||
|
||||
return 1;
|
||||
END_XFORM_SKIP;
|
||||
}
|
||||
|
||||
|
||||
|
@ -785,11 +785,12 @@ int rtcall_void_void(void (*f)())
|
|||
data.void_void = f;
|
||||
data.sigtype = SIG_VOID_VOID;
|
||||
|
||||
future = get_my_future();
|
||||
future = current_ft;
|
||||
future->rt_prim = (void*)f;
|
||||
future->prim_data = data;
|
||||
|
||||
future_do_runtimecall((void*)f, NULL);
|
||||
future = current_ft;
|
||||
|
||||
return 1;
|
||||
END_XFORM_SKIP;
|
||||
|
@ -812,11 +813,12 @@ int rtcall_alloc_void_pvoid(void (*f)(), void **retval)
|
|||
data.alloc_void_pvoid = f;
|
||||
data.sigtype = SIG_ALLOC_VOID_PVOID;
|
||||
|
||||
future = get_my_future();
|
||||
future = current_ft;
|
||||
future->rt_prim = (void*)f;
|
||||
future->prim_data = data;
|
||||
|
||||
future_do_runtimecall((void*)f, NULL);
|
||||
future = current_ft;
|
||||
|
||||
*retval = future->alloc_retval;
|
||||
future->alloc_retval = NULL;
|
||||
|
@ -860,11 +862,12 @@ int rtcall_obj_int_pobj_obj(
|
|||
data.argv = argv;
|
||||
data.sigtype = SIG_OBJ_INT_POBJ_OBJ;
|
||||
|
||||
future = get_my_future();
|
||||
future = current_ft;
|
||||
future->rt_prim = (void*)f;
|
||||
future->prim_data = data;
|
||||
|
||||
future_do_runtimecall((void*)f, NULL);
|
||||
future = current_ft;
|
||||
*retval = future->prim_data.retval;
|
||||
future->prim_data.retval = NULL;
|
||||
|
||||
|
@ -901,11 +904,12 @@ int rtcall_int_pobj_obj(
|
|||
data.argv = argv;
|
||||
data.sigtype = SIG_INT_OBJARR_OBJ;
|
||||
|
||||
future = get_my_future();
|
||||
future = current_ft;
|
||||
future->rt_prim = (void*)f;
|
||||
future->prim_data = data;
|
||||
|
||||
future_do_runtimecall((void*)f, NULL);
|
||||
future = current_ft;
|
||||
*retval = future->prim_data.retval;
|
||||
future->prim_data.retval = NULL;
|
||||
|
||||
|
@ -942,11 +946,12 @@ int rtcall_pvoid_pvoid_pvoid(
|
|||
data.b = b;
|
||||
data.sigtype = SIG_PVOID_PVOID_PVOID;
|
||||
|
||||
future = get_my_future();
|
||||
future = current_ft;
|
||||
future->rt_prim = (void*)f;
|
||||
future->prim_data = data;
|
||||
|
||||
future_do_runtimecall((void*)f, NULL);
|
||||
future = current_ft;
|
||||
*retval = future->prim_data.c;
|
||||
|
||||
return 1;
|
||||
|
@ -984,11 +989,12 @@ int rtcall_int_pobj_obj_obj(
|
|||
data.p = p;
|
||||
data.sigtype = SIG_INT_POBJ_OBJ_OBJ;
|
||||
|
||||
future = get_my_future();
|
||||
future = current_ft;
|
||||
future->rt_prim = (void*)f;
|
||||
future->prim_data = data;
|
||||
|
||||
future_do_runtimecall((void*)f, NULL);
|
||||
future = current_ft;
|
||||
*retval = future->prim_data.retval;
|
||||
future->prim_data.retval = NULL;
|
||||
|
||||
|
@ -1002,7 +1008,6 @@ int rtcall_int_pobj_obj_obj(
|
|||
void *invoke_rtcall(future_t *future)
|
||||
{
|
||||
void *pret = NULL, *dummy_ret;
|
||||
prim_data_t *pdata;
|
||||
|
||||
//Temporarily use the worker thread's runstack
|
||||
Scheme_Object *ret;
|
||||
|
@ -1013,12 +1018,11 @@ void *invoke_rtcall(future_t *future)
|
|||
g_rtcall_count++;
|
||||
#endif
|
||||
|
||||
pdata = &future->prim_data;
|
||||
switch (future->prim_data.sigtype)
|
||||
{
|
||||
case SIG_VOID_VOID:
|
||||
{
|
||||
prim_void_void_t func = pdata->void_void;
|
||||
prim_void_void_t func = future->prim_data.void_void;
|
||||
func();
|
||||
|
||||
pret = &dummy_ret;
|
||||
|
@ -1026,7 +1030,7 @@ void *invoke_rtcall(future_t *future)
|
|||
}
|
||||
case SIG_ALLOC_VOID_PVOID:
|
||||
{
|
||||
prim_alloc_void_pvoid_t func = pdata->alloc_void_pvoid;
|
||||
prim_alloc_void_pvoid_t func = future->prim_data.alloc_void_pvoid;
|
||||
ret = func();
|
||||
future->alloc_retval = ret;
|
||||
future->alloc_retval_counter = scheme_did_gc_count;
|
||||
|
@ -1034,61 +1038,61 @@ void *invoke_rtcall(future_t *future)
|
|||
}
|
||||
case SIG_OBJ_INT_POBJ_OBJ:
|
||||
{
|
||||
prim_obj_int_pobj_obj_t func = pdata->obj_int_pobj_obj;
|
||||
prim_obj_int_pobj_obj_t func = future->prim_data.obj_int_pobj_obj;
|
||||
ret = func(
|
||||
pdata->p,
|
||||
pdata->argc,
|
||||
pdata->argv);
|
||||
future->prim_data.p,
|
||||
future->prim_data.argc,
|
||||
future->prim_data.argv);
|
||||
|
||||
pdata->retval = ret;
|
||||
future->prim_data.retval = ret;
|
||||
|
||||
/*pdata->retval = pdata->prim_obj_int_pobj_obj(
|
||||
pdata->p,
|
||||
pdata->argc,
|
||||
pdata->argv); */
|
||||
/*future->prim_data.retval = future->prim_data.prim_obj_int_pobj_obj(
|
||||
future->prim_data.p,
|
||||
future->prim_data.argc,
|
||||
future->prim_data.argv); */
|
||||
|
||||
break;
|
||||
}
|
||||
case SIG_INT_OBJARR_OBJ:
|
||||
{
|
||||
prim_int_pobj_obj_t func = pdata->int_pobj_obj;
|
||||
prim_int_pobj_obj_t func = future->prim_data.int_pobj_obj;
|
||||
ret = func(
|
||||
pdata->argc,
|
||||
pdata->argv);
|
||||
future->prim_data.argc,
|
||||
future->prim_data.argv);
|
||||
|
||||
pdata->retval = ret;
|
||||
future->prim_data.retval = ret;
|
||||
|
||||
/*pdata->retval = pdata->prim_int_pobj_obj(
|
||||
pdata->argc,
|
||||
pdata->argv);
|
||||
/*future->prim_data.retval = future->prim_data.prim_int_pobj_obj(
|
||||
future->prim_data.argc,
|
||||
future->prim_data.argv);
|
||||
*/
|
||||
break;
|
||||
}
|
||||
case SIG_INT_POBJ_OBJ_OBJ:
|
||||
{
|
||||
prim_int_pobj_obj_obj_t func = pdata->int_pobj_obj_obj;
|
||||
prim_int_pobj_obj_obj_t func = future->prim_data.int_pobj_obj_obj;
|
||||
ret = func(
|
||||
pdata->argc,
|
||||
pdata->argv,
|
||||
pdata->p);
|
||||
future->prim_data.argc,
|
||||
future->prim_data.argv,
|
||||
future->prim_data.p);
|
||||
|
||||
pdata->retval = ret;
|
||||
/*pdata->retval = pdata->prim_int_pobj_obj_obj(
|
||||
pdata->argc,
|
||||
pdata->argv,
|
||||
pdata->p);
|
||||
future->prim_data.retval = ret;
|
||||
/*future->prim_data.retval = future->prim_data.prim_int_pobj_obj_obj(
|
||||
future->prim_data.argc,
|
||||
future->prim_data.argv,
|
||||
future->prim_data.p);
|
||||
*/
|
||||
break;
|
||||
}
|
||||
case SIG_PVOID_PVOID_PVOID:
|
||||
{
|
||||
prim_pvoid_pvoid_pvoid_t func = pdata->pvoid_pvoid_pvoid;
|
||||
pret = func(pdata->a, pdata->b);
|
||||
prim_pvoid_pvoid_pvoid_t func = future->prim_data.pvoid_pvoid_pvoid;
|
||||
pret = func(future->prim_data.a, future->prim_data.b);
|
||||
|
||||
pdata->c = pret;
|
||||
/*pdata->c = pdata->prim_pvoid_pvoid_pvoid(
|
||||
pdata->a,
|
||||
pdata->b);
|
||||
future->prim_data.c = pret;
|
||||
/*future->prim_data.c = future->prim_data.prim_pvoid_pvoid_pvoid(
|
||||
future->prim_data.a,
|
||||
future->prim_data.b);
|
||||
*/
|
||||
break;
|
||||
}
|
||||
|
@ -1141,14 +1145,6 @@ future_t *get_pending_future(void)
|
|||
}
|
||||
|
||||
|
||||
future_t *get_my_future(void)
|
||||
{
|
||||
START_XFORM_SKIP;
|
||||
return get_future_by_threadid(pthread_self());
|
||||
END_XFORM_SKIP;
|
||||
}
|
||||
|
||||
|
||||
future_t *get_future_by_threadid(pthread_t threadid)
|
||||
{
|
||||
START_XFORM_SKIP;
|
||||
|
|
|
@ -88,7 +88,6 @@ typedef struct future {
|
|||
|
||||
//Runtime call stuff
|
||||
void *rt_prim;
|
||||
void *rt_prim_retval;
|
||||
|
||||
prim_data_t prim_data;
|
||||
void *alloc_retval;
|
||||
|
|
|
@ -5423,7 +5423,6 @@ static int future_MARK(void *p) {
|
|||
gcMARK(f->runstack);
|
||||
gcMARK(f->runstack_start);
|
||||
gcMARK(f->orig_lambda);
|
||||
gcMARK(f->rt_prim_retval);
|
||||
gcMARK(f->prim_data.p);
|
||||
gcMARK(f->prim_data.argv);
|
||||
gcMARK(f->prim_data.retval);
|
||||
|
@ -5439,7 +5438,6 @@ static int future_FIXUP(void *p) {
|
|||
gcFIXUP(f->runstack);
|
||||
gcFIXUP(f->runstack_start);
|
||||
gcFIXUP(f->orig_lambda);
|
||||
gcFIXUP(f->rt_prim_retval);
|
||||
gcFIXUP(f->prim_data.p);
|
||||
gcFIXUP(f->prim_data.argv);
|
||||
gcFIXUP(f->prim_data.retval);
|
||||
|
|
|
@ -2226,7 +2226,6 @@ future {
|
|||
gcMARK(f->runstack);
|
||||
gcMARK(f->runstack_start);
|
||||
gcMARK(f->orig_lambda);
|
||||
gcMARK(f->rt_prim_retval);
|
||||
gcMARK(f->prim_data.p);
|
||||
gcMARK(f->prim_data.argv);
|
||||
gcMARK(f->prim_data.retval);
|
||||
|
|
Loading…
Reference in New Issue
Block a user