summaryrefslogtreecommitdiff
path: root/exception.c
diff options
context:
space:
mode:
Diffstat (limited to 'exception.c')
-rw-r--r--exception.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/exception.c b/exception.c
index 7027df5..b440758 100644
--- a/exception.c
+++ b/exception.c
@@ -28,6 +28,8 @@ static char *py_stringify(PyObject *py_obj)
PyObject *py_str, *py_bytes;
char *str = NULL;
+ /* Note: Caller already ran PyGILState_Ensure(). */
+
if (!py_obj)
return NULL;
@@ -56,6 +58,8 @@ static char *py_get_string_attr(PyObject *py_obj, const char *attr)
PyObject *py_str, *py_bytes;
char *str = NULL;
+ /* Note: Caller already ran PyGILState_Ensure(). */
+
if (!py_obj)
return NULL;
@@ -87,6 +91,7 @@ SRD_PRIV void srd_exception_catch(const char *format, ...)
PyObject *py_mod, *py_func, *py_tracefmt;
char *msg, *etype_name, *evalue_str, *tracefmt_str;
const char *etype_name_fallback;
+ PyGILState_STATE gstate;
py_etype = py_evalue = py_etraceback = py_mod = py_func = NULL;
@@ -94,6 +99,8 @@ SRD_PRIV void srd_exception_catch(const char *format, ...)
msg = g_strdup_vprintf(format, args);
va_end(args);
+ gstate = PyGILState_Ensure();
+
PyErr_Fetch(&py_etype, &py_evalue, &py_etraceback);
if (!py_etype) {
/* No current exception, so just print the message. */
@@ -151,5 +158,7 @@ cleanup:
/* Just in case. */
PyErr_Clear();
+ PyGILState_Release(gstate);
+
g_free(msg);
}