futures bug fixes

svn: r16844
This commit is contained in:
James Swaine 2009-11-17 20:13:17 +00:00
parent a145f096cb
commit 72f4eec8c8
3 changed files with 8 additions and 22 deletions

View File

@ -2,7 +2,7 @@
#ifndef __mzscheme_gc_2__
#define __mzscheme_gc_2__
#ifdef MZ_USE_PLACES
#if defined(MZ_USE_PLACES) || defined(FUTURES_ENABLED)
# if _MSC_VER
# define THREAD_LOCAL __declspec(thread)
# else

View File

@ -367,7 +367,7 @@ Scheme_Object *future(int argc, Scheme_Object *argv[])
pthread_cond_signal(&g_future_pending_cv);
pthread_mutex_unlock(&g_future_queue_mutex);
return scheme_make_integer(futureid);
return (Scheme_Object*)ft;
END_XFORM_SKIP;
}
@ -399,29 +399,14 @@ Scheme_Object *touch(int argc, Scheme_Object *argv[])
Scheme_Object *retval = NULL;
void *rtcall_retval = NULL;
future_t *ft;
int futureid;
futureid = SCHEME_INT_VAL(argv[0]);
ft = (future_t*)argv[0];
#ifdef DEBUG_FUTURES
LOG("touch (future %d)", futureid);
dump_state();
if (SCHEME_INTP(argv[0]))
{
printf("Future id passed to touch was %d, is a Scheme integer.\n", futureid);
}
else
{
printf("Arg passed to touch was a %d.\n", SCHEME_TYPE(argv[0]));
}
fflush(stdout);
#endif
pthread_mutex_lock(&g_future_queue_mutex);
ft = get_future(futureid);
pthread_mutex_unlock(&g_future_queue_mutex);
//Spin waiting for primitive calls or a return value from
//the worker thread
wait_for_rtcall_or_completion:
@ -888,6 +873,7 @@ future_t *enqueue_future(void)
future_t *last = get_last_future();
future_t *ft = (future_t*)malloc(sizeof(future_t));
memset(ft, 0, sizeof(future_t));
ft->so.type = scheme_future_type;
if (NULL == last)
{
g_future_queue = ft;

View File

@ -5422,9 +5422,9 @@ static int future_MARK(void *p) {
future_t *f = (future_t *)p;
gcMARK(f->runstack);
gcMARK(f->runstack_start);
gcMARK(f->orig_thread);
gcMARK(f->orig_lambda);
gcMARK(f->rt_prim_args);
gcMARK(f->rt_prim_result);
gcMARK(f->rt_prim_retval);
gcMARK(f->retval);
gcMARK(f->prev);
gcMARK(f->next);
@ -5436,9 +5436,9 @@ static int future_FIXUP(void *p) {
future_t *f = (future_t *)p;
gcFIXUP(f->runstack);
gcFIXUP(f->runstack_start);
gcFIXUP(f->orig_thread);
gcFIXUP(f->orig_lambda);
gcFIXUP(f->rt_prim_args);
gcFIXUP(f->rt_prim_result);
gcFIXUP(f->rt_prim_retval);
gcFIXUP(f->retval);
gcFIXUP(f->prev);
gcFIXUP(f->next);