Jui-min Lee has submitted this change. (
https://gem5-review.googlesource.com/c/public/gem5/+/46079 )
Change subject: base: Construct loggers on the heap
......................................................................
base: Construct loggers on the heap
Loggers was previously declared as global variables, hence are unsafe to
be used inside other global objects' destructor (e.g. scMainFiber). This
CL makes them heap allocated objects hold by function static variables.
As a result:
1. The loggers never get destructed at the end of program, which makes
them safe to be used in global objects' destructor.
2. The loggers are constructed ondemand instead of relying on linker's
unknown way of ordering, which makes them safe to be used in global
objects' constructor.
Change-Id: Ieb499d2fa4c5c1c015324cb72b055115b0933ab8
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/46079
Reviewed-by: Daniel Carvalho <[email protected]>
Reviewed-by: Jason Lowe-Power <[email protected]>
Maintainer: Jason Lowe-Power <[email protected]>
Tested-by: kokoro <[email protected]>
---
M src/base/gtest/logging_mock.cc
M src/base/logging.cc
2 files changed, 70 insertions(+), 22 deletions(-)
Approvals:
Jason Lowe-Power: Looks good to me, approved; Looks good to me, approved
Daniel Carvalho: Looks good to me, approved
kokoro: Regressions pass
diff --git a/src/base/gtest/logging_mock.cc b/src/base/gtest/logging_mock.cc
index e09a144..572d057 100644
--- a/src/base/gtest/logging_mock.cc
+++ b/src/base/gtest/logging_mock.cc
@@ -71,16 +71,40 @@
void exit() override { throw GTestException(); }
};
-GTestExitLogger panicLogger("panic: ");
-GTestExitLogger fatalLogger("fatal: ");
-GTestLogger warnLogger("warn: ");
-GTestLogger infoLogger("info: ");
-GTestLogger hackLogger("hack: ");
-
} // anonymous namespace
-Logger &Logger::getPanic() { return panicLogger; }
-Logger &Logger::getFatal() { return fatalLogger; }
-Logger &Logger::getWarn() { return warnLogger; }
-Logger &Logger::getInfo() { return infoLogger; }
-Logger &Logger::getHack() { return hackLogger; }
+// We intentionally put all the loggers on the heap to prevent them from
being
+// destructed at the end of the program. This make them safe to be used
inside
+// destructor of other global objects. Also, we make them function static
+// veriables to ensure they are initialized ondemand, so it is also safe
to use
+// them inside constructor of other global objects.
+
+Logger&
+Logger::getPanic() {
+ static GTestExitLogger* panic_logger = new GTestExitLogger("panic: ");
+ return *panic_logger;
+}
+
+Logger&
+Logger::getFatal() {
+ static GTestExitLogger* fatal_logger = new GTestExitLogger("fatal: ");
+ return *fatal_logger;
+}
+
+Logger&
+Logger::getWarn() {
+ static GTestLogger* warn_logger = new GTestLogger("warn: ");
+ return *warn_logger;
+}
+
+Logger&
+Logger::getInfo() {
+ static GTestLogger* info_logger = new GTestLogger("info: ");
+ return *info_logger;
+}
+
+Logger&
+Logger::getHack() {
+ static GTestLogger* hack_logger = new GTestLogger("hack: ");
+ return *hack_logger;
+}
diff --git a/src/base/logging.cc b/src/base/logging.cc
index 1290455..f96d101 100644
--- a/src/base/logging.cc
+++ b/src/base/logging.cc
@@ -70,16 +70,40 @@
void exit() override { ::exit(1); }
};
-ExitLogger panicLogger("panic: ");
-FatalLogger fatalLogger("fatal: ");
-Logger warnLogger("warn: ");
-Logger infoLogger("info: ");
-Logger hackLogger("hack: ");
-
} // anonymous namespace
-Logger &Logger::getPanic() { return panicLogger; }
-Logger &Logger::getFatal() { return fatalLogger; }
-Logger &Logger::getWarn() { return warnLogger; }
-Logger &Logger::getInfo() { return infoLogger; }
-Logger &Logger::getHack() { return hackLogger; }
+// We intentionally put all the loggers on the heap to prevent them from
being
+// destructed at the end of the program. This make them safe to be used
inside
+// destructor of other global objects. Also, we make them function static
+// veriables to ensure they are initialized ondemand, so it is also safe
to use
+// them inside constructor of other global objects.
+
+Logger&
+Logger::getPanic() {
+ static ExitLogger* panic_logger = new ExitLogger("panic: ");
+ return *panic_logger;
+}
+
+Logger&
+Logger::getFatal() {
+ static FatalLogger* fatal_logger = new FatalLogger("fatal: ");
+ return *fatal_logger;
+}
+
+Logger&
+Logger::getWarn() {
+ static Logger* warn_logger = new Logger("warn: ");
+ return *warn_logger;
+}
+
+Logger&
+Logger::getInfo() {
+ static Logger* info_logger = new Logger("info: ");
+ return *info_logger;
+}
+
+Logger&
+Logger::getHack() {
+ static Logger* hack_logger = new Logger("hack: ");
+ return *hack_logger;
+}
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/46079
To unsubscribe, or for help writing mail filters, visit
https://gem5-review.googlesource.com/settings
Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: Ieb499d2fa4c5c1c015324cb72b055115b0933ab8
Gerrit-Change-Number: 46079
Gerrit-PatchSet: 4
Gerrit-Owner: Jui-min Lee <[email protected]>
Gerrit-Reviewer: Bobby R. Bruce <[email protected]>
Gerrit-Reviewer: Daniel Carvalho <[email protected]>
Gerrit-Reviewer: Jason Lowe-Power <[email protected]>
Gerrit-Reviewer: Jui-min Lee <[email protected]>
Gerrit-Reviewer: kokoro <[email protected]>
Gerrit-MessageType: merged
_______________________________________________
gem5-dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s