コード例 #1
0
ファイル: main2.c プロジェクト: hz-chen/lwt
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;

}
コード例 #2
0
ファイル: main.c プロジェクト: patriot7/lwt
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;
}
コード例 #3
0
ファイル: main2.c プロジェクト: hz-chen/lwt
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;
}