/* AM Handlers for exit handling */ static void gasnetc_noop(void) { return; } static gasneti_atomic_t gasnetc_exit_dist = gasneti_atomic_init(0); /* OR of reduce distances */ static void gasnetc_exit_reqh(gasnet_token_t token, gasnet_handlerarg_t arg0, gasnet_handlerarg_t arg1) { gasneti_atomic_val_t distance = arg1; #if defined(GASNETI_HAVE_ATOMIC_ADD_SUB) /* atomic OR via ADD since no bit will be set more than once */ gasneti_assert(GASNETI_POWEROFTWO(distance)); gasneti_atomic_add(&gasnetc_exit_dist, distance, GASNETI_ATOMIC_REL); #elif defined(GASNETI_HAVE_ATOMIC_CAS) /* atomic OR via C-A-S */ uint32_t old_val; do { old_val = gasneti_atomic_read(&gasnetc_exit_dist, 0); } while (!gasneti_atomic_compare_and_swap(&gasnetc_exit_dist, old_val, old_val|distance, GASNETI_ATOMIC_REL)); #else #error "required atomic compare-and-swap is not yet implemented for your CPU/OS/compiler" #endif if (!gasnetc_exit_in_progress) gasnetc_exit((int)arg0); }
static void gasnetc_atexit(void) { gasnetc_exit(0); }
static void gasnetc_on_exit(int exitcode, void *arg) { gasnetc_exit(exitcode); }
static void gasnetc_atexit(void) { if (!gasnetc_exit_in_progress) gasnetc_exit(0); }
static void gasnetc_on_exit(int exitcode, void *arg) { if (!gasnetc_exit_in_progress) gasnetc_exit(exitcode); }