[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