ErlDrvTid erl_drv_thread_self(void) { #ifdef USE_THREADS struct ErlDrvTid_ *dtid = ethr_tsd_get(tid_key); if (!dtid) { int res; /* This is a thread not spawned by this interface. thread_exit_handler() will clean it up when it terminates. */ dtid = erts_alloc(ERTS_ALC_T_DRV_TID, sizeof(struct ErlDrvTid_)); dtid->drv_thr = 0; /* Not a driver thread */ dtid->tid = ethr_self(); dtid->func = NULL; dtid->arg = NULL; dtid->tsd = NULL; dtid->tsd_len = 0; dtid->name = no_name; res = ethr_tsd_set(tid_key, (void *) dtid); if (res != 0) fatal_error(res, "erl_drv_thread_self()"); } return (ErlDrvTid) dtid; #else return (ErlDrvTid) NULL; #endif }
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(); }
static void * tt_thread(void *arg) { int res = ethr_tsd_set(tt_key, arg); ASSERT(res == 0); return ethr_tsd_get(tt_key); }
static void * erl_drv_thread_wrapper(void *vdtid) { int res; struct ErlDrvTid_ *dtid = (struct ErlDrvTid_ *) vdtid; res = ethr_tsd_set(tid_key, vdtid); if (res != 0) fatal_error(res, "erl_drv_thread_wrapper()"); return (*dtid->func)(dtid->arg); }
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); }