Leak folly::SingletonVault
authorAndrii Grynenko <andrii@fb.com>
Thu, 2 Oct 2014 03:34:27 +0000 (20:34 -0700)
committerAndrii Grynenko <andrii@fb.com>
Wed, 15 Oct 2014 00:53:14 +0000 (17:53 -0700)
Summary:
This will ensure SingletonVault is always available. It matters for singletons, not managed by folly::Singleton. Singletons in it will actually be destroyed via static SingletonVaultDestructor.

This does the same as D1591270 (which got reverted), but doesn't change destruction order.

Test Plan:
Run tests which were broken by D1591270

Reviewed By: chip@fb.com

Subscribers: njormrod

FB internal diff: D1594898

folly/experimental/Singleton.cpp
folly/experimental/Singleton.h

index 7934ab1a8a7a0b1804e49a81c1f7e53b65fa0c6d..4cfacd5a473be3b2a54a3d86cbb8017293852051 100644 (file)
@@ -55,7 +55,17 @@ void SingletonVault::destroyInstances() {
 }
 
 SingletonVault* SingletonVault::singleton() {
-  static SingletonVault vault;
-  return &vault;
+  static SingletonVault* vault = new SingletonVault();
+
+  class SingletonVaultDestructor {
+   public:
+    ~SingletonVaultDestructor() {
+      SingletonVault::singleton()->destroyInstances();
+    }
+  };
+  static SingletonVaultDestructor singletonVaultDestructor;
+
+  return vault;
 }
+
 }
index 524e5217f845303b50dc52f456a72a7e412a7d6a..ed912abe2690dc591c182eb7e30a70b7def865ec 100644 (file)
@@ -167,6 +167,8 @@ class SingletonVault {
   enum class Type { Strict, Relaxed };
 
   explicit SingletonVault(Type type = Type::Relaxed) : type_(type) {}
+
+  // Destructor is only called by unit tests to check destroyInstances.
   ~SingletonVault();
 
   typedef std::function<void(void*)> TeardownFunc;