summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--generator/generator_python.ml19
1 files changed, 19 insertions, 0 deletions
diff --git a/generator/generator_python.ml b/generator/generator_python.ml
index 9514e4ad..8606db59 100644
--- a/generator/generator_python.ml
+++ b/generator/generator_python.ml
@@ -180,6 +180,7 @@ py_guestfs_create (PyObject *self, PyObject *args)
static PyObject *
py_guestfs_close (PyObject *self, PyObject *args)
{
+ PyThreadState *py_save = NULL;
PyObject *py_g;
guestfs_h *g;
@@ -187,7 +188,11 @@ py_guestfs_close (PyObject *self, PyObject *args)
return NULL;
g = get_handle (py_g);
+ if (PyEval_ThreadsInitialized ())
+ py_save = PyEval_SaveThread ();
guestfs_close (g);
+ if (PyEval_ThreadsInitialized ())
+ PyEval_RestoreThread (py_save);
Py_INCREF (Py_None);
return Py_None;
@@ -284,6 +289,7 @@ py_guestfs_close (PyObject *self, PyObject *args)
pr "py_guestfs_%s (PyObject *self, PyObject *args)\n" name;
pr "{\n";
+ pr " PyThreadState *py_save = NULL;\n";
pr " PyObject *py_g;\n";
pr " guestfs_h *g;\n";
pr " PyObject *py_r;\n";
@@ -440,6 +446,14 @@ py_guestfs_close (PyObject *self, PyObject *args)
pr "\n"
);
+ (* Release Python GIL while running. This code is from
+ * libvirt/python/typewrappers.h. Thanks to Dan Berrange for
+ * showing us how to do this properly.
+ *)
+ pr " if (PyEval_ThreadsInitialized ())\n";
+ pr " py_save = PyEval_SaveThread ();\n";
+ pr "\n";
+
if optargs = [] then
pr " r = guestfs_%s " name
else
@@ -447,6 +461,11 @@ py_guestfs_close (PyObject *self, PyObject *args)
generate_c_call_args ~handle:"g" style;
pr ";\n";
+ pr "\n";
+ pr " if (PyEval_ThreadsInitialized ())\n";
+ pr " PyEval_RestoreThread (py_save);\n";
+ pr "\n";
+
List.iter (
function
| Pathname _ | Device _ | Dev_or_Path _ | String _ | Key _