void test_crt_join_sched(void) { lwt_t chld1, chld2; printf("[TEST] thread creation/join/scheduling\n"); /* functional tests: scheduling */ lwt_yield(LWT_NULL); lwt_chan_t c1 = lwt_chan(0); chld1 = lwt_create(fn_sequence, (void*)1, 0, c1); lwt_chan_t c2 = lwt_chan(0); chld2 = lwt_create(fn_sequence, (void*)2, 0, c2); lwt_join(chld2); lwt_join(chld1); IS_RESET(); /* functional tests: join */ lwt_chan_t c3 = lwt_chan(0); chld1 = lwt_create(fn_null, NULL, 0, c3); lwt_join(chld1); IS_RESET(); lwt_chan_t c4 = lwt_chan(0); chld1 = lwt_create(fn_null, NULL, 0, c4); lwt_yield(LWT_NULL); lwt_join(chld1); IS_RESET(); lwt_chan_t c5 = lwt_chan(0); chld1 = lwt_create(fn_nested_joins, NULL, 0, c5); lwt_join(chld1); IS_RESET(); /* functional tests: join only from parents */ lwt_chan_t c6 = lwt_chan(0); chld1 = lwt_create(fn_identity, (void*)0x37337, 0, c6); lwt_chan_t c7 = lwt_chan(0); chld2 = lwt_create(fn_join, chld1, 0, c7); lwt_yield(LWT_NULL); lwt_yield(LWT_NULL); lwt_join(chld2); lwt_join(chld1); IS_RESET(); /* functional tests: passing data between threads */ lwt_chan_t c8 = lwt_chan(0); chld1 = lwt_create(fn_identity, (void*)0x37337, 0, c8); assert((void*)0x37337 == lwt_join(chld1)); IS_RESET(); /* functional tests: directed yield */ lwt_chan_t c9 = lwt_chan(0); chld1 = lwt_create(fn_null, NULL, 0, c9); lwt_yield(chld1); assert(lwt_info(LWT_INFO_NTHD_ZOMBIES) == 1); lwt_join(chld1); IS_RESET(); }
void * fn_nested_joins(void *d) { lwt_t chld; if (d) { lwt_yield(LWT_NULL); lwt_yield(LWT_NULL); assert(lwt_info(LWT_INFO_NTHD_RUNNABLE) == 1); lwt_die(NULL); } chld = lwt_create(fn_nested_joins, (void*)1); lwt_join(chld); }
void test_crt_join_sched(void) { lwt_t chld1, chld2; /* functional tests: scheduling */ lwt_yield(LWT_NULL); chld1 = lwt_create(fn_sequence, (void*)1); chld2 = lwt_create(fn_sequence, (void*)2); lwt_join(chld2); lwt_join(chld1); IS_RESET(); /* functional tests: join */ chld1 = lwt_create(fn_null, NULL); lwt_join(chld1); IS_RESET(); chld1 = lwt_create(fn_null, NULL); lwt_yield(LWT_NULL); lwt_join(chld1); IS_RESET(); chld1 = lwt_create(fn_nested_joins, NULL); lwt_join(chld1); IS_RESET(); /* functional tests: join only from parents */ chld1 = lwt_create(fn_identity, (void*)0x37337); chld2 = lwt_create(fn_join, chld1); lwt_yield(LWT_NULL); lwt_yield(LWT_NULL); lwt_join(chld2); lwt_join(chld1); IS_RESET(); /* functional tests: passing data between threads */ chld1 = lwt_create(fn_identity, (void*)0x37337); assert((void*)0x37337 == lwt_join(chld1)); IS_RESET(); /* functional tests: directed yield */ chld1 = lwt_create(fn_null, NULL); lwt_yield(chld1); assert(lwt_info(LWT_INFO_NTHD_ZOMBIES) == 1); lwt_join(chld1); IS_RESET(); }
void test_perf_async_steam(int chsz) { lwt_chan_t from; lwt_t t; int i; unsigned long long start, end; async_sz = chsz; assert(RUNNABLE == lwt_current()->state); from = lwt_chan(chsz); assert(from); lwt_chan_grant(from); lwt_chan_t cfix = lwt_chan(0); t = lwt_create(fn_async_steam, from, 0, cfix); assert(lwt_info(LWT_INFO_NTHD_RUNNABLE) == 2); rdtscll(start); for (i = 0 ; i < ITER ; i++) assert(i+1 == (int)lwt_rcv(from)); rdtscll(end); printf("[PERF] %lld <- asynchronous snd->rcv (buffer size %d)\n", (end-start)/(ITER*2), chsz); lwt_join(t); }