Revision: 17163
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17163
Author:   campbellbarton
Date:     2008-10-22 05:10:00 +0200 (Wed, 22 Oct 2008)

Log Message:
-----------
fix for [#17878] Scripts operating on blender objects don't clear memory after 
a crash
This is an interesting bug since it is likely the cause of many other 
suspicious python crashes in blender.

sys.last_traceback would store references to PyObjects at the point of the 
crash.
it would only free these when sys.last_traceback was set again or on exit.

This caused many crashes in the BGE while testing since python would end up 
freeing invalid game objects -
When running scripts with errors, Blender would crash every 2-5 runs - in my 
test just now it crashed after 4 trys.

It could also segfault blender, when (for eg) you run a script that has objects 
referenced. then load a new file and run another script that raises an error.
In this case all the invalid Blender-Object's user counts would be decremented, 
even though none of the pointers were still valid.

Modified Paths:
--------------
    trunk/blender/source/blender/python/BPY_interface.c
    trunk/blender/source/gameengine/GameLogic/SCA_PythonController.cpp

Modified: trunk/blender/source/blender/python/BPY_interface.c
===================================================================
--- trunk/blender/source/blender/python/BPY_interface.c 2008-10-22 02:59:33 UTC 
(rev 17162)
+++ trunk/blender/source/blender/python/BPY_interface.c 2008-10-22 03:10:00 UTC 
(rev 17163)
@@ -616,7 +616,12 @@
                }
                Py_DECREF( tb );
        }
-
+       
+       /* Added in 2.48a, the last_traceback can reference Objects for 
example, increasing
+        * their user count. Not to mention holding references to wrapped data.
+        * This is especially bad when the PyObject for the wrapped data is 
free'd, after blender 
+        * has alredy dealocated the pointer */
+       PySys_SetObject( "last_traceback", Py_None);
        return;
 }
 
@@ -2727,6 +2732,8 @@
 * Description: This function executes the python script passed by text.        
 *              The Python dictionary containing global variables needs to
 *              be passed in globaldict.
+*              NOTE: Make sure BPY_Err_Handle() runs if this returns NULL
+*              otherwise pointers can be left in sys.last_traceback that 
become invalid.
 *****************************************************************************/
 static PyObject *RunPython( Text * text, PyObject * globaldict )
 {

Modified: trunk/blender/source/gameengine/GameLogic/SCA_PythonController.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_PythonController.cpp  
2008-10-22 02:59:33 UTC (rev 17162)
+++ trunk/blender/source/gameengine/GameLogic/SCA_PythonController.cpp  
2008-10-22 03:10:00 UTC (rev 17163)
@@ -262,6 +262,13 @@
                        printf("Python compile error from controller \"%s\": 
\n", GetName().Ptr());
                        //PyRun_SimpleString(m_scriptText.Ptr());
                        PyErr_Print();
+                       
+                       /* Added in 2.48a, the last_traceback can reference 
Objects for example, increasing
+                        * their user count. Not to mention holding references 
to wrapped data.
+                        * This is especially bad when the PyObject for the 
wrapped data is free'd, after blender 
+                        * has alredy dealocated the pointer */
+                       PySys_SetObject( "last_traceback", Py_None);
+                       
                        return;
                }
                m_bModified=false;
@@ -298,6 +305,13 @@
                // something is wrong, tell the user what went wrong
                printf("Python script error from controller \"%s\": \n", 
GetName().Ptr());
                PyErr_Print();
+               
+               /* Added in 2.48a, the last_traceback can reference Objects for 
example, increasing
+                * their user count. Not to mention holding references to 
wrapped data.
+                * This is especially bad when the PyObject for the wrapped 
data is free'd, after blender 
+                * has alredy dealocated the pointer */
+               PySys_SetObject( "last_traceback", Py_None);
+               
                //PyRun_SimpleString(m_scriptText.Ptr());
        }
 


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to