From d8c3c0967d3b1204767534c9b85994b12a47e277 Mon Sep 17 00:00:00 2001 From: Jonah Graham Date: Thu, 22 Jun 2017 11:29:57 +0100 Subject: [PATCH] Bug 518627: Squelch Device Disposed exception at shutdown Note, can't simply check isDisposed as that still leaves a race condition between isDisposed call and asyncExec call Change-Id: I3e0e196d9d1dd9b9c8d4048a1aec55405d6dd6e0 --- .../gdb/internal/ui/console/GdbBasicCliConsole.java | 10 +++++++++- .../gdb/internal/ui/console/GdbFullCliConsole.java | 11 ++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/console/GdbBasicCliConsole.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/console/GdbBasicCliConsole.java index 86e5418091d..1b4684a0896 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/console/GdbBasicCliConsole.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/console/GdbBasicCliConsole.java @@ -23,6 +23,7 @@ import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.ui.DebugUITools; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.swt.SWT; +import org.eclipse.swt.SWTException; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.console.IConsoleView; @@ -145,7 +146,14 @@ public class GdbBasicCliConsole extends IOConsole implements IGDBDebuggerConsole String newName = computeName(); String name = getName(); if (!name.equals(newName)) { - PlatformUI.getWorkbench().getDisplay().asyncExec(() -> setName(newName)); + try { + PlatformUI.getWorkbench().getDisplay().asyncExec(() -> setName(newName)); + } catch (SWTException e) { + // display may be disposed, so ignore the exception + if (e.code != SWT.ERROR_WIDGET_DISPOSED) { + throw e; + } + } } } diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/console/GdbFullCliConsole.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/console/GdbFullCliConsole.java index 252f0e3a4a8..e21fed3260f 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/console/GdbFullCliConsole.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/console/GdbFullCliConsole.java @@ -13,6 +13,8 @@ import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.ui.DebugUITools; +import org.eclipse.swt.SWT; +import org.eclipse.swt.SWTException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.console.AbstractConsole; import org.eclipse.ui.console.IConsoleView; @@ -59,7 +61,14 @@ public class GdbFullCliConsole extends AbstractConsole implements IGDBDebuggerCo String newName = computeName(); String name = getName(); if (!name.equals(newName)) { - PlatformUI.getWorkbench().getDisplay().asyncExec(() -> setName(newName)); + try { + PlatformUI.getWorkbench().getDisplay().asyncExec(() -> setName(newName)); + } catch (SWTException e) { + // display may be disposed, so ignore the exception + if (e.code != SWT.ERROR_WIDGET_DISPOSED) { + throw e; + } + } } }