Mantaflow: call MANTA::terminateMantaflow on exit
terminateMantaflow was never called, this leak is more of a technicality since it's only called on exit. Also make Py_Initialize/Py_Finalize optional in Pd:setup/finalize as it caused Blender to crash, finalizing Python twice. Add a patch to extern/mantaflow to keep track of changes in Blender from up-stream.
This commit is contained in:
parent
d94d7a5d8f
commit
6777c420db
|
@ -2,4 +2,5 @@ Project: Mantaflow
|
||||||
URL: http://mantaflow.com/
|
URL: http://mantaflow.com/
|
||||||
License: Apache 2.0
|
License: Apache 2.0
|
||||||
Upstream version: 0.13
|
Upstream version: 0.13
|
||||||
Local modifications: None
|
Local modifications:
|
||||||
|
* ./patches/local_namespace.diff to support loading MANTA variables into an isolated __main__ name-space.
|
||||||
|
|
|
@ -706,16 +706,23 @@ PyObject *WrapperRegistry::initModule()
|
||||||
//******************************************************
|
//******************************************************
|
||||||
// Register members and exposed functions
|
// Register members and exposed functions
|
||||||
|
|
||||||
void setup(const std::string &filename, const std::vector<std::string> &args, PyObject *name_space)
|
void setup(const bool python_lifecycle,
|
||||||
|
const std::string &filename,
|
||||||
|
const std::vector<std::string> &args,
|
||||||
|
PyObject *name_space)
|
||||||
{
|
{
|
||||||
WrapperRegistry::instance().construct(filename, args);
|
WrapperRegistry::instance().construct(filename, args);
|
||||||
Py_Initialize();
|
if (python_lifecycle) {
|
||||||
|
Py_Initialize();
|
||||||
|
}
|
||||||
WrapperRegistry::instance().runPreInit(name_space);
|
WrapperRegistry::instance().runPreInit(name_space);
|
||||||
}
|
}
|
||||||
|
|
||||||
void finalize()
|
void finalize(const bool python_lifecycle)
|
||||||
{
|
{
|
||||||
Py_Finalize();
|
if (python_lifecycle) {
|
||||||
|
Py_Finalize();
|
||||||
|
}
|
||||||
WrapperRegistry::instance().cleanup();
|
WrapperRegistry::instance().cleanup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -48,8 +48,11 @@ template<class T> struct Namify {
|
||||||
namespace Pb {
|
namespace Pb {
|
||||||
|
|
||||||
// internal registry access
|
// internal registry access
|
||||||
void setup(const std::string &filename, const std::vector<std::string> &args, PyObject *name_space);
|
void setup(bool python_lifecycle,
|
||||||
void finalize();
|
const std::string &filename,
|
||||||
|
const std::vector<std::string> &args,
|
||||||
|
PyObject *name_space);
|
||||||
|
void finalize(bool python_lifecycle);
|
||||||
bool canConvert(PyObject *obj, const std::string &to);
|
bool canConvert(PyObject *obj, const std::string &to);
|
||||||
Manta::PbClass *objFromPy(PyObject *obj);
|
Manta::PbClass *objFromPy(PyObject *obj);
|
||||||
Manta::PbClass *createPy(const std::string &classname,
|
Manta::PbClass *createPy(const std::string &classname,
|
||||||
|
|
|
@ -0,0 +1,86 @@
|
||||||
|
diff --git a/extern/mantaflow/helper/pwrapper/registry.cpp b/extern/mantaflow/helper/pwrapper/registry.cpp
|
||||||
|
index 5196c0409f8..b4206a41dea 100644
|
||||||
|
--- a/extern/mantaflow/helper/pwrapper/registry.cpp
|
||||||
|
+++ b/extern/mantaflow/helper/pwrapper/registry.cpp
|
||||||
|
@@ -115,7 +115,7 @@ class WrapperRegistry {
|
||||||
|
void construct(const std::string &scriptname, const vector<string> &args);
|
||||||
|
void cleanup();
|
||||||
|
void renameObjects();
|
||||||
|
- void runPreInit();
|
||||||
|
+ void runPreInit(PyObject *name_space);
|
||||||
|
PyObject *initModule();
|
||||||
|
ClassData *lookup(const std::string &name);
|
||||||
|
bool canConvert(ClassData *from, ClassData *to);
|
||||||
|
@@ -505,7 +505,7 @@ void WrapperRegistry::addConstants(PyObject *module)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-void WrapperRegistry::runPreInit()
|
||||||
|
+void WrapperRegistry::runPreInit(PyObject *name_space)
|
||||||
|
{
|
||||||
|
// add python directories to path
|
||||||
|
PyObject *sys_path = PySys_GetObject((char *)"path");
|
||||||
|
@@ -518,7 +518,15 @@ void WrapperRegistry::runPreInit()
|
||||||
|
}
|
||||||
|
if (!mCode.empty()) {
|
||||||
|
mCode = "from manta import *\n" + mCode;
|
||||||
|
- PyRun_SimpleString(mCode.c_str());
|
||||||
|
+ PyObject *return_value = PyRun_String(mCode.c_str(), Py_file_input, name_space, name_space);
|
||||||
|
+ if (return_value == nullptr) {
|
||||||
|
+ if (PyErr_Occurred()) {
|
||||||
|
+ PyErr_Print();
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ else {
|
||||||
|
+ Py_DECREF(return_value);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -698,16 +706,23 @@ PyObject *WrapperRegistry::initModule()
|
||||||
|
//******************************************************
|
||||||
|
// Register members and exposed functions
|
||||||
|
|
||||||
|
-void setup(const std::string &filename, const std::vector<std::string> &args)
|
||||||
|
+void setup(const bool python_lifecycle,
|
||||||
|
+ const std::string &filename,
|
||||||
|
+ const std::vector<std::string> &args,
|
||||||
|
+ PyObject *name_space)
|
||||||
|
{
|
||||||
|
WrapperRegistry::instance().construct(filename, args);
|
||||||
|
- Py_Initialize();
|
||||||
|
- WrapperRegistry::instance().runPreInit();
|
||||||
|
+ if (python_lifecycle) {
|
||||||
|
+ Py_Initialize();
|
||||||
|
+ }
|
||||||
|
+ WrapperRegistry::instance().runPreInit(name_space);
|
||||||
|
}
|
||||||
|
|
||||||
|
-void finalize()
|
||||||
|
+void finalize(const bool python_lifecycle)
|
||||||
|
{
|
||||||
|
- Py_Finalize();
|
||||||
|
+ if (python_lifecycle) {
|
||||||
|
+ Py_Finalize();
|
||||||
|
+ }
|
||||||
|
WrapperRegistry::instance().cleanup();
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/extern/mantaflow/helper/pwrapper/registry.h b/extern/mantaflow/helper/pwrapper/registry.h
|
||||||
|
index d9d2bbb624b..2273d0b9bb1 100644
|
||||||
|
--- a/extern/mantaflow/helper/pwrapper/registry.h
|
||||||
|
+++ b/extern/mantaflow/helper/pwrapper/registry.h
|
||||||
|
@@ -48,8 +48,11 @@ template<class T> struct Namify {
|
||||||
|
namespace Pb {
|
||||||
|
|
||||||
|
// internal registry access
|
||||||
|
-void setup(const std::string &filename, const std::vector<std::string> &args);
|
||||||
|
-void finalize();
|
||||||
|
+void setup(bool python_lifecycle,
|
||||||
|
+ const std::string &filename,
|
||||||
|
+ const std::vector<std::string> &args,
|
||||||
|
+ PyObject *name_space);
|
||||||
|
+void finalize(bool python_lifecycle);
|
||||||
|
bool canConvert(PyObject *obj, const std::string &to);
|
||||||
|
Manta::PbClass *objFromPy(PyObject *obj);
|
||||||
|
Manta::PbClass *createPy(const std::string &classname,
|
|
@ -562,6 +562,8 @@ MANTA::~MANTA()
|
||||||
pythonCommands.push_back(finalString);
|
pythonCommands.push_back(finalString);
|
||||||
result = runPythonString(pythonCommands);
|
result = runPythonString(pythonCommands);
|
||||||
|
|
||||||
|
MANTA::terminateMantaflow();
|
||||||
|
|
||||||
BLI_assert(result);
|
BLI_assert(result);
|
||||||
UNUSED_VARS(result);
|
UNUSED_VARS(result);
|
||||||
}
|
}
|
||||||
|
@ -692,7 +694,7 @@ void MANTA::initializeMantaflow()
|
||||||
|
|
||||||
PyObject *manta_main_module = manta_python_main_module_ensure();
|
PyObject *manta_main_module = manta_python_main_module_ensure();
|
||||||
PyObject *globals_dict = PyModule_GetDict(manta_main_module);
|
PyObject *globals_dict = PyModule_GetDict(manta_main_module);
|
||||||
Pb::setup(filename, fill, globals_dict); /* Namespace from Mantaflow (registry). */
|
Pb::setup(false, filename, fill, globals_dict); /* Namespace from Mantaflow (registry). */
|
||||||
PyGILState_Release(gilstate);
|
PyGILState_Release(gilstate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -702,7 +704,7 @@ void MANTA::terminateMantaflow()
|
||||||
cout << "Fluid: Releasing Mantaflow framework" << endl;
|
cout << "Fluid: Releasing Mantaflow framework" << endl;
|
||||||
|
|
||||||
PyGILState_STATE gilstate = PyGILState_Ensure();
|
PyGILState_STATE gilstate = PyGILState_Ensure();
|
||||||
Pb::finalize(); /* Namespace from Mantaflow (registry). */
|
Pb::finalize(false); /* Namespace from Mantaflow (registry). */
|
||||||
manta_python_main_module_clear();
|
manta_python_main_module_clear();
|
||||||
PyGILState_Release(gilstate);
|
PyGILState_Release(gilstate);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue