91 lines
2.5 KiB
Diff
91 lines
2.5 KiB
Diff
|
From 77310049efc37daaf7bd993298000f8f3638497e Mon Sep 17 00:00:00 2001
|
||
|
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||
|
Date: Tue, 3 Aug 2021 14:19:38 +0100
|
||
|
Subject: [PATCH] python: Implement .cleanup() method
|
||
|
|
||
|
(cherry picked from commit f2fe99e4b0f54467ab8028eaf2d039cf918b2961)
|
||
|
---
|
||
|
plugins/python/nbdkit-python-plugin.pod | 20 +++++++++++++++++---
|
||
|
plugins/python/plugin.c | 19 +++++++++++++++++++
|
||
|
2 files changed, 36 insertions(+), 3 deletions(-)
|
||
|
|
||
|
diff --git a/plugins/python/nbdkit-python-plugin.pod b/plugins/python/nbdkit-python-plugin.pod
|
||
|
index 6f5f2c00..a92a557f 100644
|
||
|
--- a/plugins/python/nbdkit-python-plugin.pod
|
||
|
+++ b/plugins/python/nbdkit-python-plugin.pod
|
||
|
@@ -257,6 +257,12 @@ There are no arguments or return value.
|
||
|
|
||
|
There are no arguments or return value.
|
||
|
|
||
|
+=item C<cleanup>
|
||
|
+
|
||
|
+(Optional, nbdkit E<ge> 1.28)
|
||
|
+
|
||
|
+There are no arguments or return value.
|
||
|
+
|
||
|
=item C<list_exports>
|
||
|
|
||
|
(Optional)
|
||
|
@@ -498,10 +504,18 @@ optionally using C<nbdkit.set_error> first.
|
||
|
|
||
|
=over 4
|
||
|
|
||
|
-=item Missing: C<load> and C<unload>
|
||
|
+=item Missing: C<load>
|
||
|
|
||
|
-These are not needed because you can just use ordinary Python
|
||
|
-constructs.
|
||
|
+This is not needed since you can use regular Python mechanisms like
|
||
|
+top level statements to run code when the module is loaded.
|
||
|
+
|
||
|
+=item Missing: C<unload>
|
||
|
+
|
||
|
+This is missing, but in nbdkit E<ge> 1.28 you can put code in the
|
||
|
+C<cleanup()> function to have it run when nbdkit exits. In earlier
|
||
|
+versions of nbdkit, using a Python
|
||
|
+L<atexit|https://docs.python.org/3/library/atexit.html> handler is
|
||
|
+recommended.
|
||
|
|
||
|
=item Missing:
|
||
|
C<name>,
|
||
|
diff --git a/plugins/python/plugin.c b/plugins/python/plugin.c
|
||
|
index 64430a1a..f85512b4 100644
|
||
|
--- a/plugins/python/plugin.c
|
||
|
+++ b/plugins/python/plugin.c
|
||
|
@@ -298,6 +298,24 @@ py_after_fork (void)
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
+static void
|
||
|
+py_cleanup (void)
|
||
|
+{
|
||
|
+ ACQUIRE_PYTHON_GIL_FOR_CURRENT_SCOPE;
|
||
|
+ PyObject *fn;
|
||
|
+ PyObject *r;
|
||
|
+
|
||
|
+ if (callback_defined ("cleanup", &fn)) {
|
||
|
+ PyErr_Clear ();
|
||
|
+
|
||
|
+ r = PyObject_CallObject (fn, NULL);
|
||
|
+ Py_DECREF (fn);
|
||
|
+ if (check_python_failure ("cleanup") == -1)
|
||
|
+ return;
|
||
|
+ Py_DECREF (r);
|
||
|
+ }
|
||
|
+}
|
||
|
+
|
||
|
static int
|
||
|
py_list_exports (int readonly, int is_tls, struct nbdkit_exports *exports)
|
||
|
{
|
||
|
@@ -1039,6 +1057,7 @@ static struct nbdkit_plugin plugin = {
|
||
|
.thread_model = py_thread_model,
|
||
|
.get_ready = py_get_ready,
|
||
|
.after_fork = py_after_fork,
|
||
|
+ .cleanup = py_cleanup,
|
||
|
.list_exports = py_list_exports,
|
||
|
.default_export = py_default_export,
|
||
|
|
||
|
--
|
||
|
2.31.1
|
||
|
|