diff options
author | Gabe Black <gabeblack@google.com> | 2018-10-07 03:59:56 -0700 |
---|---|---|
committer | Gabe Black <gabeblack@google.com> | 2018-10-16 01:12:26 +0000 |
commit | 3420f0e223888bf70cd502efb5a534e651891b5c (patch) | |
tree | b8482805bf9b7febebb9775aa87cc0d82787c1f7 | |
parent | b366cbcde953e2adddc10a2825e2803b5f8a9bdd (diff) | |
download | gem5-3420f0e223888bf70cd502efb5a534e651891b5c.tar.xz |
systemc: Don't depend on the order of static initializers.
STL containers may need to be constructed before they're used. Don't
count on being able to insert into them during a static initializer.
Change-Id: Icb05d5084a470e1ebd976ae6e1954b1a78aabd6a
Reviewed-on: https://gem5-review.googlesource.com/c/13329
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>
-rw-r--r-- | src/systemc/core/python.cc | 31 | ||||
-rw-r--r-- | src/systemc/core/python.hh | 4 | ||||
-rw-r--r-- | src/systemc/utils/report.cc | 37 | ||||
-rw-r--r-- | src/systemc/utils/report.hh | 9 |
4 files changed, 69 insertions, 12 deletions
diff --git a/src/systemc/core/python.cc b/src/systemc/core/python.cc index 99d6cc9a0..e4a0dd0cb 100644 --- a/src/systemc/core/python.cc +++ b/src/systemc/core/python.cc @@ -40,14 +40,25 @@ namespace sc_gem5 namespace { -std::vector<PythonReadyFunc *> pythonReadyFuncs; -std::vector<PythonInitFunc *> pythonInitFuncs; +PythonReadyFunc *& +firstReadyFunc() +{ + static PythonReadyFunc *first = nullptr; + return first; +} + +PythonInitFunc *& +firstInitFunc() +{ + static PythonInitFunc *first = nullptr; + return first; +} void python_ready(pybind11::args args) { - for (auto &func: pythonReadyFuncs) - func->run(); + for (auto ptr = firstReadyFunc(); ptr; ptr = ptr->next) + ptr->run(); } void @@ -55,21 +66,21 @@ systemc_pybind(pybind11::module &m_internal) { pybind11::module m = m_internal.def_submodule("systemc"); m.def("python_ready", &python_ready); - for (auto &func: pythonInitFuncs) - func->run(m); + for (auto ptr = firstInitFunc(); ptr; ptr = ptr->next) + ptr->run(m); } EmbeddedPyBind embed_("systemc", &systemc_pybind); } // anonymous namespace -PythonReadyFunc::PythonReadyFunc() +PythonReadyFunc::PythonReadyFunc() : next(firstReadyFunc()) { - pythonReadyFuncs.push_back(this); + firstReadyFunc() = this; } -PythonInitFunc::PythonInitFunc() +PythonInitFunc::PythonInitFunc() : next(firstInitFunc()) { - pythonInitFuncs.push_back(this); + firstInitFunc() = this; } } // namespace sc_gem5 diff --git a/src/systemc/core/python.hh b/src/systemc/core/python.hh index 0d68c5916..d11310eda 100644 --- a/src/systemc/core/python.hh +++ b/src/systemc/core/python.hh @@ -37,6 +37,8 @@ namespace sc_gem5 struct PythonReadyFunc { + PythonReadyFunc *next; + PythonReadyFunc(); ~PythonReadyFunc() {} virtual void run() = 0; @@ -44,6 +46,8 @@ struct PythonReadyFunc struct PythonInitFunc { + PythonInitFunc *next; + PythonInitFunc(); ~PythonInitFunc() {} virtual void run(pybind11::module &systemc) = 0; diff --git a/src/systemc/utils/report.cc b/src/systemc/utils/report.cc index 755542fd6..87671f181 100644 --- a/src/systemc/utils/report.cc +++ b/src/systemc/utils/report.cc @@ -29,6 +29,8 @@ #include "systemc/utils/report.hh" +#include "systemc/core/python.hh" + namespace sc_gem5 { @@ -63,11 +65,42 @@ std::unique_ptr<sc_core::sc_report> globalReportCache; bool reportWarningsAsErrors = false; -DefaultReportMessages::DefaultReportMessages( - std::initializer_list<std::pair<int, const char *>> msgs) +DefaultReportMessages *& +DefaultReportMessages::top() +{ + static DefaultReportMessages *top_ptr = nullptr; + return top_ptr; +} + +void +DefaultReportMessages::install() { for (auto &p: msgs) sc_core::sc_report::register_id(p.first, p.second); } +DefaultReportMessages::DefaultReportMessages( + std::initializer_list<std::pair<int, const char *>> msgs) : + next(top()), msgs(msgs) +{ + top() = this; +} + +void +DefaultReportMessages::installAll() +{ + for (DefaultReportMessages *ptr = top(); ptr; ptr = ptr->next) + ptr->install(); +} + +namespace +{ + +struct InstallDefaultReportMessages : public PythonReadyFunc +{ + void run() override { DefaultReportMessages::installAll(); } +} messageInstaller; + +} // anonymous namespace + } // namespace sc_gem5 diff --git a/src/systemc/utils/report.hh b/src/systemc/utils/report.hh index ddbf62fa5..a0840c65b 100644 --- a/src/systemc/utils/report.hh +++ b/src/systemc/utils/report.hh @@ -110,8 +110,17 @@ extern bool reportWarningsAsErrors; struct DefaultReportMessages { + protected: + static DefaultReportMessages *&top(); + DefaultReportMessages *next; + + std::initializer_list<std::pair<int, const char *>> msgs; + void install(); + public: DefaultReportMessages(std::initializer_list<std::pair<int, const char *>>); + + static void installAll(); }; } // namespace sc_gem5 |