mirror of
https://github.com/virt-manager/virt-manager.git
synced 2025-02-25 18:55:27 -06:00
delete: Don't run UI routines from a thread
Pull the remove_devobj_internal call outside of the async job, otherwise we can have X11 threading issues Signed-off-by: Cole Robinson <crobinso@redhat.com>
This commit is contained in:
parent
3ab35320a1
commit
1a9e2f4f76
@ -71,6 +71,9 @@ class _vmmDeleteBase(vmmGObjectUI):
|
|||||||
def _delete_vm(self, vm):
|
def _delete_vm(self, vm):
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|
||||||
|
def _remove_device(self, paths):
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
def _delete_disks(self, vm, paths, conn, meter):
|
def _delete_disks(self, vm, paths, conn, meter):
|
||||||
storage_errors = []
|
storage_errors = []
|
||||||
for path in paths:
|
for path in paths:
|
||||||
@ -204,6 +207,12 @@ class _vmmDeleteBase(vmmGObjectUI):
|
|||||||
return
|
return
|
||||||
|
|
||||||
self.set_finish_cursor()
|
self.set_finish_cursor()
|
||||||
|
|
||||||
|
if not self._remove_device(devs):
|
||||||
|
# Don't delete storage if device removal failed
|
||||||
|
self._delete_finished_cb(None, None)
|
||||||
|
return
|
||||||
|
|
||||||
title, text = self._get_title_text(devs)
|
title, text = self._get_title_text(devs)
|
||||||
|
|
||||||
progWin = vmmAsyncJob(self._async_delete, [self.vm, devs],
|
progWin = vmmAsyncJob(self._async_delete, [self.vm, devs],
|
||||||
@ -293,6 +302,10 @@ class vmmDeleteDialog(_vmmDeleteBase):
|
|||||||
vm_active = self.vm.is_active()
|
vm_active = self.vm.is_active()
|
||||||
return vm_active
|
return vm_active
|
||||||
|
|
||||||
|
def _remove_device(self, paths):
|
||||||
|
dummy = paths
|
||||||
|
return True
|
||||||
|
|
||||||
def _delete_vm(self, vm):
|
def _delete_vm(self, vm):
|
||||||
if vm.is_persistent():
|
if vm.is_persistent():
|
||||||
log.debug("Removing VM '%s'", vm.get_name())
|
log.debug("Removing VM '%s'", vm.get_name())
|
||||||
@ -306,7 +319,7 @@ class vmmDeleteDialog(_vmmDeleteBase):
|
|||||||
|
|
||||||
class vmmDeleteStorage(_vmmDeleteBase):
|
class vmmDeleteStorage(_vmmDeleteBase):
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def remove_devobj_internal(vm, err, devobj):
|
def remove_devobj_internal(vm, err, devobj, deleting_storage=False):
|
||||||
log.debug("Removing device: %s", devobj)
|
log.debug("Removing device: %s", devobj)
|
||||||
|
|
||||||
# Define the change
|
# Define the change
|
||||||
@ -328,11 +341,14 @@ class vmmDeleteStorage(_vmmDeleteBase):
|
|||||||
if not detach_err:
|
if not detach_err:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
msg = _("This change will take effect after the next guest shutdown.")
|
||||||
|
if deleting_storage:
|
||||||
|
msg += " "
|
||||||
|
msg += _("Storage will not be deleted.")
|
||||||
|
|
||||||
err.show_err(
|
err.show_err(
|
||||||
_("Device could not be removed from the running machine"),
|
_("Device could not be removed from the running machine"),
|
||||||
details=(detach_err[0] + "\n\n" + detach_err[1]),
|
details=(detach_err[0] + "\n\n" + detach_err[1]), text2=msg,
|
||||||
text2=_("This change will take effect after the next guest "
|
|
||||||
"shutdown."),
|
|
||||||
buttons=Gtk.ButtonsType.OK,
|
buttons=Gtk.ButtonsType.OK,
|
||||||
dialog_type=Gtk.MessageType.INFO)
|
dialog_type=Gtk.MessageType.INFO)
|
||||||
|
|
||||||
@ -354,12 +370,17 @@ class vmmDeleteStorage(_vmmDeleteBase):
|
|||||||
def _vm_active_status(self):
|
def _vm_active_status(self):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def _remove_device(self, paths):
|
||||||
|
deleting_storage = bool(paths)
|
||||||
|
return vmmDeleteStorage.remove_devobj_internal(
|
||||||
|
self.vm, self.err, self.disk,
|
||||||
|
deleting_storage=deleting_storage)
|
||||||
|
|
||||||
def _delete_vm(self, vm):
|
def _delete_vm(self, vm):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def _delete_disks(self, vm, paths, conn, meter):
|
def _delete_disks(self, vm, paths, conn, meter):
|
||||||
storage_errors = []
|
storage_errors = []
|
||||||
vmmDeleteStorage.remove_devobj_internal(vm, self.err, self.disk)
|
|
||||||
if paths:
|
if paths:
|
||||||
super()._delete_disks(vm, paths, conn, meter)
|
super()._delete_disks(vm, paths, conn, meter)
|
||||||
return storage_errors
|
return storage_errors
|
||||||
|
Loading…
Reference in New Issue
Block a user