From 72f4eec8c80c6ed7004208f0f905508a0c5098fd Mon Sep 17 00:00:00 2001 From: James Swaine Date: Tue, 17 Nov 2009 20:13:17 +0000 Subject: [PATCH] futures bug fixes svn: r16844 --- src/mzscheme/gc2/gc2.h | 2 +- src/mzscheme/src/future.c | 20 +++----------------- src/mzscheme/src/mzmark.c | 8 ++++---- 3 files changed, 8 insertions(+), 22 deletions(-) diff --git a/src/mzscheme/gc2/gc2.h b/src/mzscheme/gc2/gc2.h index eadb9b8a62..e197680ab3 100644 --- a/src/mzscheme/gc2/gc2.h +++ b/src/mzscheme/gc2/gc2.h @@ -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 diff --git a/src/mzscheme/src/future.c b/src/mzscheme/src/future.c index 4e2ff3bae0..08b8975a22 100644 --- a/src/mzscheme/src/future.c +++ b/src/mzscheme/src/future.c @@ -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; diff --git a/src/mzscheme/src/mzmark.c b/src/mzscheme/src/mzmark.c index 236a9f1011..c7b1374560 100644 --- a/src/mzscheme/src/mzmark.c +++ b/src/mzscheme/src/mzmark.c @@ -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);