static Scheme_Object *scheme_place_async_try_recv(Scheme_Place_Async_Channel *ch) { Scheme_Object *msg = NULL; void *msg_memory = NULL; mzrt_mutex_lock(ch->lock); { void *signaldescr; signaldescr = scheme_get_signal_handle(); ch->wakeup_signal = signaldescr; if (ch->count > 0) { /* GET MSG */ msg = ch->msgs[ch->out]; msg_memory = ch->msg_memory[ch->out]; ch->msgs[ch->out] = NULL; ch->msg_memory[ch->out] = NULL; --ch->count; ch->out = (++ch->out % ch->size); } } mzrt_mutex_unlock(ch->lock); if (msg) { return scheme_places_deserialize(msg, msg_memory); } return msg; }
Scheme_Object *scheme_place_recv(int argc, Scheme_Object *args[]) { if (argc == 1) { Scheme_Object *mso; Scheme_Place_Bi_Channel *ch; if (SAME_TYPE(SCHEME_TYPE(args[0]), scheme_place_type)) { ch = (Scheme_Place_Bi_Channel *) ((Scheme_Place *) args[0])->channel; } else if (SAME_TYPE(SCHEME_TYPE(args[0]), scheme_place_bi_channel_type)) { ch = (Scheme_Place_Bi_Channel *) args[0]; } else { ch = NULL; scheme_wrong_type("place-channel-recv", "place-channel", 0, argc, args); } { void *msg_memory = NULL; mso = scheme_place_async_recv((Scheme_Place_Async_Channel *) ch->recvch, &msg_memory); return scheme_places_deserialize(mso, msg_memory); } } else { scheme_wrong_count_m("place-channel-recv", 1, 1, argc, args, 0); } return scheme_true; }