]> sigrok.org Git - libsigrokdecode.git/blobdiff - exception.c
Fix part of #1128 by adding a way to retrieve PD search paths
[libsigrokdecode.git] / exception.c
index a2b2683cc347087379e49881821389208acfb027..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;
 
@@ -84,9 +88,10 @@ SRD_PRIV void srd_exception_catch(const char *format, ...)
 {
        va_list args;
        PyObject *py_etype, *py_evalue, *py_etraceback;
-       PyObject *py_modname, *py_mod, *py_func, *py_tracefmt;
+       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. */
@@ -118,13 +125,7 @@ SRD_PRIV void srd_exception_catch(const char *format, ...)
        if (!py_etraceback)
                goto cleanup;
 
-       py_modname = PyUnicode_FromString("traceback");
-       if (!py_modname)
-               goto cleanup;
-
-       py_mod = PyImport_Import(py_modname);
-       Py_DECREF(py_modname);
-
+       py_mod = py_import_by_name("traceback");
        if (!py_mod)
                goto cleanup;
 
@@ -157,5 +158,7 @@ cleanup:
        /* Just in case. */
        PyErr_Clear();
 
+       PyGILState_Release(gstate);
+
        g_free(msg);
 }