From 2a589c0f4b7dae68c6954b028b734242c404bf47 Mon Sep 17 00:00:00 2001 From: Marc Khouzam Date: Mon, 13 Apr 2009 15:53:14 +0000 Subject: [PATCH] [202346] Create GdbSteppingModeTarget that checks if we are doing a post-mortem launch, to know if the stepping mode button should be disabled. --- .../gdb/internal/ui/GdbAdapterFactory.java | 7 +- .../ui/actions/GdbSteppingModeTarget.java | 69 +++++++++++++++++++ 2 files changed, 73 insertions(+), 3 deletions(-) create mode 100644 dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/actions/GdbSteppingModeTarget.java diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/GdbAdapterFactory.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/GdbAdapterFactory.java index d0eca3c6b6e..a2c20d28410 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/GdbAdapterFactory.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/GdbAdapterFactory.java @@ -23,7 +23,6 @@ import org.eclipse.cdt.dsf.debug.ui.actions.DsfResumeCommand; import org.eclipse.cdt.dsf.debug.ui.actions.DsfStepIntoCommand; import org.eclipse.cdt.dsf.debug.ui.actions.DsfStepOverCommand; import org.eclipse.cdt.dsf.debug.ui.actions.DsfStepReturnCommand; -import org.eclipse.cdt.dsf.debug.ui.actions.DsfSteppingModeTarget; import org.eclipse.cdt.dsf.debug.ui.actions.DsfSuspendCommand; import org.eclipse.cdt.dsf.debug.ui.contexts.DsfSuspendTrigger; import org.eclipse.cdt.dsf.debug.ui.sourcelookup.DsfSourceDisplayAdapter; @@ -45,6 +44,7 @@ import org.eclipse.cdt.dsf.gdb.internal.ui.actions.GdbReverseResumeCommand; import org.eclipse.cdt.dsf.gdb.internal.ui.actions.GdbReverseStepIntoCommand; import org.eclipse.cdt.dsf.gdb.internal.ui.actions.GdbReverseStepOverCommand; import org.eclipse.cdt.dsf.gdb.internal.ui.actions.GdbReverseToggleCommand; +import org.eclipse.cdt.dsf.gdb.internal.ui.actions.GdbSteppingModeTarget; import org.eclipse.cdt.dsf.gdb.internal.ui.actions.GdbUncallCommand; import org.eclipse.cdt.dsf.gdb.internal.ui.viewmodel.GdbViewModelAdapter; import org.eclipse.cdt.dsf.gdb.launching.GdbLaunch; @@ -101,7 +101,7 @@ public class GdbAdapterFactory final GdbDisconnectCommand fDisconnectCommand; final IDebugModelProvider fDebugModelProvider; final DsfSuspendTrigger fSuspendTrigger; - final DsfSteppingModeTarget fSteppingModeTarget; + final GdbSteppingModeTarget fSteppingModeTarget; final IModelSelectionPolicyFactory fModelSelectionPolicyFactory; final SteppingController fSteppingController; final DefaultRefreshAllTarget fRefreshAllTarget; @@ -124,7 +124,7 @@ public class GdbAdapterFactory } session.registerModelAdapter(ISourceDisplay.class, fSourceDisplayAdapter); - fSteppingModeTarget= new DsfSteppingModeTarget(); + fSteppingModeTarget = new GdbSteppingModeTarget(session); fStepIntoCommand = new DsfStepIntoCommand(session, fSteppingModeTarget); fReverseStepIntoCommand = new GdbReverseStepIntoCommand(session, fSteppingModeTarget); fStepOverCommand = new DsfStepOverCommand(session, fSteppingModeTarget); @@ -206,6 +206,7 @@ public class GdbAdapterFactory session.unregisterModelAdapter(IRefreshAllTarget.class); session.unregisterModelAdapter(IReverseToggleHandler.class); + fSteppingModeTarget.dispose(); fStepIntoCommand.dispose(); fReverseStepIntoCommand.dispose(); fStepOverCommand.dispose(); diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/actions/GdbSteppingModeTarget.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/actions/GdbSteppingModeTarget.java new file mode 100644 index 00000000000..08dcaa158f3 --- /dev/null +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/actions/GdbSteppingModeTarget.java @@ -0,0 +1,69 @@ +/******************************************************************************* + * Copyright (c) 2009 Ericsson and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Ericsson - Initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.dsf.gdb.internal.ui.actions; + +import java.util.concurrent.ExecutionException; + +import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor; +import org.eclipse.cdt.dsf.concurrent.DsfExecutor; +import org.eclipse.cdt.dsf.concurrent.Query; +import org.eclipse.cdt.dsf.debug.ui.actions.DsfSteppingModeTarget; +import org.eclipse.cdt.dsf.gdb.internal.ui.GdbUIPlugin; +import org.eclipse.cdt.dsf.gdb.service.IGDBBackend; +import org.eclipse.cdt.dsf.gdb.service.SessionType; +import org.eclipse.cdt.dsf.service.DsfServicesTracker; +import org.eclipse.cdt.dsf.service.DsfSession; + +/** + * SteppingModeTarget that allows to disable the button when dealing + * with a post-mortem debugging session. + * + * @since 2.0 + */ +public class GdbSteppingModeTarget extends DsfSteppingModeTarget { + private final DsfExecutor fExecutor; + private final DsfServicesTracker fTracker; + + public GdbSteppingModeTarget(DsfSession session) { + fExecutor = session.getExecutor(); + fTracker = new DsfServicesTracker(GdbUIPlugin.getBundleContext(), session.getId()); + } + + public void dispose() { + fTracker.dispose(); + } + + @Override + public boolean supportsInstructionStepping() { + Query supportInstructionStepping = new Query() { + @Override + protected void execute(DataRequestMonitor rm) { + IGDBBackend backend = fTracker.getService(IGDBBackend.class); + if (backend != null) { + // PostMortem sessions do not support instruction stepping + rm.setData(backend.getSessionType() != SessionType.CORE); + } else { + rm.setData(false); + } + + rm.done(); + } + }; + + fExecutor.execute(supportInstructionStepping); + try { + return supportInstructionStepping.get(); + } catch (InterruptedException e1) { + } catch (ExecutionException e1) { + } + return false; + } +}