[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [28825] trunk/blender/source/blender/ python/intern/bpy_driver.c: workaround for a threading deadlock when calling bake from python with a scene that also uses pydrivers .
Campbell Barton
ideasman42 at gmail.com
Tue May 18 16:22:52 CEST 2010
Revision: 28825
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28825
Author: campbellbarton
Date: 2010-05-18 16:22:47 +0200 (Tue, 18 May 2010)
Log Message:
-----------
workaround for a threading deadlock when calling bake from python with a scene that also uses pydrivers.
Modified Paths:
--------------
trunk/blender/source/blender/python/intern/bpy_driver.c
Modified: trunk/blender/source/blender/python/intern/bpy_driver.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_driver.c 2010-05-18 13:46:56 UTC (rev 28824)
+++ trunk/blender/source/blender/python/intern/bpy_driver.c 2010-05-18 14:22:47 UTC (rev 28825)
@@ -109,15 +109,20 @@
*/
void BPY_pydriver_update(void)
{
- PyGILState_STATE gilstate = PyGILState_Ensure();
+ PyGILState_STATE gilstate;
+ int use_gil= (PyThreadState_Get()==NULL);
+ if(use_gil)
+ gilstate = PyGILState_Ensure();
+
if (bpy_pydriver_Dict) { /* free the global dict used by pydrivers */
PyDict_Clear(bpy_pydriver_Dict);
Py_DECREF(bpy_pydriver_Dict);
bpy_pydriver_Dict = NULL;
}
- PyGILState_Release(gilstate);
+ if(use_gil)
+ PyGILState_Release(gilstate);
return;
}
@@ -143,6 +148,10 @@
/* This evals py driver expressions, 'expr' is a Python expression that
* should evaluate to a float number, which is returned.
+ *
+ * note: PyGILState_Ensure() isnt always called because python can call the
+ * bake operator which intern starts a thread which calls scene update which
+ * does a driver update. to avoid a deadlock check PyThreadState_Get() if PyGILState_Ensure() is needed.
*/
float BPY_pydriver_eval (ChannelDriver *driver)
{
@@ -151,6 +160,7 @@
PyObject *expr_vars; /* speed up by pre-hashing string & avoids re-converting unicode strings for every execution */
PyObject *expr_code;
PyGILState_STATE gilstate;
+ int use_gil;
DriverVar *dvar;
double result = 0.0; /* default return */
@@ -168,13 +178,17 @@
return 0.0f;
}
- gilstate = PyGILState_Ensure();
+ use_gil= (PyThreadState_Get()==NULL);
+ if(use_gil)
+ gilstate = PyGILState_Ensure();
+
/* init global dictionary for py-driver evaluation settings */
if (!bpy_pydriver_Dict) {
if (bpy_pydriver_create_dict() != 0) {
fprintf(stderr, "Pydriver error: couldn't create Python dictionary");
- PyGILState_Release(gilstate);
+ if(use_gil)
+ PyGILState_Release(gilstate);
return 0.0f;
}
}
@@ -269,7 +283,8 @@
Py_DECREF(retval);
}
- PyGILState_Release(gilstate);
+ if(use_gil)
+ PyGILState_Release(gilstate);
if(finite(result)) {
return (float)result;
More information about the Bf-blender-cvs
mailing list