python: Fix native module initialisation on Python 3
The approach we currently use to register our native modules doesn't work on Python 3. Convert the code to use the Python inittab instead of the old ad-hoc method. Change-Id: I961f8a33993c621473732faeaab955a882769a4b Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com> Reviewed-on: https://gem5-review.googlesource.com/c/15979 Reviewed-by: Jason Lowe-Power <jason@lowepower.com> Reviewed-by: Gabe Black <gabeblack@google.com>
This commit is contained in:
@@ -191,7 +191,11 @@ EmbeddedPyBind::getMap()
|
||||
return objs;
|
||||
}
|
||||
|
||||
#if PY_MAJOR_VERSION >= 3
|
||||
PyObject *
|
||||
#else
|
||||
void
|
||||
#endif
|
||||
EmbeddedPyBind::initAll()
|
||||
{
|
||||
std::list<EmbeddedPyBind *> pending;
|
||||
@@ -226,13 +230,18 @@ EmbeddedPyBind::initAll()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#if PY_MAJOR_VERSION >= 3
|
||||
return m_m5.ptr();
|
||||
#endif
|
||||
}
|
||||
|
||||
int
|
||||
initM5Python()
|
||||
void
|
||||
registerNativeModules()
|
||||
{
|
||||
EmbeddedPyBind::initAll();
|
||||
return EmbeddedPython::initAll();
|
||||
auto result = PyImport_AppendInittab("_m5", EmbeddedPyBind::initAll);
|
||||
if (result == -1)
|
||||
panic("Failed to add _m5 to Python's inittab\n");
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -307,10 +316,3 @@ m5Main(int argc, char **_argv)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
PyMODINIT_FUNC
|
||||
initm5(void)
|
||||
{
|
||||
initM5Python();
|
||||
PyImport_ImportModule(PyCC("m5"));
|
||||
}
|
||||
|
||||
@@ -90,7 +90,11 @@ class EmbeddedPyBind
|
||||
EmbeddedPyBind(const char *_name,
|
||||
void (*init_func)(pybind11::module &));
|
||||
|
||||
#if PY_MAJOR_VERSION >= 3
|
||||
static PyObject *initAll();
|
||||
#else
|
||||
static void initAll();
|
||||
#endif
|
||||
|
||||
private:
|
||||
void (*initFunc)(pybind11::module &);
|
||||
@@ -105,8 +109,8 @@ class EmbeddedPyBind
|
||||
static std::map<std::string, EmbeddedPyBind *> &getMap();
|
||||
};
|
||||
|
||||
int initM5Python();
|
||||
void registerNativeModules();
|
||||
|
||||
int m5Main(int argc, char **argv);
|
||||
PyMODINIT_FUNC initm5(void);
|
||||
|
||||
#endif // __SIM_INIT_HH__
|
||||
|
||||
@@ -54,11 +54,15 @@ main(int argc, char **argv)
|
||||
Py_SetProgramName(argv[0]);
|
||||
#endif
|
||||
|
||||
// Register native modules with Python's init system before
|
||||
// initializing the interpreter.
|
||||
registerNativeModules();
|
||||
|
||||
// initialize embedded Python interpreter
|
||||
Py_Initialize();
|
||||
|
||||
// Initialize the embedded m5 python library
|
||||
ret = initM5Python();
|
||||
ret = EmbeddedPython::initAll();
|
||||
|
||||
if (ret == 0) {
|
||||
// start m5
|
||||
|
||||
Reference in New Issue
Block a user