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>
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user