int main(){ assert(qthread_initialize() == 0); qt_sinc_t sinc; qt_sinc_init(&sinc, 0, NULL, NULL, 1); int ret; args_t args = { 30, &sinc, &ret }; qthread_fork_copyargs(fib, &args, sizeof(args_t), NULL); qt_sinc_wait(&sinc, NULL); printf("%d\n", ret); }
aligned_t fib(void *args_){ args_t* args = (args_t*)args_; if(args->i < 2){ *args->ret = 1; qt_sinc_submit(args->s, NULL); return 0; } int x, y; qt_sinc_t sinc; qt_sinc_init(&sinc, 0, NULL, NULL, 2); args_t argsx = { args->i-1, &sinc, &x }; args_t argsy = { args->i-2, &sinc, &y }; qthread_fork_copyargs(fib, &argsx, sizeof(args_t), NULL); qthread_fork_copyargs(fib, &argsy, sizeof(args_t), NULL); qt_sinc_wait(&sinc, NULL); qt_sinc_submit(args->s, NULL); *args->ret = x + y; return 0; }
// ////////////////////////////////////////////////////////////////////////////// int main(int argc, char *argv[]) { size_t depth = 3; assert(qthread_initialize() == 0); CHECK_VERBOSE(); NUMARG(depth, "TEST_DEPTH"); // Test creating an empty sinc { qt_sinc_t zero_sinc; qt_sinc_init(&zero_sinc, 0, NULL, NULL, 0); qt_sinc_wait(&zero_sinc, NULL); qt_sinc_fini(&zero_sinc); qt_sinc_t *three_sinc = qt_sinc_create(0, NULL, NULL, 0); qt_sinc_expect(three_sinc, 3); qthread_fork(submit_to_sinc, three_sinc, NULL); qthread_fork(submit_to_sinc, three_sinc, NULL); qthread_fork(submit_to_sinc, three_sinc, NULL); qt_sinc_wait(three_sinc, NULL); qt_sinc_destroy(three_sinc); } qt_sinc_t *sinc = qt_sinc_create(0, NULL, NULL, 2); // Spawn additional waits aligned_t rets[3]; { qthread_fork(wait_on_sinc, sinc, &rets[0]); qthread_fork(wait_on_sinc, sinc, &rets[1]); qthread_fork(wait_on_sinc, sinc, &rets[2]); } { v_args_t args = { depth, sinc }; // These two spawns covered by qt_sinc_create(...,2) qthread_fork_syncvar_copyargs(visit, &args, sizeof(v_args_t), NULL); qthread_fork_syncvar_copyargs(visit, &args, sizeof(v_args_t), NULL); } qt_sinc_wait(sinc, NULL); for (int i = 0; i < 3; i++) qthread_readFF(NULL, &rets[i]); // Reset the sinc qt_sinc_reset(sinc, 2); // Second use { v_args_t args = { depth, sinc }; // These two spawns covered by qt_sinc_reset(...,2) qthread_fork_syncvar_copyargs(visit, &args, sizeof(v_args_t), NULL); qthread_fork_syncvar_copyargs(visit, &args, sizeof(v_args_t), NULL); } qt_sinc_wait(sinc, NULL); qt_sinc_destroy(sinc); return 0; }
return 0; #else return 1; #endif } #ifndef CORE GLT_func_prefix void glt_sinc_create(GLT_sinc *sinc, size_t sizeof_value, const void * initial_value, GLT_sinc_op op, size_t expected) { sinc = qt_sinc_create(sizeof_value, initial_value, op, expected); } GLT_func_prefix void glt_sinc_init(GLT_sinc * restrict sinc, size_t sizeof_value, const void * initial_value, GLT_sinc_op op, size_t expected) { CHECK(qt_sinc_init(sinc, sizeof_value, initial_value, op, expected),0); } GLT_func_prefix void glt_sinc_destroy(GLT_sinc *sinc) { CHECK(qt_sinc_destroy(sinc),0); } GLT_func_prefix void glt_sinc_fini(GLT_sinc * sinc) { CHECK(qt_sinc_fini(sinc),0); } GLT_func_prefix void glt_sinc_reset(GLT_sinc * sinc, size_t expect) { CHECK(qt_sinc_reset(sinc, expect),0); } GLT_func_prefix void glt_sinc_submit(GLT_sinc * restrict sinc, const void * restrict value) {