diff options
Diffstat (limited to 'standalone/tsd_exclusive.h')
-rw-r--r-- | standalone/tsd_exclusive.h | 34 |
1 files changed, 19 insertions, 15 deletions
diff --git a/standalone/tsd_exclusive.h b/standalone/tsd_exclusive.h index a907ed4684a..bba0c277c6a 100644 --- a/standalone/tsd_exclusive.h +++ b/standalone/tsd_exclusive.h @@ -25,31 +25,35 @@ struct ThreadState { template <class Allocator> void teardownThread(void *Ptr); template <class Allocator> struct TSDRegistryExT { - void initLinkerInitialized(Allocator *Instance) { - Instance->initLinkerInitialized(); + void init(Allocator *Instance) { + DCHECK(!Initialized); + Instance->init(); CHECK_EQ(pthread_key_create(&PThreadKey, teardownThread<Allocator>), 0); - FallbackTSD.initLinkerInitialized(Instance); + FallbackTSD.init(Instance); Initialized = true; } - void init(Allocator *Instance) { - memset(this, 0, sizeof(*this)); - initLinkerInitialized(Instance); - } void initOnceMaybe(Allocator *Instance) { ScopedLock L(Mutex); if (LIKELY(Initialized)) return; - initLinkerInitialized(Instance); // Sets Initialized. + init(Instance); // Sets Initialized. } - void unmapTestOnly() { - Allocator *Instance = - reinterpret_cast<Allocator *>(pthread_getspecific(PThreadKey)); - if (!Instance) - return; - ThreadTSD.commitBack(Instance); + void unmapTestOnly(Allocator *Instance) { + DCHECK(Instance); + if (reinterpret_cast<Allocator *>(pthread_getspecific(PThreadKey))) { + DCHECK_EQ(reinterpret_cast<Allocator *>(pthread_getspecific(PThreadKey)), + Instance); + ThreadTSD.commitBack(Instance); + ThreadTSD = {}; + } + CHECK_EQ(pthread_key_delete(PThreadKey), 0); + PThreadKey = {}; + FallbackTSD.commitBack(Instance); + FallbackTSD = {}; State = {}; + Initialized = false; } ALWAYS_INLINE void initThreadMaybe(Allocator *Instance, bool MinimalInit) { @@ -103,7 +107,7 @@ private: return; CHECK_EQ( pthread_setspecific(PThreadKey, reinterpret_cast<void *>(Instance)), 0); - ThreadTSD.initLinkerInitialized(Instance); + ThreadTSD.init(Instance); State.InitState = ThreadState::Initialized; Instance->callPostInitCallback(); } |