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