Make folly::Singleton's destruction happen earlier
authorAndrii Grynenko <andrii@fb.com>
Thu, 4 Dec 2014 01:26:45 +0000 (17:26 -0800)
committerDave Watson <davejwatson@fb.com>
Thu, 11 Dec 2014 16:00:35 +0000 (08:00 -0800)
Summary: Schedule destroyInstances to be executed via atexit in registrationComplete. registrationComplete is called from main(), so this makes sure folly::Singleton's will be destoyed before all singletons constructed before main() (which should cover all third-party libraries' singletons).

Test Plan: unit test

Reviewed By: chip@fb.com

Subscribers: trunkagent, njormrod, folly-diffs@

FB internal diff: D1717963

Tasks: 5666654

Signature: t1:1717963:1417659478:c50c271d1786be75499565f6ab9c0a1a6f6f347d

folly/experimental/Singleton.h

index c42daf01f075d7fa2d9ebac1f30e5ac4510833bf..20416015883eceffdade7e6f4d76444f61419b98 100644 (file)
@@ -208,7 +208,7 @@ class SingletonVault {
   // Mark registration is complete; no more singletons can be
   // registered at this point.
   void registrationComplete() {
-    scheduleDestroyInstances();
+    std::atexit([](){ SingletonVault::singleton()->destroyInstances(); });
 
     RWSpinLock::WriteHolder wh(&stateMutex_);
 
@@ -329,6 +329,9 @@ class SingletonVault {
     SingletonEntry(SingletonEntry&&) = delete;
   };
 
+  // This method only matters if registrationComplete() is never called.
+  // Otherwise destroyInstances is scheduled to be executed atexit.
+  //
   // Initializes static object, which calls destroyInstances on destruction.
   // Used to have better deletion ordering with singleton not managed by
   // folly::Singleton. The desruction will happen in the following order: