Summary:
[Folly] Use thread-local in `RequestContext::getStaticContext`.
`folly::SingletonThreadLocal` uses `folly::ThreadLocal`. However, `static FOLLY_TLS` (`static __thread`) is always faster than `folly::ThreadLocal` for thread-local singletons for which iteration is not required.
Reviewed By: djwatson
Differential Revision:
D6725091
fbshipit-source-id:
9979f39677284b1051cb109b461097495d77ca17
}
std::shared_ptr<RequestContext>& RequestContext::getStaticContext() {
- using SingletonT = SingletonThreadLocal<std::shared_ptr<RequestContext>>;
- static SingletonT singleton;
-
+ using T = std::shared_ptr<RequestContext>;
+#ifdef FOLLY_TLS
+ alignas(alignof(T)) static FOLLY_TLS unsigned char storage[sizeof(T)];
+ static FOLLY_TLS T* singleton;
+ return singleton ? *singleton : *(singleton = new (storage) T());
+#else
+ struct PrivateTag {};
+ static SingletonThreadLocal<T, PrivateTag> singleton;
return singleton.get();
+#endif
}
RequestContext* RequestContext::get() {