racket/place: fix nested-place termination

This commit is contained in:
Matthew Flatt 2014-09-26 06:38:46 -06:00
parent a9c0c8bccd
commit 2eb943e0de

View File

@ -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);