From 2eb943e0dec93c24b3c7a9e1cb44773853fe3df6 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Fri, 26 Sep 2014 06:38:46 -0600 Subject: [PATCH] racket/place: fix nested-place termination --- racket/src/racket/src/place.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/racket/src/racket/src/place.c b/racket/src/racket/src/place.c index 33b7b476ec..134032c5bc 100644 --- a/racket/src/racket/src/place.c +++ b/racket/src/racket/src/place.c @@ -566,6 +566,8 @@ static void do_place_kill(Scheme_Place *place) place->result = place_obj->result; + place_obj->parent_signal_handle = NULL; + if (refcount) resume_one_place_with_lock(place_obj); @@ -1162,7 +1164,7 @@ static int place_wait_ready(Scheme_Object *_p) { if (!p->place_obj) return 1; mzrt_mutex_lock(p->place_obj->lock); - done = !p->place_obj->parent_signal_handle; + done = p->place_obj->dead; mzrt_mutex_unlock(p->place_obj->lock); if (done) { @@ -2558,7 +2560,8 @@ void scheme_place_set_memory_use(intptr_t mem_use) scheme_signal_received_at(place_obj->parent_signal_handle); } else if (mem_use > (1 + place_obj->use_factor) * place_obj->prev_notify_memory_use) { /* make sure the parent notices that we're using more memory: */ - scheme_signal_received_at(place_obj->parent_signal_handle); + if (place_obj->parent_signal_handle) + scheme_signal_received_at(place_obj->parent_signal_handle); place_obj->prev_notify_memory_use = mem_use; } else if (mem_use < place_obj->prev_notify_memory_use) { place_obj->prev_notify_memory_use = mem_use; @@ -2594,8 +2597,10 @@ static void place_set_result(struct Scheme_Place_Object *place_obj, Scheme_Objec mzrt_mutex_lock(place_obj->lock); place_obj->result = status; - scheme_signal_received_at(place_obj->parent_signal_handle); - place_obj->parent_signal_handle = NULL; + if (place_obj->parent_signal_handle) { + scheme_signal_received_at(place_obj->parent_signal_handle); + place_obj->parent_signal_handle = NULL; + } place_obj->signal_handle = NULL; place_obj->dead = 1; mzrt_mutex_unlock(place_obj->lock);