== PyNodes ==
authorWillian Padovani Germano <wpgermano@gmail.com>
Fri, 25 Jul 2008 22:30:03 +0000 (22:30 +0000)
committerWillian Padovani Germano <wpgermano@gmail.com>
Fri, 25 Jul 2008 22:30:03 +0000 (22:30 +0000)
Early Ehlinger reported a deadlock when a script tells Blender to render an animation and there are pynodes. While investigating I saw related crashes in bg (blender -b) mode, still not fixed. This commit tries to fix the problem for interactive mode, then. What it does is releasing the lock before rendering and relocking after that, like theeth suggests in the bug report:

http://projects.blender.org/tracker/?func=detail&atid=125&aid=17389&group_id=9

source/blender/python/BPY_interface.c
source/blender/python/api2_2x/sceneRender.c

index 226657655fabb06ab053fe3044518b9193c35e3b..7120e97a62f44d1e1b958ea178c67b2821df515f 100644 (file)
@@ -410,12 +410,14 @@ void BPY_rebuild_syspath( void )
        mod = PyImport_ImportModule( "sys" );   
        if (!mod) {
                printf("error: could not import python sys module. some modules may not import.\n");
+               PyGILState_Release(gilstate);
                return;
        }
        
        if (!bpy_orig_syspath_List) { /* should never happen */
                printf("error refershing python path\n");
                Py_DECREF(mod);
+               PyGILState_Release(gilstate);
                return;
        }
        
index d382d4509703321dd5ce1e039c57c09dd1671224..8f251fc84525dcddffb73393d633e0cc5c319442 100644 (file)
@@ -565,6 +565,8 @@ PyObject *RenderData_SaveRenderedImage ( BPy_RenderData * self, PyObject *args )
 PyObject *RenderData_RenderAnim( BPy_RenderData * self )
 {
        Scene *oldsce;
+       /* this prevents a deadlock when there are pynodes: */
+       PyThreadState *tstate = PyEval_SaveThread();
 
        if (!G.background) {
                oldsce = G.scene;
@@ -582,9 +584,9 @@ PyObject *RenderData_RenderAnim( BPy_RenderData * self )
                if (G.scene->r.sfra > G.scene->r.efra)
                        return EXPP_ReturnPyObjError (PyExc_RuntimeError,
                                "start frame must be less or equal to end frame");
-               
                RE_BlenderAnim(re, G.scene, G.scene->r.sfra, G.scene->r.efra);
        }
+       PyEval_RestoreThread(tstate);
        Py_RETURN_NONE;
 }