Fix place-channel place-object race condition
This commit is contained in:
parent
5d66e52fcc
commit
8ed62b715b
|
@ -2138,8 +2138,16 @@ static void place_async_send(Scheme_Place_Async_Channel *ch, Scheme_Object *uo)
|
|||
|
||||
if (!cnt && ch->wakeup_signal) {
|
||||
/*wake up possibly sleeping single receiver */
|
||||
if (SCHEME_PLACE_OBJECTP(ch->wakeup_signal))
|
||||
scheme_signal_received_at(((Scheme_Place_Object *) ch->wakeup_signal)->signal_handle);
|
||||
if (SCHEME_PLACE_OBJECTP(ch->wakeup_signal)) {
|
||||
Scheme_Place_Object *place_obj;
|
||||
place_obj = ((Scheme_Place_Object *) ch->wakeup_signal);
|
||||
|
||||
mzrt_mutex_lock(place_obj->lock);
|
||||
if (place_obj->signal_handle) {
|
||||
scheme_signal_received_at(place_obj->signal_handle);
|
||||
}
|
||||
mzrt_mutex_unlock(place_obj->lock);
|
||||
}
|
||||
/*wake up possibly sleeping multiple receiver */
|
||||
else if (SCHEME_VECTORP(ch->wakeup_signal)) {
|
||||
Scheme_Object *v = ch->wakeup_signal;
|
||||
|
@ -2149,12 +2157,16 @@ static void place_async_send(Scheme_Place_Async_Channel *ch, Scheme_Object *uo)
|
|||
for (i = 0; i < size; i++) {
|
||||
Scheme_Place_Object *o3;
|
||||
o3 = (Scheme_Place_Object *)SCHEME_VEC_ELS(v)[i];
|
||||
if (o3 && o3->signal_handle != NULL) {
|
||||
if (o3) {
|
||||
mzrt_mutex_lock(o3->lock);
|
||||
if (o3->signal_handle != NULL) {
|
||||
scheme_signal_received_at(o3->signal_handle);
|
||||
alive++;
|
||||
}
|
||||
else
|
||||
SCHEME_VEC_ELS(v)[i] = NULL;
|
||||
mzrt_mutex_unlock(o3->lock);
|
||||
}
|
||||
}
|
||||
/* shrink if more than half are unused */
|
||||
if (alive < (size / 2)) {
|
||||
|
|
Loading…
Reference in New Issue
Block a user