Fix OSX + Windows build
Commit 257ee89
added a static destruction helper to avoid notional
"leaks" of TLS on main thread exit. This helper fails to compile on
OS X (and presumably Windows, though I haven't checked), which lacks
the __thread storage class StaticMeta::tls_ member.
This patch fixes the builds. Do note that the static cleanup mechanism
may be somewhat brittle and atexit(3) may be a more suitable approach
to releasing the main thread's TLS if it's highly desirable for this
memory to not be reported "reachable" by Valgrind at exit.
This commit is contained in:
parent
16ea1c7d1c
commit
ac04a6cfb8
@ -140,13 +140,29 @@ ThreadLocalPtr::StaticMeta::StaticMeta() : next_instance_id_(0) {
|
||||
|
||||
// OnThreadExit is not getting called on the main thread.
|
||||
// Call through the static destructor mechanism to avoid memory leak.
|
||||
//
|
||||
// Caveats: ~A() will be invoked _after_ ~StaticMeta for the global
|
||||
// singleton (destructors are invoked in reverse order of constructor
|
||||
// _completion_); the latter must not mutate internal members. This
|
||||
// cleanup mechanism inherently relies on use-after-release of the
|
||||
// StaticMeta, and is brittle with respect to compiler-specific handling
|
||||
// of memory backing destructed statically-scoped objects. Perhaps
|
||||
// registering with atexit(3) would be more robust.
|
||||
//
|
||||
// This is not required on Windows.
|
||||
#if !defined(OS_WIN)
|
||||
static struct A {
|
||||
~A() {
|
||||
#if defined(OS_MACOSX)
|
||||
ThreadData* tls_ =
|
||||
static_cast<ThreadData*>(pthread_getspecific(Instance()->pthread_key_));
|
||||
#endif
|
||||
if (tls_) {
|
||||
OnThreadExit(tls_);
|
||||
}
|
||||
}
|
||||
} a;
|
||||
#endif
|
||||
|
||||
head_.next = &head_;
|
||||
head_.prev = &head_;
|
||||
|
Loading…
Reference in New Issue
Block a user