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->count = 0;
/*release single receiver */
if (SCHEME_PLACE_OBJECTP(ch->wakeup_signal)) {
int refcount = 0;
Scheme_Place_Object *place_obj;
place_obj = ((Scheme_Place_Object *) ch->wakeup_signal);
if (ch->wakeup_signal) {
/*release single receiver */
if (SCHEME_PLACE_OBJECTP(ch->wakeup_signal)) {
int refcount = 0;
Scheme_Place_Object *place_obj;
place_obj = ((Scheme_Place_Object *) ch->wakeup_signal);
mzrt_mutex_lock(place_obj->lock);
place_obj->refcount--;
refcount = place_obj->refcount;
mzrt_mutex_unlock(place_obj->lock);
if (!refcount) {
destroy_place_object_locks(place_obj);
mzrt_mutex_lock(place_obj->lock);
place_obj->refcount--;
refcount = place_obj->refcount;
mzrt_mutex_unlock(place_obj->lock);
if (!refcount) {
destroy_place_object_locks(place_obj);
}
}
}
/*release multiple receiver */
else if (SCHEME_VECTORP(ch->wakeup_signal)) {
Scheme_Object *v = ch->wakeup_signal;
int i;
int size = SCHEME_VEC_SIZE(v);
for (i = 0; i < size; i++) {
Scheme_Place_Object *o3;
o3 = (Scheme_Place_Object *)SCHEME_VEC_ELS(v)[i];
if (o3) {
int refcount = 0;
mzrt_mutex_lock(o3->lock);
SCHEME_VEC_ELS(v)[i] = NULL;
o3->refcount--;
refcount = o3->refcount;
mzrt_mutex_unlock(o3->lock);
/*release multiple receiver */
else if (SCHEME_VECTORP(ch->wakeup_signal)) {
Scheme_Object *v = ch->wakeup_signal;
int i;
int size = SCHEME_VEC_SIZE(v);
for (i = 0; i < size; i++) {
Scheme_Place_Object *o3;
o3 = (Scheme_Place_Object *)SCHEME_VEC_ELS(v)[i];
if (o3) {
int refcount = 0;
mzrt_mutex_lock(o3->lock);
SCHEME_VEC_ELS(v)[i] = NULL;
o3->refcount--;
refcount = o3->refcount;
mzrt_mutex_unlock(o3->lock);
if (!refcount) {
destroy_place_object_locks(o3);
if (!refcount) {
destroy_place_object_locks(o3);
}
}
}
}