void* grp_wait_rcver(void* param, lwt_chan_t c) { lwt_chan_t cc = lwt_chan(10); lwt_snd_chan((lwt_chan_t)param, cc); lwt_chan_t cc2 = lwt_rcv_chan(cc); lwt_cgrp_t cg = lwt_cgrp(); int i=0; for(i=0; i < ITER; i++) { lwt_chan_t cci = lwt_chan(3); assert(lwt_cgrp_add(cg, cci, LWT_CHAN_RCV) == 0); printf("in_main: thread %d: sending channel %d\n", current_tid, i); lwt_snd_chan(cc2, cci); printf("in_main: thread %d: channel %d sent\n", current_tid, i); } while(i>0) { printf("in_main: thread %d: group waiting\n", current_tid); lwt_chan_t cci = lwt_cgrp_wait(cg, LWT_CHAN_RCV); printf("in_main: thread %d: cci rcved, start rcv data\n", current_tid); i = (int)lwt_rcv(cci); printf("in_main: thread %d: i rcved: %d\n", current_tid, i); } return NULL; }
void test_grpwait(int chsz, int grpsz) { lwt_chan_t cs[grpsz]; lwt_t ts[grpsz]; int i; lwt_cgrp_t g; printf("[TEST] group wait (channel buffer size %d, grpsz %d)\n", chsz, grpsz); g = lwt_cgrp(); assert(g); for (i = 0 ; i < grpsz ; i++) { cs[i] = lwt_chan(chsz); assert(cs[i]); lwt_chan_grant(cs[i]); lwt_chan_t c = lwt_chan(0); ts[i] = lwt_create(fn_grpwait, cs[i], 0, c); lwt_chan_mark_set(cs[i], (void*)lwt_id(ts[i])); lwt_cgrp_add(g, cs[i], LWT_CHAN_RCV); } assert(lwt_cgrp_free(g) == -1); /** * Q: why don't we iterate through all of the data here? * * A: We need to fix 1) cevt_wait to be level triggered, or 2) * provide a function to detect if there is data available on * a channel. Either of these would allows us to iterate on a * channel while there is more data pending. */ for (i = 0 ; i < ((ITER * grpsz)-(grpsz*chsz)) ; i++) { lwt_chan_t c; int r; lwt_chan_dir_t direction; c = lwt_cgrp_wait(g, &direction); assert(c); assert(direction == LWT_CHAN_RCV); r = (int)lwt_rcv(c); assert(r == (int)lwt_chan_mark_get(c)); } for (i = 0 ; i < grpsz ; i++) { lwt_cgrp_rem(g, cs[i]); lwt_join(ts[i]); lwt_chan_deref(cs[i]); } assert(!lwt_cgrp_free(g)); return; }
void* kthd_rcv_print(void* data, lwt_chan_t rcv_c) { printf("in kthd: data: %d and channel 0x%08x rcvd!\n", (int)data, (unsigned int)rcv_c); lwt_chan_t cc = lwt_chan(0); lwt_chan_t main_c = lwt_rcv_chan(rcv_c); lwt_snd_chan(main_c, cc); /* void* pkg = lwt_rcv(cc); printf("in kthd: data %d rcvd!\n", (int)pkg); pkg = lwt_rcv(cc); printf("in kthd: data %d rcvd!\n", (int)pkg); pkg = lwt_rcv(cc); printf("in kthd: data %d rcvd!\n", (int)pkg); pkg = lwt_rcv(cc); printf("in kthd: data %d rcvd!\n", (int)pkg); pkg = lwt_rcv(cc); printf("in kthd: data %d rcvd!\n", (int)pkg); */ lwt_cgrp_t cg = lwt_cgrp(); lwt_cgrp_add(cg, cc, LWT_CHAN_RCV); lwt_chan_t actived; printf("====start wait====\n"); while((actived = lwt_cgrp_wait(cg, LWT_CHAN_RCV)) != NULL) { assert(actived == cc); void* pkg = lwt_rcv(actived); printf("in kthd: data %d rcvd!\n", (int)pkg); } printf("====end wait====\n"); return NULL; }