| 2198 | } |
| 2199 | |
| 2200 | static prof_tdata_t * |
| 2201 | prof_tdata_init_impl(tsd_t *tsd, uint64_t thr_uid, uint64_t thr_discrim, |
| 2202 | char *thread_name, bool active) { |
| 2203 | prof_tdata_t *tdata; |
| 2204 | |
| 2205 | cassert(config_prof); |
| 2206 | |
| 2207 | /* Initialize an empty cache for this thread. */ |
| 2208 | tdata = (prof_tdata_t *)iallocztm(tsd_tsdn(tsd), sizeof(prof_tdata_t), |
| 2209 | sz_size2index(sizeof(prof_tdata_t)), false, NULL, true, |
| 2210 | arena_get(TSDN_NULL, 0, true), true); |
| 2211 | if (tdata == NULL) { |
| 2212 | return NULL; |
| 2213 | } |
| 2214 | |
| 2215 | tdata->lock = prof_tdata_mutex_choose(thr_uid); |
| 2216 | tdata->thr_uid = thr_uid; |
| 2217 | tdata->thr_discrim = thr_discrim; |
| 2218 | tdata->thread_name = thread_name; |
| 2219 | tdata->attached = true; |
| 2220 | tdata->expired = false; |
| 2221 | tdata->tctx_uid_next = 0; |
| 2222 | |
| 2223 | if (ckh_new(tsd, &tdata->bt2tctx, PROF_CKH_MINITEMS, prof_bt_hash, |
| 2224 | prof_bt_keycomp)) { |
| 2225 | idalloctm(tsd_tsdn(tsd), tdata, NULL, NULL, true, true); |
| 2226 | return NULL; |
| 2227 | } |
| 2228 | |
| 2229 | tdata->prng_state = (uint64_t)(uintptr_t)tdata; |
| 2230 | prof_sample_threshold_update(tdata); |
| 2231 | |
| 2232 | tdata->enq = false; |
| 2233 | tdata->enq_idump = false; |
| 2234 | tdata->enq_gdump = false; |
| 2235 | |
| 2236 | tdata->dumping = false; |
| 2237 | tdata->active = active; |
| 2238 | |
| 2239 | malloc_mutex_lock(tsd_tsdn(tsd), &tdatas_mtx); |
| 2240 | tdata_tree_insert(&tdatas, tdata); |
| 2241 | malloc_mutex_unlock(tsd_tsdn(tsd), &tdatas_mtx); |
| 2242 | |
| 2243 | return tdata; |
| 2244 | } |
| 2245 | |
| 2246 | prof_tdata_t * |
| 2247 | prof_tdata_init(tsd_t *tsd) { |
no test coverage detected