mirror of
https://github.com/virt-manager/virt-manager.git
synced 2025-02-25 18:55:27 -06:00
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:
parent
b6111b5e85
commit
a91137dbdd
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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):
|
||||
"""
|
||||
|
Loading…
Reference in New Issue
Block a user