X-Git-Url: https://sigrok.org/gitweb/?p=libsigrokdecode.git;a=blobdiff_plain;f=exception.c;h=b4407588c346be4d3aa77fbc6cff4a7fb8db93ab;hp=7027df5abcdf65b8269323113e1809193ea4b085;hb=1a41642e2cd8ecfa703c45264c522866b4c99f01;hpb=e9dd2fea0514df9316a12bae191b810811fc9f01 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); }