void erts_lcnt_clear_counters(void) { erts_lcnt_lock_t *lock; erts_lcnt_lock_list_t *list; erts_lcnt_lock_stats_t *stats; int i; lcnt_lock(); list = erts_lcnt_data->current_locks; for (lock = list->head; lock != NULL; lock = lock->next) { for( i = 0; i < ERTS_LCNT_MAX_LOCK_LOCATIONS; i++) { stats = &lock->stats[i]; lcnt_clear_stats(stats); } lock->n_stats = 1; } /* empty deleted locks in lock list */ erts_lcnt_list_clear(erts_lcnt_data->deleted_locks); lcnt_time(&timer_start); lcnt_unlock(); }
void erts_lcnt_init_lock_x(erts_lcnt_lock_t *lock, char *name, Uint16 flag, Eterm id) { int i; if (!name) { lock->flag = 0; return; } lcnt_lock(); lock->next = NULL; lock->prev = NULL; lock->flag = flag; lock->name = name; lock->id = id; ethr_atomic_init(&lock->r_state, 0); ethr_atomic_init(&lock->w_state, 0); #ifdef DEBUG ethr_atomic_init(&lock->flowstate, 0); #endif lock->n_stats = 1; for (i = 0; i < ERTS_LCNT_MAX_LOCK_LOCATIONS; i++) { lcnt_clear_stats(&lock->stats[i]); } erts_lcnt_list_insert(erts_lcnt_data->current_locks, lock); lcnt_unlock(); }
void erts_lcnt_init() { erts_lcnt_thread_data_t *eltd = NULL; /* init lock */ if (ethr_mutex_init(&lcnt_data_lock) != 0) abort(); /* init tsd */ lcnt_n_thr = 0; ethr_tsd_key_create(&lcnt_thr_data_key); lcnt_lock(); erts_lcnt_rt_options = ERTS_LCNT_OPT_PROCLOCK | ERTS_LCNT_OPT_LOCATION; eltd = lcnt_thread_data_alloc(); ethr_tsd_set(lcnt_thr_data_key, eltd); /* init lcnt structure */ erts_lcnt_data = (erts_lcnt_data_t*)malloc(sizeof(erts_lcnt_data_t)); erts_lcnt_data->current_locks = erts_lcnt_list_init(); erts_lcnt_data->deleted_locks = erts_lcnt_list_init(); lcnt_unlock(); /* set start timer and zero statistics */ erts_lcnt_clear_counters(); }
void erts_lcnt_thread_setup(void) { erts_lcnt_thread_data_t *eltd; lcnt_lock(); /* lock for thread id global update */ eltd = lcnt_thread_data_alloc(); lcnt_unlock(); ASSERT(eltd); ethr_tsd_set(lcnt_thr_data_key, eltd); }
erts_lcnt_data_t *erts_lcnt_get_data(void) { erts_lcnt_time_t timer_stop; lcnt_lock(); lcnt_time(&timer_stop); lcnt_time_diff(&(erts_lcnt_data->duration), &timer_stop, &timer_start); lcnt_unlock(); return erts_lcnt_data; }
void erts_lcnt_destroy_lock(erts_lcnt_lock_t *lock) { erts_lcnt_lock_t *deleted_lock; lcnt_lock(); if (erts_lcnt_rt_options & ERTS_LCNT_OPT_COPYSAVE) { /* copy structure and insert the copy */ deleted_lock = (erts_lcnt_lock_t*)malloc(sizeof(erts_lcnt_lock_t)); memcpy(deleted_lock, lock, sizeof(erts_lcnt_lock_t)); deleted_lock->next = NULL; deleted_lock->prev = NULL; erts_lcnt_list_insert(erts_lcnt_data->deleted_locks, deleted_lock); } /* delete original */ erts_lcnt_list_delete(erts_lcnt_data->current_locks, lock); lcnt_unlock(); }