From 2d052d69cfab454f803ff33db78e75745be593f2 Mon Sep 17 00:00:00 2001 From: Benny Malengier Date: Mon, 31 Jan 2011 20:39:41 +0000 Subject: [PATCH] 4352: more memory leak problems Fix some memory leak problems in guioptions svn: r16521 --- src/gui/plug/_guioptions.py | 58 ++++++++++++++++++++++++---- src/gui/plug/report/_reportdialog.py | 33 +++++++++++++++- 2 files changed, 83 insertions(+), 8 deletions(-) diff --git a/src/gui/plug/_guioptions.py b/src/gui/plug/_guioptions.py index cd853b5cf..5c43d82e5 100644 --- a/src/gui/plug/_guioptions.py +++ b/src/gui/plug/_guioptions.py @@ -173,7 +173,7 @@ class GuiStringOption(gtk.Entry): self.connect('changed', self.__text_changed) self.set_tooltip_text(self.__option.get_help()) - self.__option.connect('avail-changed', self.__update_avail) + self.conkey = self.__option.connect('avail-changed', self.__update_avail) self.__update_avail() def __text_changed(self, obj): # IGNORE:W0613 - obj is unused @@ -189,6 +189,13 @@ class GuiStringOption(gtk.Entry): avail = self.__option.get_available() self.set_sensitive(avail) + def clean_up(self): + """ + remove stuff that blocks garbage collection + """ + self.__option.disconnect(self.conkey) + self.__option = None + #------------------------------------------------------------------------- # # GuiColorOption class @@ -248,7 +255,7 @@ class GuiNumberOption(gtk.SpinButton): self.connect('value_changed', self.__value_changed) self.set_tooltip_text(self.__option.get_help()) - self.__option.connect('avail-changed', self.__update_avail) + self.conkey = self.__option.connect('avail-changed', self.__update_avail) self.__update_avail() def __value_changed(self, obj): # IGNORE:W0613 - obj is unused @@ -265,6 +272,13 @@ class GuiNumberOption(gtk.SpinButton): avail = self.__option.get_available() self.set_sensitive(avail) + def clean_up(self): + """ + remove stuff that blocks garbage collection + """ + self.__option.disconnect(self.conkey) + self.__option = None + #------------------------------------------------------------------------- # # GuiTextOption class @@ -293,7 +307,7 @@ class GuiTextOption(gtk.ScrolledWindow): gtext.set_tooltip_text(self.__option.get_help()) self.__buff = gtext.get_buffer() - self.__buff.connect('changed', self.__value_changed) + self.bufcon = self.__buff.connect('changed', self.__value_changed) def __value_changed(self, obj): # IGNORE:W0613 - obj is unused """ @@ -303,6 +317,14 @@ class GuiTextOption(gtk.ScrolledWindow): self.__buff.get_end_iter(), False) ) self.__option.set_value( text_val.split('\n') ) + + def clean_up(self): + """ + remove stuff that blocks garbage collection + """ + self.__option = None + self.__buff.disconnect(self.bufcon) + self.__buff = None #------------------------------------------------------------------------- # @@ -320,7 +342,7 @@ class GuiBooleanOption(gtk.CheckButton): self.connect('toggled', self.__value_changed) self.set_tooltip_text(self.__option.get_help()) - self.__option.connect('avail-changed', self.__update_avail) + self.conkey = self.__option.connect('avail-changed', self.__update_avail) self.__update_avail() def __value_changed(self, obj): # IGNORE:W0613 - obj is unused @@ -336,6 +358,13 @@ class GuiBooleanOption(gtk.CheckButton): avail = self.__option.get_available() self.set_sensitive(avail) + def clean_up(self): + """ + remove stuff that blocks garbage collection + """ + self.__option.disconnect(self.conkey) + self.__option = None + #------------------------------------------------------------------------- # # GuiEnumeratedListOption class @@ -359,8 +388,8 @@ class GuiEnumeratedListOption(gtk.HBox): self.set_tooltip_text(self.__option.get_help()) self.__combo.connect('changed', self.__value_changed) - self.__option.connect('options-changed', self.__update_options) - self.__option.connect('avail-changed', self.__update_avail) + self.conkey1 = self.__option.connect('options-changed', self.__update_options) + self.conkey2 = self.__option.connect('avail-changed', self.__update_avail) self.__update_avail() def __value_changed(self, obj): # IGNORE:W0613 - obj is unused @@ -400,6 +429,14 @@ class GuiEnumeratedListOption(gtk.HBox): avail = self.__option.get_available() self.set_sensitive(avail) + def clean_up(self): + """ + remove stuff that blocks garbage collection + """ + self.__option.disconnect(self.conkey1) + self.__option.disconnect(self.conkey2) + self.__option = None + #------------------------------------------------------------------------- # # GuiPersonOption class @@ -443,7 +480,7 @@ class GuiPersonOption(gtk.HBox): pevt.set_tooltip_text(self.__option.get_help()) person_button.set_tooltip_text(_('Select a different person')) - self.__option.connect('avail-changed', self.__update_avail) + self.conkey = self.__option.connect('avail-changed', self.__update_avail) self.__update_avail() def __get_person_clicked(self, obj): # IGNORE:W0613 - obj is unused @@ -492,6 +529,13 @@ class GuiPersonOption(gtk.HBox): """ avail = self.__option.get_available() self.set_sensitive(avail) + + def clean_up(self): + """ + remove stuff that blocks garbage collection + """ + self.__option.disconnect(self.conkey) + self.__option = None #------------------------------------------------------------------------- # diff --git a/src/gui/plug/report/_reportdialog.py b/src/gui/plug/report/_reportdialog.py index 93e0b763b..e3bc0dca1 100644 --- a/src/gui/plug/report/_reportdialog.py +++ b/src/gui/plug/report/_reportdialog.py @@ -97,7 +97,30 @@ class ReportDialog(ManagedWindow.ManagedWindow): self.init_options(option_class) self.init_interface() - + + def close(self, *obj): + """ + Close itself. + cleanup things that can prevent garbage collection + """ + totwidg = range(len(self.widgets)) + totwidg.reverse() + for ind in totwidg: + if hasattr(self.widgets[ind][1], 'clean_up'): + self.widgets[ind][1].clean_up() + del self.widgets[ind] + delattr(self, 'widgets') + for name, fram in self.frames.iteritems(): + totwidg = range(len(fram)) + totwidg.reverse() + for ind in totwidg: + if hasattr(fram[ind][1], 'clean_up'): + fram[ind][1].clean_up() + del fram[ind] + self.frames.clear() + self.frames = None + ManagedWindow.ManagedWindow.close(self, *obj) + def init_options(self, option_class): try: if (issubclass(option_class, object) or # New-style class @@ -657,3 +680,11 @@ def report(dbstate, uistate, person, report_class, options_class, #just stop, in ManagedWindow, delete-event is already coupled to #correct action. break + #do needed cleanup + dialog.db = None + dialog.options = None + if hasattr(dialog, 'window'): + delattr(dialog, 'window') + if hasattr(dialog, 'notebook'): + delattr(dialog, 'notebook') + del dialog