4352: more memory leak problems
Fix some memory leak problems in guioptions svn: r16521
This commit is contained in:
		@@ -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
 | 
			
		||||
        
 | 
			
		||||
#-------------------------------------------------------------------------
 | 
			
		||||
#
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user