]> sigrok.org Git - libsigrokdecode.git/blobdiff - exception.c
Acquire/release the Python GIL where needed to avoid threading issues.
[libsigrokdecode.git] / exception.c
index 7027df5abcdf65b8269323113e1809193ea4b085..b4407588c346be4d3aa77fbc6cff4a7fb8db93ab 100644 (file)
@@ -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);
 }