From 7bf1486094cccb266e789a378d8e5f91e3cb7780 Mon Sep 17 00:00:00 2001 From: Yedidya Feldblum Date: Wed, 10 Jan 2018 13:44:14 -0800 Subject: [PATCH] folly::Init, RAII variant of folly::init 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 | 8 ++++++++ folly/init/Init.h | 21 +++++++++++++++++++++ folly/test/common/TestMain.cpp | 2 +- 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/folly/init/Init.cpp b/folly/init/Init.cpp index 7a4c5b46..912918d5 100644 --- a/folly/init/Init.cpp +++ b/folly/init/Init.cpp @@ -54,4 +54,12 @@ void init(int* argc, char*** argv, bool removeFlags) { folly::symbolizer::installFatalSignalCallbacks(); #endif } + +Init::Init(int* argc, char*** argv, bool removeFlags) { + init(argc, argv, removeFlags); +} + +Init::~Init() { + SingletonVault::singleton()->destroyInstances(); +} } // namespace folly diff --git a/folly/init/Init.h b/folly/init/Init.h index 3a120ba1..c4280cea 100644 --- a/folly/init/Init.h +++ b/folly/init/Init.h @@ -16,6 +16,8 @@ #pragma once +#include + /* * 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); +/* + * 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 diff --git a/folly/test/common/TestMain.cpp b/folly/test/common/TestMain.cpp index 48ae6630..042f44f3 100644 --- a/folly/test/common/TestMain.cpp +++ b/folly/test/common/TestMain.cpp @@ -27,6 +27,6 @@ int main(int argc, char** argv) __attribute__((__weak__)); int main(int argc, char** argv) { ::testing::InitGoogleTest(&argc, argv); - folly::init(&argc, &argv); + folly::Init init(&argc, &argv); return RUN_ALL_TESTS(); } -- 2.34.1