From 5e593fdc3d99a10d791d755bcac688a1d563cd8c Mon Sep 17 00:00:00 2001 From: Tongliang Liao Date: Thu, 13 May 2021 08:24:08 +0800 Subject: [PATCH] Expose `IsGoogleLoggingInitialized()` in public API. Usually library does not have control of the process lifespan. Without this function, it is impossible to init/shutdown reliably. It has been one of the major pain points for years when using glog in libraries. AFAIK 3 workarounds have been used previously: 1. Init without checking. This causes compatiblity issues with other libs using glog. 2. Also provide a init function in library's API. This makes API complicated and stateful, especially for libs that does not mean to stay for the entire life of process. 3. Steal the utility function in internal namespace. Does not work with msvc (due to missing dllexport) or `gcc -fvisibility=hidden`. None of them are perfect, except for the last hack that usually works well on Linux. 0.5.0 changes default visibility to hidden and it does not work anymore. Resolve https://github.com/google/glog/issues/125 --- src/glog/logging.h.in | 2 ++ src/logging.cc | 4 ++++ src/logging_custom_prefix_unittest.cc | 6 ++++++ src/logging_unittest.cc | 6 ++++++ 4 files changed, 18 insertions(+) diff --git a/src/glog/logging.h.in b/src/glog/logging.h.in index 421f1e026..0b1466b05 100644 --- a/src/glog/logging.h.in +++ b/src/glog/logging.h.in @@ -594,6 +594,8 @@ GOOGLE_GLOG_DLL_DECL void InitGoogleLogging(const char* argv0, void* prefix_callback_data = NULL); #endif +GOOGLE_GLOG_DLL_DECL bool IsGoogleLoggingInitialized(); + // Shutdown google's logging library. GOOGLE_GLOG_DLL_DECL void ShutdownGoogleLogging(); diff --git a/src/logging.cc b/src/logging.cc index 71de91df9..974c127e9 100644 --- a/src/logging.cc +++ b/src/logging.cc @@ -2568,6 +2568,10 @@ void InitGoogleLogging(const char* argv0, } #endif +bool IsGoogleLoggingInitialized() { + return glog_internal_namespace_::IsGoogleLoggingInitialized(); +} + void ShutdownGoogleLogging() { glog_internal_namespace_::ShutdownGoogleLoggingUtilities(); LogDestination::DeleteLogDestinations(); diff --git a/src/logging_custom_prefix_unittest.cc b/src/logging_custom_prefix_unittest.cc index c9fb5b819..b7f20f001 100644 --- a/src/logging_custom_prefix_unittest.cc +++ b/src/logging_custom_prefix_unittest.cc @@ -221,11 +221,15 @@ int main(int argc, char **argv) { LogWithLevels(0, 0, 0, 0); // simulate "before global c-tors" const string early_stderr = GetCapturedTestStderr(); + EXPECT_FALSE(::google::IsGoogleLoggingInitialized()); + // Setting a custom prefix generator (it will use the default format so that // the golden outputs can be reused): string prefix_attacher_data = "good data"; InitGoogleLogging(argv[0], &PrefixAttacher, static_cast(&prefix_attacher_data)); + EXPECT_TRUE(::google::IsGoogleLoggingInitialized()); + RunSpecifiedBenchmarks(); FLAGS_logtostderr = true; @@ -992,8 +996,10 @@ static void TestCustomLoggerDeletionOnShutdown() { base::SetLogger(GLOG_INFO, new RecordDeletionLogger(&custom_logger_deleted, base::GetLogger(GLOG_INFO))); + EXPECT_TRUE(::google::IsGoogleLoggingInitialized()); ShutdownGoogleLogging(); EXPECT_TRUE(custom_logger_deleted); + EXPECT_FALSE(::google::IsGoogleLoggingInitialized()); } _START_GOOGLE_NAMESPACE_ diff --git a/src/logging_unittest.cc b/src/logging_unittest.cc index edc7d35d7..395603a45 100644 --- a/src/logging_unittest.cc +++ b/src/logging_unittest.cc @@ -197,8 +197,12 @@ int main(int argc, char **argv) { LogWithLevels(0, 0, 0, 0); // simulate "before global c-tors" const string early_stderr = GetCapturedTestStderr(); + EXPECT_FALSE(::google::IsGoogleLoggingInitialized()); + InitGoogleLogging(argv[0]); + EXPECT_TRUE(::google::IsGoogleLoggingInitialized()); + RunSpecifiedBenchmarks(); FLAGS_logtostderr = true; @@ -965,8 +969,10 @@ static void TestCustomLoggerDeletionOnShutdown() { base::SetLogger(GLOG_INFO, new RecordDeletionLogger(&custom_logger_deleted, base::GetLogger(GLOG_INFO))); + EXPECT_TRUE(::google::IsGoogleLoggingInitialized()); ShutdownGoogleLogging(); EXPECT_TRUE(custom_logger_deleted); + EXPECT_FALSE(::google::IsGoogleLoggingInitialized()); } _START_GOOGLE_NAMESPACE_