engine: Clean up some object lifecycle leaks

pygobject doesn't seem to choke on debug_leak_check anymore, so we
can use it to find object leaks. just doing a few for now since it's
generally not a big deal.
This commit is contained in:
Cole Robinson 2015-09-20 14:20:50 -04:00
parent b6111b5e85
commit a91137dbdd
3 changed files with 29 additions and 8 deletions

View File

@ -869,6 +869,13 @@ class vmmConnection(vmmGObject):
def _cleanup(self): def _cleanup(self):
self.close() self.close()
self._objects = None
self._backend.cb_fetch_all_guests = None
self._backend.cb_fetch_all_pools = None
self._backend.cb_fetch_all_nodedevs = None
self._backend.cb_fetch_all_vols = None
self._backend.cb_clear_cache = None
def open(self): def open(self):
if not self.is_disconnected(): if not self.is_disconnected():
return return

View File

@ -45,8 +45,13 @@ from .error import vmmErrorDialog
from .systray import vmmSystray from .systray import vmmSystray
from .delete import vmmDeleteDialog from .delete import vmmDeleteDialog
# Enable this to get a report of leaked objects on app shutdown # Enabling this will tell us, at app exit time, which vmmGObjects were not
# gtk3/pygobject has issues here as of Fedora 18 # garbage collected. This is caused by circular references to other objects,
# like a signal that wasn't disconnected. It's not a big deal, but if we
# have objects that can be created and destroyed a lot over the course of
# the app lifecycle, every non-garbage collected class is a memory leak.
# So it's nice to poke at this every now and then and try to track down
# what we need to add to class _cleanup handling.
debug_ref_leaks = False debug_ref_leaks = False
DETAILS_PERF = 1 DETAILS_PERF = 1
@ -147,7 +152,7 @@ class vmmEngine(vmmGObject):
if self.systray: if self.systray:
return return
self.systray = vmmSystray(self) self.systray = vmmSystray()
self.systray.connect("action-toggle-manager", self._do_toggle_manager) self.systray.connect("action-toggle-manager", self._do_toggle_manager)
self.systray.connect("action-suspend-domain", self._do_suspend_domain) self.systray.connect("action-suspend-domain", self._do_suspend_domain)
self.systray.connect("action-resume-domain", self._do_resume_domain) self.systray.connect("action-resume-domain", self._do_resume_domain)
@ -163,6 +168,10 @@ class vmmEngine(vmmGObject):
self.systray.connect("action-clone-domain", self._do_show_clone) self.systray.connect("action-clone-domain", self._do_show_clone)
self.systray.connect("action-exit-app", self.exit_app) self.systray.connect("action-exit-app", self.exit_app)
self.connect("conn-added", self.systray.conn_added)
self.connect("conn-removed", self.systray.conn_removed)
def system_tray_changed(self, *ignore): def system_tray_changed(self, *ignore):
systray_enabled = self.config.get_view_system_tray() systray_enabled = self.config.get_view_system_tray()
if self.windows == 0 and not systray_enabled: if self.windows == 0 and not systray_enabled:
@ -347,6 +356,8 @@ class vmmEngine(vmmGObject):
% (conn.get_uri(), e)) % (conn.get_uri(), e))
self.idle_add(self._handle_tick_error, error_msg, tb) self.idle_add(self._handle_tick_error, error_msg, tb)
# Need to clear reference to make leak check happy
conn = None
self._tick_queue.task_done() self._tick_queue.task_done()
return 1 return 1

View File

@ -53,7 +53,7 @@ class vmmSystray(vmmGObject):
"action-exit-app": (GObject.SignalFlags.RUN_FIRST, None, []), "action-exit-app": (GObject.SignalFlags.RUN_FIRST, None, []),
} }
def __init__(self, engine): def __init__(self):
vmmGObject.__init__(self) vmmGObject.__init__(self)
self.topwin = None self.topwin = None
@ -66,9 +66,6 @@ class vmmSystray(vmmGObject):
self.systray_icon = None self.systray_icon = None
self.systray_indicator = False self.systray_indicator = False
engine.connect("conn-added", self.conn_added)
engine.connect("conn-removed", self.conn_removed)
# Are we using Application Indicators? # Are we using Application Indicators?
if AppIndicator3 is not None: if AppIndicator3 is not None:
self.systray_indicator = True self.systray_indicator = True
@ -97,8 +94,14 @@ class vmmSystray(vmmGObject):
self.systray_menu = None self.systray_menu = None
self.systray_icon = None self.systray_icon = None
self.conn_menuitems = None
self.conn_vm_menuitems = None
self.vm_action_dict = None
# Initialization routines
###########################
# Initialization routines #
###########################
def init_systray_menu(self): def init_systray_menu(self):
""" """