From 8ed62b715b5304a008b3c12b781321682b02653b Mon Sep 17 00:00:00 2001 From: Kevin Tew Date: Thu, 7 Jul 2011 15:15:56 -0600 Subject: [PATCH] Fix place-channel place-object race condition --- src/racket/src/place.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/racket/src/place.c b/src/racket/src/place.c index 437940ccd3..e2581cd5b0 100644 --- a/src/racket/src/place.c +++ b/src/racket/src/place.c @@ -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) { - scheme_signal_received_at(o3->signal_handle); - alive++; + 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); } - else - SCHEME_VEC_ELS(v)[i] = NULL; } /* shrink if more than half are unused */ if (alive < (size / 2)) {