aboutsummaryrefslogtreecommitdiffstats
path: root/lang/python/pyme/core.py
diff options
context:
space:
mode:
authorJustus Winter <[email protected]>2016-05-12 09:53:43 +0000
committerJustus Winter <[email protected]>2016-05-12 09:53:43 +0000
commitce5121ad53b0e17fbf9150b354c80da73f7fe190 (patch)
tree8e167972020ad706bb2fdf913b14ab2a7ce9d6f2 /lang/python/pyme/core.py
parentpython: Make test case more robust. (diff)
downloadgpgme-ce5121ad53b0e17fbf9150b354c80da73f7fe190.tar.gz
gpgme-ce5121ad53b0e17fbf9150b354c80da73f7fe190.zip
python: Handle interpreter shutdown.
* lang/python/pyme/core.py: Avoid races at interpreter shutdown. This silences the most annoying occurrences, however this problem also affects the SWIG generated code, which might indicate that the real problem is somewhere else. If so, this change can be easily reverted. Signed-off-by: Justus Winter <[email protected]>
Diffstat (limited to 'lang/python/pyme/core.py')
-rw-r--r--lang/python/pyme/core.py30
1 files changed, 22 insertions, 8 deletions
diff --git a/lang/python/pyme/core.py b/lang/python/pyme/core.py
index fd4802ec..2a37ba35 100644
--- a/lang/python/pyme/core.py
+++ b/lang/python/pyme/core.py
@@ -66,21 +66,29 @@ class Context(GpgmeWrapper):
self.last_progresscb = None
def __del__(self):
+ if not pygpgme:
+ # At interpreter shutdown, pygpgme is set to NONE.
+ return
+
self._free_passcb()
self._free_progresscb()
- if self.own:
+ if self.own and pygpgme.gpgme_release:
pygpgme.gpgme_release(self.wrapped)
def _free_passcb(self):
if self.last_passcb != None:
- pygpgme.pygpgme_clear_generic_cb(self.last_passcb)
- pygpgme.delete_PyObject_p_p(self.last_passcb)
+ if pygpgme.pygpgme_clear_generic_cb:
+ pygpgme.pygpgme_clear_generic_cb(self.last_passcb)
+ if pygpgme.delete_PyObject_p_p:
+ pygpgme.delete_PyObject_p_p(self.last_passcb)
self.last_passcb = None
def _free_progresscb(self):
if self.last_progresscb != None:
- pygpgme.pygpgme_clear_generic_cb(self.last_progresscb)
- pygpgme.delete_PyObject_p_p(self.last_progresscb)
+ if pygpgme.pygpgme_clear_generic_cb:
+ pygpgme.pygpgme_clear_generic_cb(self.last_progresscb)
+ if pygpgme.delete_PyObject_p_p:
+ pygpgme.delete_PyObject_p_p(self.last_progresscb)
self.last_progresscb = None
def op_keylist_all(self, *args, **kwargs):
@@ -292,14 +300,20 @@ class Data(GpgmeWrapper):
self.new()
def __del__(self):
- if self.wrapped != None:
+ if not pygpgme:
+ # At interpreter shutdown, pygpgme is set to NONE.
+ return
+
+ if self.wrapped != None and pygpgme.gpgme_data_release:
pygpgme.gpgme_data_release(self.wrapped)
self._free_readcb()
def _free_readcb(self):
if self.last_readcb != None:
- pygpgme.pygpgme_clear_generic_cb(self.last_readcb)
- pygpgme.delete_PyObject_p_p(self.last_readcb)
+ if pygpgme.pygpgme_clear_generic_cb:
+ pygpgme.pygpgme_clear_generic_cb(self.last_readcb)
+ if pygpgme.delete_PyObject_p_p:
+ pygpgme.delete_PyObject_p_p(self.last_readcb)
self.last_readcb = None
def new(self):