From c6bd8a596d94f377dcde7268d524a49ced994bc7 Mon Sep 17 00:00:00 2001 From: Kevin Tew Date: Wed, 21 Oct 2009 19:42:55 +0000 Subject: [PATCH] Kill off pthread itimer threads for places svn: r16402 --- src/mzscheme/src/env.c | 6 ++++++ src/mzscheme/src/places.c | 1 + src/mzscheme/src/port.c | 34 +++++++++++++++++++++++++++++----- src/mzscheme/src/schpriv.h | 2 ++ 4 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/mzscheme/src/env.c b/src/mzscheme/src/env.c index 42508d4079..79b393f791 100644 --- a/src/mzscheme/src/env.c +++ b/src/mzscheme/src/env.c @@ -495,6 +495,12 @@ Scheme_Env *scheme_place_instance_init(void *stack_base) { return place_instance_init_post_kernel(); } +void scheme_place_instance_destroy() { +#if defined(USE_PTHREAD_THREAD_TIMER) && defined(MZ_USE_PLACES) + kill_green_thread_timer(); +#endif +} + static void make_kernel_env(void) { Scheme_Env *env; diff --git a/src/mzscheme/src/places.c b/src/mzscheme/src/places.c index c1cecf2460..ae56bd1561 100644 --- a/src/mzscheme/src/places.c +++ b/src/mzscheme/src/places.c @@ -254,6 +254,7 @@ static void *place_start_proc(void *data_arg) { a[0] = scheme_places_deep_copy(place_data->channel); scheme_apply(place_main, 1, a); + scheme_place_instance_destroy(); } return scheme_true; diff --git a/src/mzscheme/src/port.c b/src/mzscheme/src/port.c index b63e5c4b34..507c87f973 100644 --- a/src/mzscheme/src/port.c +++ b/src/mzscheme/src/port.c @@ -8444,6 +8444,7 @@ static void scheme_start_itimer_thread(long usec) typedef struct ITimer_Data { int itimer; int state; + int die; pthread_t thread; pthread_mutex_t mutex; pthread_cond_t cond; @@ -8464,16 +8465,21 @@ static void *green_thread_timer(void *data) itimer_data = (ITimer_Data *)data; while (1) { + if (itimer_data->die) { + return NULL; + } usleep(itimer_data->delay); *(itimer_data->fuel_counter_ptr) = 0; *(itimer_data->jit_stack_boundary_ptr) = (unsigned long)-1; pthread_mutex_lock(&itimer_data->mutex); - if (itimer_data->state) { - itimer_data->state = 0; - } else { - itimer_data->state = -1; - pthread_cond_wait(&itimer_data->cond, &itimer_data->mutex); + if (!itimer_data->die) { + if (itimer_data->state) { + itimer_data->state = 0; + } else { + itimer_data->state = -1; + pthread_cond_wait(&itimer_data->cond, &itimer_data->mutex); + } } pthread_mutex_unlock(&itimer_data->mutex); } @@ -8485,6 +8491,7 @@ END_XFORM_SKIP; #endif static void start_green_thread_timer(long usec) { + itimerdata.die = 0; itimerdata.delay = usec; itimerdata.fuel_counter_ptr = &scheme_fuel_counter; itimerdata.jit_stack_boundary_ptr = &scheme_jit_stack_boundary; @@ -8494,6 +8501,23 @@ static void start_green_thread_timer(long usec) { itimerdata.itimer = 1; } +void kill_green_thread_timer() { + void *rc; + pthread_mutex_lock(&itimerdata.mutex); + itimerdata.die = 1; + if (!itimerdata.state) { + /* itimer thread is currently running working */ + } else if (itimerdata.state < 0) { + /* itimer thread is waiting on cond */ + pthread_cond_signal(&itimerdata.cond); + } else { + /* itimer thread is working, and we've already + asked it to continue */ + } + pthread_mutex_unlock(&itimerdata.mutex); + pthread_join(itimerdata.thread, &rc); +} + static void kickoff_green_thread_timer(long usec) { pthread_mutex_lock(&itimerdata.mutex); itimerdata.delay = usec; diff --git a/src/mzscheme/src/schpriv.h b/src/mzscheme/src/schpriv.h index b778dc4083..1b5e1fa9f3 100644 --- a/src/mzscheme/src/schpriv.h +++ b/src/mzscheme/src/schpriv.h @@ -3253,6 +3253,8 @@ typedef struct Scheme_Place { } Scheme_Place; Scheme_Env *scheme_place_instance_init(); +void scheme_place_instance_destroy(); +void kill_green_thread_timer(); /*========================================================================*/ /* engine */