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):
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):
if not self.is_disconnected():
return

View File

@ -45,8 +45,13 @@ from .error import vmmErrorDialog
from .systray import vmmSystray
from .delete import vmmDeleteDialog
# Enable this to get a report of leaked objects on app shutdown
# gtk3/pygobject has issues here as of Fedora 18
# Enabling this will tell us, at app exit time, which vmmGObjects were not
# 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
DETAILS_PERF = 1
@ -147,7 +152,7 @@ class vmmEngine(vmmGObject):
if self.systray:
return
self.systray = vmmSystray(self)
self.systray = vmmSystray()
self.systray.connect("action-toggle-manager", self._do_toggle_manager)
self.systray.connect("action-suspend-domain", self._do_suspend_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-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):
systray_enabled = self.config.get_view_system_tray()
if self.windows == 0 and not systray_enabled:
@ -347,6 +356,8 @@ class vmmEngine(vmmGObject):
% (conn.get_uri(), e))
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()
return 1

View File

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