fix [#27683] Blender hangs when baking a particle system when a driver is present
This commit is contained in:
@@ -36,8 +36,6 @@
|
|||||||
#include "BLI_path_util.h"
|
#include "BLI_path_util.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define PYC_INTERPRETER_ACTIVE (((PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current)) != NULL)
|
|
||||||
|
|
||||||
/* array utility function */
|
/* array utility function */
|
||||||
int PyC_AsArray(void *array, PyObject *value, const int length, const PyTypeObject *type, const short is_double, const char *error_prefix)
|
int PyC_AsArray(void *array, PyObject *value, const int length, const PyTypeObject *type, const short is_double, const char *error_prefix)
|
||||||
{
|
{
|
||||||
|
@@ -50,4 +50,6 @@ void PyC_MainModule_Restore(PyObject *main_mod);
|
|||||||
|
|
||||||
void PyC_SetHomePath(const char *py_path_bundle);
|
void PyC_SetHomePath(const char *py_path_bundle);
|
||||||
|
|
||||||
|
#define PYC_INTERPRETER_ACTIVE (((PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current)) != NULL)
|
||||||
|
|
||||||
#endif // PY_CAPI_UTILS_H
|
#endif // PY_CAPI_UTILS_H
|
||||||
|
@@ -41,6 +41,8 @@
|
|||||||
|
|
||||||
#include "bpy_driver.h"
|
#include "bpy_driver.h"
|
||||||
|
|
||||||
|
#include "../generic/py_capi_utils.h"
|
||||||
|
|
||||||
/* for pydrivers (drivers using one-line Python expressions to express relationships between targets) */
|
/* for pydrivers (drivers using one-line Python expressions to express relationships between targets) */
|
||||||
PyObject *bpy_pydriver_Dict= NULL;
|
PyObject *bpy_pydriver_Dict= NULL;
|
||||||
|
|
||||||
@@ -87,7 +89,7 @@ int bpy_pydriver_create_dict(void)
|
|||||||
void BPY_driver_reset(void)
|
void BPY_driver_reset(void)
|
||||||
{
|
{
|
||||||
PyGILState_STATE gilstate;
|
PyGILState_STATE gilstate;
|
||||||
int use_gil= 1; // (PyThreadState_Get()==NULL);
|
int use_gil= !PYC_INTERPRETER_ACTIVE;
|
||||||
|
|
||||||
if(use_gil)
|
if(use_gil)
|
||||||
gilstate= PyGILState_Ensure();
|
gilstate= PyGILState_Ensure();
|
||||||
@@ -120,7 +122,7 @@ static void pydriver_error(ChannelDriver *driver)
|
|||||||
*
|
*
|
||||||
* note: PyGILState_Ensure() isnt always called because python can call the
|
* note: PyGILState_Ensure() isnt always called because python can call the
|
||||||
* bake operator which intern starts a thread which calls scene update which
|
* 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.
|
* does a driver update. to avoid a deadlock check PYC_INTERPRETER_ACTIVE if PyGILState_Ensure() is needed.
|
||||||
*/
|
*/
|
||||||
float BPY_driver_exec(ChannelDriver *driver)
|
float BPY_driver_exec(ChannelDriver *driver)
|
||||||
{
|
{
|
||||||
@@ -147,7 +149,7 @@ float BPY_driver_exec(ChannelDriver *driver)
|
|||||||
return 0.0f;
|
return 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
use_gil= 1; //(PyThreadState_Get()==NULL);
|
use_gil= !PYC_INTERPRETER_ACTIVE;
|
||||||
|
|
||||||
if(use_gil)
|
if(use_gil)
|
||||||
gilstate= PyGILState_Ensure();
|
gilstate= PyGILState_Ensure();
|
||||||
|
Reference in New Issue
Block a user