static void lcnt_clear_stats(erts_lcnt_lock_stats_t *stats) { ethr_atomic_set(&stats->tries, 0); ethr_atomic_set(&stats->colls, 0); stats->timer.s = 0; stats->timer.ns = 0; stats->timer_n = 0; stats->file = (char *)str_undefined; stats->line = 0; }
static void atomic_test(void) { long data_init, data_final, val; int res, i; ethr_tid tid[AT_THREADS]; ethr_thr_opts thr_opts = ETHR_THR_OPTS_DEFAULT_INITER; atomic_basic_test(); #if ETHR_SIZEOF_PTR > 4 at_rm_val = ((long) 1) << 57; at_set_val = ((long) 1) << 60; #else at_rm_val = ((long) 1) << 27; at_set_val = ((long) 1) << 30; #endif at_max_val = at_set_val + at_rm_val + ((long) AT_THREADS + 1) * 4711; data_init = at_rm_val + (long) 4711; data_final = at_set_val + (long) 4711; thr_opts.detached = 1; print_line("Initializing"); ethr_atomic_init(&at_ready, 0); ethr_atomic_init(&at_go, 0); ethr_atomic_init(&at_done, data_init); ethr_atomic_init(&at_data, data_init); val = ethr_atomic_read(&at_data); ASSERT(val == data_init); ethr_atomic_set(&at_done, 0); val = ethr_atomic_read(&at_done); ASSERT(val == 0); print_line("Creating threads"); for (i = 0; i < AT_THREADS; i++) { res = ethr_thr_create(&tid[i], at_thread, NULL, &thr_opts); ASSERT(res == 0); } print_line("Waiting for threads to ready up"); do { val = ethr_atomic_read(&at_ready); ASSERT(val >= 0); ASSERT(val <= AT_THREADS); } while (val != AT_THREADS); print_line("Letting threads loose"); val = ethr_atomic_xchg(&at_go, 17); ASSERT(val == 0); val = ethr_atomic_read(&at_go); ASSERT(val == 17); print_line("Waiting for threads to finish"); do { val = ethr_atomic_read(&at_done); ASSERT(val >= 0); ASSERT(val <= AT_THREADS); } while (val != AT_THREADS); print_line("Checking result"); val = ethr_atomic_read(&at_data); ASSERT(res == 0); ASSERT(val == data_final); print_line("Result ok"); }