PyObject *py_str, *py_bytes;
char *str = NULL;
+ /* Note: Caller already ran PyGILState_Ensure(). */
+
if (!py_obj)
return NULL;
PyObject *py_str, *py_bytes;
char *str = NULL;
+ /* Note: Caller already ran PyGILState_Ensure(). */
+
if (!py_obj)
return NULL;
{
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;
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. */
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;
/* Just in case. */
PyErr_Clear();
+ PyGILState_Release(gstate);
+
g_free(msg);
}