Use SingletonThreadLocal in folly::Random
authorAndrii Grynenko <andrii@fb.com>
Thu, 1 Dec 2016 00:50:04 +0000 (16:50 -0800)
committerFacebook Github Bot <facebook-github-bot-bot@fb.com>
Thu, 1 Dec 2016 00:54:27 +0000 (16:54 -0800)
Summary: folly::SingletonThreadLocal should be used for all thread-local singletons to avoid SDOF.

Reviewed By: yfeldblum

Differential Revision: D4253009

fbshipit-source-id: 5b4ca57a7a77b7b54c94630a2a29d13b84a3af27

folly/Random.cpp
folly/Random.h

index d4fb39b4ea3a4eaaa1d9140dfe422bcdd610a090..d991990e28b60944287529cbd5afa5ca9749b5b5 100644 (file)
 #include <random>
 #include <array>
 
-#include <glog/logging.h>
 #include <folly/CallOnce.h>
 #include <folly/File.h>
 #include <folly/FileUtil.h>
+#include <folly/SingletonThreadLocal.h>
 #include <folly/ThreadLocal.h>
 #include <folly/portability/SysTime.h>
 #include <folly/portability/Unistd.h>
+#include <glog/logging.h>
 
 #ifdef _MSC_VER
 # include <wincrypt.h>
@@ -123,28 +124,30 @@ void BufferedRandomDevice::getSlow(unsigned char* data, size_t size) {
   ptr_ += size;
 }
 
+struct RandomTag {};
 
-}  // namespace
+} // namespace
 
 void Random::secureRandom(void* data, size_t size) {
-  static ThreadLocal<BufferedRandomDevice> bufferedRandomDevice;
-  bufferedRandomDevice->get(data, size);
+  static SingletonThreadLocal<BufferedRandomDevice, RandomTag>
+      bufferedRandomDevice;
+  bufferedRandomDevice.get().get(data, size);
 }
 
 class ThreadLocalPRNG::LocalInstancePRNG {
  public:
-  LocalInstancePRNG() : rng(Random::create()) { }
+  LocalInstancePRNG() : rng(Random::create()) {}
 
   Random::DefaultGenerator rng;
 };
 
 ThreadLocalPRNG::ThreadLocalPRNG() {
-  static folly::ThreadLocal<ThreadLocalPRNG::LocalInstancePRNG> localInstance;
-  local_ = localInstance.get();
+  static SingletonThreadLocal<ThreadLocalPRNG::LocalInstancePRNG, RandomTag>
+      localInstancePRNG;
+  local_ = &localInstancePRNG.get();
 }
 
 uint32_t ThreadLocalPRNG::getImpl(LocalInstancePRNG* local) {
   return local->rng();
 }
-
 }
index 0962d07e15445c6ae47385585073d680ea87ceed..0e52772aa5b746970060ab07d7d2ae3ff83ca4dd 100644 (file)
@@ -65,9 +65,9 @@ class ThreadLocalPRNG {
 
   ThreadLocalPRNG();
 
- private:
   class LocalInstancePRNG;
 
+ private:
   static result_type getImpl(LocalInstancePRNG* local);
   LocalInstancePRNG* local_;
 };