diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-09-22 02:31:02 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-09-22 02:31:02 +0400 |
commit | 537c3375b5ccfbdef52dd3c048dc077cb22cfd75 (patch) | |
tree | f1bd0b9522ca4e1979c847f27440ee96bb04c624 /source/blender/python/intern/bpy_interface.c | |
parent | 7f351d3b96356ca6cd57ecc4dec021ad2989f58d (diff) |
fix for crash getting a member from the operator context override, in some cases python didnt hold the GIL.
Diffstat (limited to 'source/blender/python/intern/bpy_interface.c')
-rw-r--r-- | source/blender/python/intern/bpy_interface.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c index 9cd0bdd090a..f89d8904a16 100644 --- a/source/blender/python/intern/bpy_interface.c +++ b/source/blender/python/intern/bpy_interface.c @@ -680,11 +680,20 @@ void BPY_modules_load_user(bContext *C) int BPY_context_member_get(bContext *C, const char *member, bContextDataResult *result) { - PyObject *pyctx = (PyObject *)CTX_py_dict_get(C); - PyObject *item = PyDict_GetItemString(pyctx, member); + PyGILState_STATE gilstate; + int use_gil = !PYC_INTERPRETER_ACTIVE; + + PyObject *pyctx; + PyObject *item; PointerRNA *ptr = NULL; int done = FALSE; + if (use_gil) + gilstate = PyGILState_Ensure(); + + pyctx = (PyObject *)CTX_py_dict_get(C); + item = PyDict_GetItemString(pyctx, member); + if (item == NULL) { /* pass */ } @@ -720,7 +729,8 @@ int BPY_context_member_get(bContext *C, const char *member, bContextDataResult * CTX_data_list_add(result, ptr->id.data, ptr->type, ptr->data); } else { - printf("List item not a valid type\n"); + printf("PyContext: '%s' list item not a valid type in sequece type '%s'\n", + member, Py_TYPE(item)->tp_name); } } @@ -740,6 +750,9 @@ int BPY_context_member_get(bContext *C, const char *member, bContextDataResult * } } + if (use_gil) + PyGILState_Release(gilstate); + return done; } |