racket/place: fix nested-place termination
This commit is contained in:
parent
a9c0c8bccd
commit
2eb943e0de
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue
Block a user