static int scheme_place_channel_ready(Scheme_Object *so, Scheme_Schedule_Info *sinfo) { Scheme_Place_Bi_Channel *ch; Scheme_Object *msg = NULL; if (SAME_TYPE(SCHEME_TYPE(so), scheme_place_type)) { ch = (Scheme_Place_Bi_Channel *) ((Scheme_Place *) so)->channel; } else { ch = (Scheme_Place_Bi_Channel *)so; } msg = scheme_place_async_try_recv((Scheme_Place_Async_Channel *) ch->recvch); if (msg != NULL) { scheme_set_sync_target(sinfo, msg, NULL, NULL, 0, 0, NULL); return 1; } return 0; }
static void ext_get_into_line(Scheme_Object *ch, Scheme_Schedule_Info *sinfo) { Scheme_Channel_Syncer *w; /* Get into line */ w = MALLOC_ONE_RT(Scheme_Channel_Syncer); w->so.type = scheme_channel_syncer_type; if (sinfo->false_positive_ok) w->p = sinfo->false_positive_ok; else w->p = scheme_current_thread; w->syncing = (Syncing *)sinfo->current_syncing; w->obj = ch; w->syncing_i = sinfo->w_i; get_into_line((Scheme_Sema *)ch, w); scheme_set_sync_target(sinfo, (Scheme_Object *)w, NULL, NULL, 0, 0, NULL); }