static aligned_t visit(void *arg_) { v_args_t *arg = (v_args_t *)arg_; if (arg->depth > 2) { /* I'm an internal node. */ v_args_t args = { arg->depth - 1, arg->sinc }; qt_sinc_expect(arg->sinc, 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_submit(arg->sinc, NULL); } else if (arg->depth == 2) { /* I'm going to spawn leaf nodes. */ v_args_t args = { arg->depth - 1, arg->sinc }; qt_sinc_expect(arg->sinc, 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_submit(arg->sinc, NULL); } else { /* I'm a leaf node. */ qt_sinc_submit(arg->sinc, NULL); } return 0; }
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; }
static void return_msg_sinc_handler(int tag, void *start, size_t len) { struct return_msg_t *msg = (struct return_msg_t *)start; qthread_debug(MULTINODE_FUNCTIONS, "[%d] begin return_msg_sinc_handler 0x%lx, %ld\n", my_rank, (unsigned long)msg->return_addr, msg->return_val); qt_sinc_submit((qt_sinc_t *)msg->return_addr, NULL); qthread_debug(MULTINODE_FUNCTIONS, "[%d] end return_msg_sinc_handler\n", my_rank); }
static aligned_t submit_to_sinc(void *arg_) { qt_sinc_submit((qt_sinc_t *)arg_, NULL); return 0; }