static inline void check_out_finish(finish_t *finish) { if (finish) { // hc_atomic_dec returns true when finish->counter goes to zero const int old = hc_atomic_dec(&(finish->counter)); if (old == 1) { // If old was 1 and we decremented to 0 hclib_promise_put(finish->finish_dep->owner, finish); } } }
void fib_ddt_res(void * raw_args) { FibDDtArgs *args = raw_args; FibDDtArgs *lhs = promise_get(args->subres[0]); FibDDtArgs *rhs = promise_get(args->subres[1]); args->resval = lhs->resval + rhs->resval; hclib_promise_put(args->res, args); // cleanup free_ddt_args(lhs); free_ddt_args(rhs); }
void fib_ddt(void * raw_args) { FibDDtArgs *args = raw_args; if (args->n < 2) { args->resval = args->n; hclib_promise_put(args->res, args); } else { FibDDtArgs *lhsArgs = setup_fib_ddt_args(args->n - 1); FibDDtArgs *rhsArgs = setup_fib_ddt_args(args->n - 2); args->subres[0] = lhsArgs->res; args->subres[1] = rhsArgs->res; // sub-computation asyncs hclib_async(fib_ddt, lhsArgs, NO_FUTURE, NO_PHASER, ANY_PLACE, MY_ESCAPE_PROP); hclib_async(fib_ddt, rhsArgs, NO_FUTURE, NO_PHASER, ANY_PLACE, MY_ESCAPE_PROP); // async-await for sub-results hclib_async(fib_ddt_res, args, ps2fs(args->subres), NO_PHASER, ANY_PLACE, MY_ESCAPE_PROP); } }
static void future_caller(void *in) { future_args_wrapper *args = in; void *user_result = (args->fp)(args->actual_in); hclib_promise_put(&args->event, user_result); }
void shmem_satisfy_promise(shmem_promise_t *promise, void* datum) { hclib_promise_put((hclib_promise_t *) promise, datum); }