folly::Init, RAII variant of folly::init
authorYedidya Feldblum <yfeldblum@fb.com>
Wed, 10 Jan 2018 21:44:14 +0000 (13:44 -0800)
committerFacebook Github Bot <facebook-github-bot@users.noreply.github.com>
Wed, 10 Jan 2018 21:57:24 +0000 (13:57 -0800)
Summary:
[Folly] `folly::Init`, RAII variant of `folly::init`.

Use it in `main` used by unit-tests.

Reviewed By: ot

Differential Revision: D6566358

fbshipit-source-id: fb8e5a18fc43eb65e2cbeb070d97094bd413bb96

folly/init/Init.cpp
folly/init/Init.h
folly/test/common/TestMain.cpp

index 7a4c5b46b5b8af681e7dd303ac87693ac5ae9578..912918d5e309784f081721e8438d53ff699448f6 100644 (file)
@@ -54,4 +54,12 @@ void init(int* argc, char*** argv, bool removeFlags) {
   folly::symbolizer::installFatalSignalCallbacks();
 #endif
 }
   folly::symbolizer::installFatalSignalCallbacks();
 #endif
 }
+
+Init::Init(int* argc, char*** argv, bool removeFlags) {
+  init(argc, argv, removeFlags);
+}
+
+Init::~Init() {
+  SingletonVault::singleton()->destroyInstances();
+}
 } // namespace folly
 } // namespace folly
index 3a120ba10ce73793fd8c194bfd75de2686a33d4f..c4280cead64014649009dedbd8884f8b62c63b89 100644 (file)
@@ -16,6 +16,8 @@
 
 #pragma once
 
 
 #pragma once
 
+#include <folly/CPortability.h>
+
 /*
  * Calls common init functions in the necessary order
  * Among other things, this ensures that folly::Singletons are initialized
 /*
  * Calls common init functions in the necessary order
  * Among other things, this ensures that folly::Singletons are initialized
@@ -30,4 +32,23 @@ namespace folly {
 
 void init(int* argc, char*** argv, bool removeFlags = true);
 
 
 void init(int* argc, char*** argv, bool removeFlags = true);
 
+/*
+ * An RAII object to be constructed at the beginning of main() and destructed
+ * implicitly at the end of main().
+ *
+ * The constructor performs the same setup as folly::init(), including
+ * initializing singletons managed by folly::Singleton.
+ *
+ * The destructor destroys all singletons managed by folly::Singleton, yielding
+ * better shutdown behavior when performed at the end of main(). In particular,
+ * this guarantees that all singletons managed by folly::Singleton are destroyed
+ * before all Meyers singletons are destroyed.
+ */
+class Init {
+ public:
+  // Force ctor & dtor out of line for better stack traces even with LTO.
+  FOLLY_NOINLINE Init(int* argc, char*** argv, bool removeFlags = true);
+  FOLLY_NOINLINE ~Init();
+};
+
 } // namespace folly
 } // namespace folly
index 48ae66303780bf51c1ad6f94b4f104a7ab04f1dd..042f44f36d48d2ca646bf3e23070d48033aa4d06 100644 (file)
@@ -27,6 +27,6 @@ int main(int argc, char** argv) __attribute__((__weak__));
 
 int main(int argc, char** argv) {
   ::testing::InitGoogleTest(&argc, argv);
 
 int main(int argc, char** argv) {
   ::testing::InitGoogleTest(&argc, argv);
-  folly::init(&argc, &argv);
+  folly::Init init(&argc, &argv);
   return RUN_ALL_TESTS();
 }
   return RUN_ALL_TESTS();
 }