Commit 651eb23c authored by Daniel Sommermann's avatar Daniel Sommermann Committed by dcsommer

Fix thread local random number generator static issue

Summary:
See https://gcc.gnu.org/onlinedocs/gcc-4.8.3/gcc/Thread-Local.html
Thanks to @subodh for finding the first instance of this problem in the
proxygen codebase.

Test Plan:
unit tests, tested proxygen unit tests on my laptop and I don't
get segfaults on program exit now.

Reviewed By: subodh@fb.com

Subscribers: trunkagent, doug, njormrod, subodh

FB internal diff: D1616149

Tasks: 5217022
parent 8e1a61fa
...@@ -98,8 +98,10 @@ void Random::secureRandom(void* data, size_t size) { ...@@ -98,8 +98,10 @@ void Random::secureRandom(void* data, size_t size) {
bufferedRandomDevice->get(data, size); bufferedRandomDevice->get(data, size);
} }
folly::ThreadLocalPtr<ThreadLocalPRNG::LocalInstancePRNG> ThreadLocalPRNG::ThreadLocalPRNG() {
ThreadLocalPRNG::localInstance; static folly::ThreadLocal<ThreadLocalPRNG::LocalInstancePRNG> localInstance;
local_ = localInstance.get();
}
class ThreadLocalPRNG::LocalInstancePRNG { class ThreadLocalPRNG::LocalInstancePRNG {
public: public:
...@@ -108,12 +110,6 @@ class ThreadLocalPRNG::LocalInstancePRNG { ...@@ -108,12 +110,6 @@ class ThreadLocalPRNG::LocalInstancePRNG {
Random::DefaultGenerator rng; Random::DefaultGenerator rng;
}; };
ThreadLocalPRNG::LocalInstancePRNG* ThreadLocalPRNG::initLocal() {
auto ret = new LocalInstancePRNG;
localInstance.reset(ret);
return ret;
}
uint32_t ThreadLocalPRNG::getImpl(LocalInstancePRNG* local) { uint32_t ThreadLocalPRNG::getImpl(LocalInstancePRNG* local) {
return local->rng(); return local->rng();
} }
......
...@@ -64,18 +64,10 @@ class ThreadLocalPRNG { ...@@ -64,18 +64,10 @@ class ThreadLocalPRNG {
} }
friend class Random; friend class Random;
ThreadLocalPRNG() { ThreadLocalPRNG();
local_ = localInstance.get();
if (!local_) {
local_ = initLocal();
}
}
private: private:
class LocalInstancePRNG; class LocalInstancePRNG;
static LocalInstancePRNG* initLocal();
static folly::ThreadLocalPtr<ThreadLocalPRNG::LocalInstancePRNG>
localInstance;
static result_type getImpl(LocalInstancePRNG* local); static result_type getImpl(LocalInstancePRNG* local);
LocalInstancePRNG* local_; LocalInstancePRNG* local_;
......
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