diff options
author | Campbell Barton <ideasman42@gmail.com> | 2010-05-18 18:38:25 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2010-05-18 18:38:25 +0400 |
commit | 88743740b8d0506501e2183a97e357a5f05b2b92 (patch) | |
tree | f1e99ff8e9f5ef8d653eff0ac9f64b8cc5409b3c /source/blender/python/intern | |
parent | a6826584efe66a18f7c9a7e68bdbf6f548442aa1 (diff) |
dont use a thread for baking in background mode, its not really any advantage since it starts a single thread that runs a loop.
Diffstat (limited to 'source/blender/python/intern')
-rw-r--r-- | source/blender/python/intern/bpy_driver.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/source/blender/python/intern/bpy_driver.c b/source/blender/python/intern/bpy_driver.c index 5b1a8958247..afe6b63458f 100644 --- a/source/blender/python/intern/bpy_driver.c +++ b/source/blender/python/intern/bpy_driver.c @@ -109,7 +109,11 @@ static int bpy_pydriver_create_dict(void) */ void BPY_pydriver_update(void) { - PyGILState_STATE gilstate = PyGILState_Ensure(); + PyGILState_STATE gilstate; + int use_gil= 1; // (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); @@ -117,7 +121,8 @@ void BPY_pydriver_update(void) bpy_pydriver_Dict = NULL; } - PyGILState_Release(gilstate); + if(use_gil) + PyGILState_Release(gilstate); return; } @@ -143,6 +148,10 @@ static float pydriver_error(ChannelDriver *driver) /* 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 @@ float BPY_pydriver_eval (ChannelDriver *driver) 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 @@ float BPY_pydriver_eval (ChannelDriver *driver) return 0.0f; } - gilstate = PyGILState_Ensure(); + use_gil= 1; //(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 @@ float BPY_pydriver_eval (ChannelDriver *driver) Py_DECREF(retval); } - PyGILState_Release(gilstate); + if(use_gil) + PyGILState_Release(gilstate); if(finite(result)) { return (float)result; |