| 2293 | } |
| 2294 | |
| 2295 | static void |
| 2296 | prof_tdata_detach(tsd_t *tsd, prof_tdata_t *tdata) { |
| 2297 | bool destroy_tdata; |
| 2298 | |
| 2299 | malloc_mutex_lock(tsd_tsdn(tsd), tdata->lock); |
| 2300 | if (tdata->attached) { |
| 2301 | destroy_tdata = prof_tdata_should_destroy(tsd_tsdn(tsd), tdata, |
| 2302 | true); |
| 2303 | /* |
| 2304 | * Only detach if !destroy_tdata, because detaching would allow |
| 2305 | * another thread to win the race to destroy tdata. |
| 2306 | */ |
| 2307 | if (!destroy_tdata) { |
| 2308 | tdata->attached = false; |
| 2309 | } |
| 2310 | tsd_prof_tdata_set(tsd, NULL); |
| 2311 | } else { |
| 2312 | destroy_tdata = false; |
| 2313 | } |
| 2314 | malloc_mutex_unlock(tsd_tsdn(tsd), tdata->lock); |
| 2315 | if (destroy_tdata) { |
| 2316 | prof_tdata_destroy(tsd, tdata, true); |
| 2317 | } |
| 2318 | } |
| 2319 | |
| 2320 | prof_tdata_t * |
| 2321 | prof_tdata_reinit(tsd_t *tsd, prof_tdata_t *tdata) { |
no test coverage detected