pr 12268 fix merge to 5.2

(cherry picked from commit 58b1f86326)
This commit is contained in:
Kevin Tew 2011-10-08 12:49:18 -06:00 committed by Eli Barzilay
parent f108ea8861
commit 566c36c4f2

View File

@ -2465,38 +2465,40 @@ static void async_channel_finalize(void *p, void* data) {
ch->out = 0; ch->out = 0;
ch->count = 0; ch->count = 0;
/*release single receiver */ if (ch->wakeup_signal) {
if (SCHEME_PLACE_OBJECTP(ch->wakeup_signal)) { /*release single receiver */
int refcount = 0; if (SCHEME_PLACE_OBJECTP(ch->wakeup_signal)) {
Scheme_Place_Object *place_obj; int refcount = 0;
place_obj = ((Scheme_Place_Object *) ch->wakeup_signal); Scheme_Place_Object *place_obj;
place_obj = ((Scheme_Place_Object *) ch->wakeup_signal);
mzrt_mutex_lock(place_obj->lock); mzrt_mutex_lock(place_obj->lock);
place_obj->refcount--; place_obj->refcount--;
refcount = place_obj->refcount; refcount = place_obj->refcount;
mzrt_mutex_unlock(place_obj->lock); mzrt_mutex_unlock(place_obj->lock);
if (!refcount) { if (!refcount) {
destroy_place_object_locks(place_obj); destroy_place_object_locks(place_obj);
}
} }
} /*release multiple receiver */
/*release multiple receiver */ else if (SCHEME_VECTORP(ch->wakeup_signal)) {
else if (SCHEME_VECTORP(ch->wakeup_signal)) { Scheme_Object *v = ch->wakeup_signal;
Scheme_Object *v = ch->wakeup_signal; int i;
int i; int size = SCHEME_VEC_SIZE(v);
int size = SCHEME_VEC_SIZE(v); for (i = 0; i < size; i++) {
for (i = 0; i < size; i++) { Scheme_Place_Object *o3;
Scheme_Place_Object *o3; o3 = (Scheme_Place_Object *)SCHEME_VEC_ELS(v)[i];
o3 = (Scheme_Place_Object *)SCHEME_VEC_ELS(v)[i]; if (o3) {
if (o3) { int refcount = 0;
int refcount = 0; mzrt_mutex_lock(o3->lock);
mzrt_mutex_lock(o3->lock); SCHEME_VEC_ELS(v)[i] = NULL;
SCHEME_VEC_ELS(v)[i] = NULL; o3->refcount--;
o3->refcount--; refcount = o3->refcount;
refcount = o3->refcount; mzrt_mutex_unlock(o3->lock);
mzrt_mutex_unlock(o3->lock);
if (!refcount) { if (!refcount) {
destroy_place_object_locks(o3); destroy_place_object_locks(o3);
}
} }
} }
} }