Commit b7912274 authored by Sean Cannella's avatar Sean Cannella Committed by Ajit Banerjee

Don't use FOLLY_TLS on Android

Summary:
emutls as far as StaticMeta needs to use it is broken on
Android as well due to unspecified pthread_key cleanup order between the
emulated __thread and our manual uses of it. Use the alternative that we
use on __APPLE__ there as well.

Test Plan: compiled and ran consuming code on Android

Reviewed By: dancol@fb.com

Subscribers: fma, shikong, kmdent, benyluo, ranjeeth, subodh, folly-diffs@

FB internal diff: D1760569

Tasks: 5265754, 5907613

Signature: t1:1760569:1419955865:afe8f35dadda85393492ac9331e9f62a74f4fdad
parent 821c5d75
...@@ -152,7 +152,8 @@ struct MaxAlign { char c; } __attribute__((__aligned__)); ...@@ -152,7 +152,8 @@ struct MaxAlign { char c; } __attribute__((__aligned__));
/* Platform specific TLS support /* Platform specific TLS support
* gcc implements __thread * gcc implements __thread
* msvc implements __declspec(thread) * msvc implements __declspec(thread)
* the semantics are the same (but remember __thread is broken on apple) * the semantics are the same
* (but remember __thread has different semantics when using emutls (ex. apple))
*/ */
#if defined(_MSC_VER) #if defined(_MSC_VER)
# define FOLLY_TLS __declspec(thread) # define FOLLY_TLS __declspec(thread)
......
...@@ -30,6 +30,18 @@ ...@@ -30,6 +30,18 @@
#include <folly/Exception.h> #include <folly/Exception.h>
#include <folly/Malloc.h> #include <folly/Malloc.h>
// In general, emutls cleanup is not guaranteed to play nice with the way
// StaticMeta mixes direct pthread calls and the use of __thread. This has
// caused problems on multiple platforms so don't use __thread there.
//
// XXX: Ideally we would instead determine if emutls is in use at runtime as it
// is possible to configure glibc on Linux to use emutls regardless.
#if !__APPLE__ && !__ANDROID__
#define FOLLY_TLD_USE_FOLLY_TLS 1
#else
#undef FOLLY_TLD_USE_FOLLY_TLS
#endif
namespace folly { namespace folly {
namespace threadlocal_detail { namespace threadlocal_detail {
...@@ -185,7 +197,7 @@ struct StaticMeta { ...@@ -185,7 +197,7 @@ struct StaticMeta {
t->next = t->prev = t; t->next = t->prev = t;
} }
#if !__APPLE__ #ifdef FOLLY_TLD_USE_FOLLY_TLS
static FOLLY_TLS ThreadEntry threadEntry_; static FOLLY_TLS ThreadEntry threadEntry_;
#endif #endif
static StaticMeta<Tag>* inst_; static StaticMeta<Tag>* inst_;
...@@ -210,7 +222,7 @@ struct StaticMeta { ...@@ -210,7 +222,7 @@ struct StaticMeta {
} }
static ThreadEntry* getThreadEntry() { static ThreadEntry* getThreadEntry() {
#if !__APPLE__ #ifdef FOLLY_TLD_USE_FOLLY_TLS
return &threadEntry_; return &threadEntry_;
#else #else
ThreadEntry* threadEntry = ThreadEntry* threadEntry =
...@@ -245,7 +257,7 @@ struct StaticMeta { ...@@ -245,7 +257,7 @@ struct StaticMeta {
static void onThreadExit(void* ptr) { static void onThreadExit(void* ptr) {
auto& meta = instance(); auto& meta = instance();
#if !__APPLE__ #ifdef FOLLY_TLD_USE_FOLLY_TLS
ThreadEntry* threadEntry = getThreadEntry(); ThreadEntry* threadEntry = getThreadEntry();
DCHECK_EQ(ptr, &meta); DCHECK_EQ(ptr, &meta);
...@@ -275,8 +287,8 @@ struct StaticMeta { ...@@ -275,8 +287,8 @@ struct StaticMeta {
threadEntry->elements = nullptr; threadEntry->elements = nullptr;
pthread_setspecific(meta.pthreadKey_, nullptr); pthread_setspecific(meta.pthreadKey_, nullptr);
#if __APPLE__ #ifndef FOLLY_TLD_USE_FOLLY_TLS
// Allocated in getThreadEntry(); free it // Allocated in getThreadEntry() when not using folly TLS; free it
delete threadEntry; delete threadEntry;
#endif #endif
} }
...@@ -415,7 +427,7 @@ struct StaticMeta { ...@@ -415,7 +427,7 @@ struct StaticMeta {
free(reallocated); free(reallocated);
#if !__APPLE__ #ifdef FOLLY_TLD_USE_FOLLY_TLS
if (prevCapacity == 0) { if (prevCapacity == 0) {
pthread_setspecific(meta.pthreadKey_, &meta); pthread_setspecific(meta.pthreadKey_, &meta);
} }
...@@ -432,7 +444,7 @@ struct StaticMeta { ...@@ -432,7 +444,7 @@ struct StaticMeta {
} }
}; };
#if !__APPLE__ #ifdef FOLLY_TLD_USE_FOLLY_TLS
template <class Tag> template <class Tag>
FOLLY_TLS ThreadEntry StaticMeta<Tag>::threadEntry_{nullptr, 0, FOLLY_TLS ThreadEntry StaticMeta<Tag>::threadEntry_{nullptr, 0,
nullptr, nullptr}; nullptr, nullptr};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment