diff options
| author | Justus Winter <[email protected]> | 2016-05-27 10:25:59 +0000 | 
|---|---|---|
| committer | Justus Winter <[email protected]> | 2016-05-27 10:25:59 +0000 | 
| commit | ebfe2300c33a3bad311e9ac1530e6c92636a08a4 (patch) | |
| tree | fa0eadc62b574c5838664eb93c3dadc879ace5b1 /lang/python/pyme/core.py | |
| parent | Improve comments. (diff) | |
| download | gpgme-ebfe2300c33a3bad311e9ac1530e6c92636a08a4.tar.gz gpgme-ebfe2300c33a3bad311e9ac1530e6c92636a08a4.zip | |
python: Fix object deallocation.
Handing a reference to the wrapper object created a non-trivial
circular reference that Pythons garbage collector is unable to break.
Explicitly break it by using a weak reference.
* lang/python/helpers.c (pygpgme_stash_callback_exception): Retrieve
object from weak reference.
* lang/python/pyme/core.py (Context.__del__): Free status callback.
(Context.set_passphrase_cb): Use a weak reference.
(Context.set_progress_cb): Likewise.
(Context.set_status_cb): Likewise.
(Context.op_edit): Likewise.
Signed-off-by: Justus Winter <[email protected]>
Diffstat (limited to 'lang/python/pyme/core.py')
| -rw-r--r-- | lang/python/pyme/core.py | 21 | 
1 files changed, 10 insertions, 11 deletions
| diff --git a/lang/python/pyme/core.py b/lang/python/pyme/core.py index 0c2dd602..6ef2dabe 100644 --- a/lang/python/pyme/core.py +++ b/lang/python/pyme/core.py @@ -16,9 +16,7 @@  #    License along with this library; if not, write to the Free Software  #    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA -# import generators for portability with python2.2 - - +import weakref  from . import pygpgme  from .errors import errorcheck, GPGMEError  from . import errors @@ -149,6 +147,7 @@ class Context(GpgmeWrapper):          self._free_passcb()          self._free_progresscb() +        self._free_statuscb()          if self.own and pygpgme.gpgme_release:              pygpgme.gpgme_release(self.wrapped) @@ -252,9 +251,9 @@ class Context(GpgmeWrapper):          else:              self.last_passcb = pygpgme.new_PyObject_p_p()              if hook == None: -                hookdata = (self, func) +                hookdata = (weakref.ref(self), func)              else: -                hookdata = (self, func, hook) +                hookdata = (weakref.ref(self), func, hook)          pygpgme.pygpgme_set_passphrase_cb(self.wrapped, hookdata, self.last_passcb)      def set_progress_cb(self, func, hook=None): @@ -275,9 +274,9 @@ class Context(GpgmeWrapper):          else:              self.last_progresscb = pygpgme.new_PyObject_p_p()              if hook == None: -                hookdata = (self, func) +                hookdata = (weakref.ref(self), func)              else: -                hookdata = (self, func, hook) +                hookdata = (weakref.ref(self), func, hook)          pygpgme.pygpgme_set_progress_cb(self.wrapped, hookdata, self.last_progresscb)      def set_status_cb(self, func, hook=None): @@ -297,9 +296,9 @@ class Context(GpgmeWrapper):          else:              self.last_statuscb = pygpgme.new_PyObject_p_p()              if hook == None: -                hookdata = (self, func) +                hookdata = (weakref.ref(self), func)              else: -                hookdata = (self, func, hook) +                hookdata = (weakref.ref(self), func, hook)          pygpgme.pygpgme_set_status_cb(self.wrapped, hookdata,                                        self.last_statuscb) @@ -333,9 +332,9 @@ class Context(GpgmeWrapper):          if key == None:              raise ValueError("op_edit: First argument cannot be None")          if fnc_value: -            opaquedata = (self, func, fnc_value) +            opaquedata = (weakref.ref(self), func, fnc_value)          else: -            opaquedata = (self, func) +            opaquedata = (weakref.ref(self), func)          result = pygpgme.gpgme_op_edit(self.wrapped, key, opaquedata, out)          if self._callback_excinfo: | 
