From: <bpe...@us...> - 2015-04-29 20:10:51
|
Revision: 4974 http://sourceforge.net/p/simupop/code/4974 Author: bpeng2000 Date: 2015-04-29 20:10:48 +0000 (Wed, 29 Apr 2015) Log Message: ----------- Finally, a proper automatic fix of circular reference. Modified Paths: -------------- trunk/src/simulator.cpp trunk/src/utility.cpp trunk/src/utility.h Modified: trunk/src/simulator.cpp =================================================================== --- trunk/src/simulator.cpp 2015-04-29 04:36:55 UTC (rev 4973) +++ trunk/src/simulator.cpp 2015-04-29 20:10:48 UTC (rev 4974) @@ -407,6 +407,7 @@ // close every opened file (including append-cross-evolution ones) ostreamManager().closeAll(); + cleanupCircularRefs(); return evolvedGens; } Modified: trunk/src/utility.cpp =================================================================== --- trunk/src/utility.cpp 2015-04-29 04:36:55 UTC (rev 4973) +++ trunk/src/utility.cpp 2015-04-29 20:10:48 UTC (rev 4974) @@ -856,6 +856,9 @@ m_references.insert(obj); } + // clean up circular refs. Because such objects might exist during + // the creation of evolutionary scenario, we wait till the end of + // each evolutionary cycle to clean up the mess void cleanup() { std::set<PyObject *>::iterator it = m_references.begin(); @@ -880,7 +883,12 @@ CircularReferences g_circular_refs; +void cleanupCircularRefs() +{ + g_circular_refs.cleanup(); +} + pyFunc::pyFunc(PyObject * func) : m_func(func), m_numArgs(0) { if (!m_func.isValid()) @@ -936,7 +944,6 @@ essentially converts func=obj to func=obj.__call__. This allows obj to be destructed after it is used. */ - //Py_DECREF(m_func.object()); m_func = pyObject(obj); Py_DECREF(obj); } @@ -993,10 +1000,8 @@ // check the super class (BaseOperator) because of the SWIG // interface if (PyObject_HasAttrString(self, "apply") && - PyObject_HasAttrString(self, "describe")) { - g_circular_refs.cleanup(); + PyObject_HasAttrString(self, "describe")) g_circular_refs.register_ref(self); - } Py_DECREF(self); } if (!PyObject_HasAttrString(obj, "__name__")) { Modified: trunk/src/utility.h =================================================================== --- trunk/src/utility.h 2015-04-29 04:36:55 UTC (rev 4973) +++ trunk/src/utility.h 2015-04-29 20:10:48 UTC (rev 4974) @@ -435,7 +435,13 @@ vectorstr m_args; }; + /// CPPONLY +/// Remove circular references to release memory of objects that +/// are derived from PyObject +void cleanupCircularRefs(); + +/// CPPONLY class pyGenerator { public: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |