diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/IChangeReverseMethodHandler.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/IChangeReverseMethodHandler.java index c24f3ec3169..63036bee9bf 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/IChangeReverseMethodHandler.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/IChangeReverseMethodHandler.java @@ -29,4 +29,6 @@ public interface IChangeReverseMethodHandler extends IReverseToggleHandler, IDeb * */ ReverseTraceMethod getTraceMethod(Object context); + + ReverseTraceMethod getLastTraceMethod(Object context); } diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/commands/ReverseToggleCommandHandler.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/commands/ReverseToggleCommandHandler.java index b825befa576..4be744d5d77 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/commands/ReverseToggleCommandHandler.java +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/commands/ReverseToggleCommandHandler.java @@ -56,8 +56,6 @@ import org.osgi.framework.Bundle; * @since 7.0 */ public class ReverseToggleCommandHandler extends DebugCommandHandler implements IDebugContextListener, IElementUpdater { - private ReverseTraceMethod fTraceMethod; - private ReverseTraceMethod fLastTraceMethod; private static final ImageDescriptor REVERSE_TOGGLE_DEFAULT_IMAGE = getImageDescriptor("icons/obj16/reverse_toggle.gif"); //$NON-NLS-1$ private static final ImageDescriptor REVERSE_TOGGLE_SOFTWARE_ON_IMAGE = getImageDescriptor("icons/obj16/reverse_toggle_sw_on.png"); //$NON-NLS-1$ @@ -109,8 +107,6 @@ public class ReverseToggleCommandHandler extends DebugCommandHandler implements // This can happen if we activate the action set after the launch. refresh(fContextService.getActiveContext()); - fTraceMethod = ReverseTraceMethod.STOP_TRACE; - fLastTraceMethod = ReverseTraceMethod.STOP_TRACE; } } } @@ -207,9 +203,10 @@ public class ReverseToggleCommandHandler extends DebugCommandHandler implements // Disable tracing if (fTargetAdapter != null && fTargetAdapter instanceof IChangeReverseMethodHandler) { if (fTargetAdapter.toggleNeedsUpdating()) { + ReverseTraceMethod LastTraceMethod = ((IChangeReverseMethodHandler)fTargetAdapter).getLastTraceMethod(fActiveContext); ReverseTraceMethod currMethod = ((IChangeReverseMethodHandler)fTargetAdapter).getTraceMethod(fActiveContext); if (currMethod == ReverseTraceMethod.STOP_TRACE) { - if (fLastTraceMethod == ReverseTraceMethod.HARDWARE_TRACE) { + if (LastTraceMethod == ReverseTraceMethod.HARDWARE_TRACE) { traceMethod = ReverseTraceMethod.HARDWARE_TRACE; } else { traceMethod = ReverseTraceMethod.FULL_TRACE; @@ -273,26 +270,23 @@ public class ReverseToggleCommandHandler extends DebugCommandHandler implements @SuppressWarnings("rawtypes") Map parameters) { if (fTargetAdapter != null && fTargetAdapter instanceof IChangeReverseMethodHandler) { ReverseTraceMethod reverseMethod = ((IChangeReverseMethodHandler)fTargetAdapter).getTraceMethod(fActiveContext); + ReverseTraceMethod LastTraceMethod = ((IChangeReverseMethodHandler)fTargetAdapter).getLastTraceMethod(fActiveContext); ICommandService commandService = PlatformUI.getWorkbench().getService(ICommandService.class); - if (reverseMethod != fTraceMethod) { - fLastTraceMethod = fTraceMethod; - fTraceMethod = reverseMethod; - } try{ - if (fTraceMethod == ReverseTraceMethod.HARDWARE_TRACE) { + if (reverseMethod == ReverseTraceMethod.HARDWARE_TRACE) { HandlerUtil.updateRadioState(commandService.getCommand(REVERSE_TOGGLE_COMMAND_ID), "UseHardTrace"); //$NON-NLS-1$ element.setTooltip(Messages.ReverseDebugging_ToggleHardwareTrace); element.setIcon(REVERSE_TOGGLE_HARDWARE_ON_IMAGE); - } else if (fTraceMethod == ReverseTraceMethod.FULL_TRACE) { + } else if (reverseMethod == ReverseTraceMethod.FULL_TRACE) { HandlerUtil.updateRadioState(commandService.getCommand(REVERSE_TOGGLE_COMMAND_ID), "UseSoftTrace"); //$NON-NLS-1$ element.setTooltip(Messages.ReverseDebugging_ToggleSoftwareTrace); element.setIcon(REVERSE_TOGGLE_SOFTWARE_ON_IMAGE); } else { element.setTooltip(Messages.ReverseDebugging_ToggleReverseDebugging); HandlerUtil.updateRadioState(commandService.getCommand(REVERSE_TOGGLE_COMMAND_ID), "TraceOff"); //$NON-NLS-1$ - if (fLastTraceMethod == ReverseTraceMethod.HARDWARE_TRACE) { + if (LastTraceMethod == ReverseTraceMethod.HARDWARE_TRACE) { element.setIcon(REVERSE_TOGGLE_HARDWARE_OFF_IMAGE); - } else if (fLastTraceMethod == ReverseTraceMethod.FULL_TRACE) { + } else if (LastTraceMethod == ReverseTraceMethod.FULL_TRACE) { element.setIcon(REVERSE_TOGGLE_SOFTWARE_OFF_IMAGE); } else { element.setIcon(REVERSE_TOGGLE_DEFAULT_IMAGE); diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbReverseToggleCommand.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbReverseToggleCommand.java index 66fc7f7d814..aea544bb683 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbReverseToggleCommand.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbReverseToggleCommand.java @@ -60,12 +60,17 @@ public class GdbReverseToggleCommand extends AbstractDebugCommand implements ICh private final DsfSession fSession; private ReverseTraceMethod fTraceMethod = null; - + private ReverseTraceMethod fLastTraceMethod = null; + private ReverseTraceMethod fNextTraceMethod = null; + public GdbReverseToggleCommand(DsfSession session) { fExecutor = session.getExecutor(); fTracker = new DsfServicesTracker(GdbUIPlugin.getBundleContext(), session.getId()); fSession = session; fTraceMethod = ReverseTraceMethod.STOP_TRACE; + fLastTraceMethod = ReverseTraceMethod.STOP_TRACE; + fNextTraceMethod = ReverseTraceMethod.STOP_TRACE; + try { fExecutor.execute(new DsfRunnable() { @Override @@ -108,8 +113,8 @@ public class GdbReverseToggleCommand extends AbstractDebugCommand implements ICh final IReverseRunControl2 runControl = fTracker.getService(IReverseRunControl2.class); if (runControl != null) { - ReverseTraceMethod traceMethod = fTraceMethod; - if (fTraceMethod == ReverseTraceMethod.HARDWARE_TRACE) { + ReverseTraceMethod traceMethod = fNextTraceMethod; + if (fNextTraceMethod == ReverseTraceMethod.HARDWARE_TRACE) { String defaultValue = Platform.getPreferencesService().getString(GdbPlugin.PLUGIN_ID, IGdbDebugPreferenceConstants.PREF_REVERSE_TRACE_METHOD_HARDWARE, IGdbDebugPreferenceConstants.PREF_REVERSE_TRACE_METHOD_GDB_TRACE, null); @@ -298,7 +303,7 @@ public class GdbReverseToggleCommand extends AbstractDebugCommand implements ICh @Override public void setTraceMethod(ReverseTraceMethod traceMethod) { - fTraceMethod = traceMethod; + fNextTraceMethod = traceMethod; } @Override @@ -334,12 +339,18 @@ public class GdbReverseToggleCommand extends AbstractDebugCommand implements ICh try { fExecutor.execute(ReverseMethodQuery); ReverseTraceMethod returnedTrace = ReverseMethodQuery.get(); + ReverseTraceMethod currTrace = ReverseTraceMethod.INVALID; if (returnedTrace == ReverseTraceMethod.INVALID) - return isReverseToggled(context) ? ReverseTraceMethod.FULL_TRACE : ReverseTraceMethod.STOP_TRACE ; + currTrace = isReverseToggled(context) ? ReverseTraceMethod.FULL_TRACE : ReverseTraceMethod.STOP_TRACE ; else - return (returnedTrace == ReverseTraceMethod.BRANCH_TRACE || + currTrace = (returnedTrace == ReverseTraceMethod.BRANCH_TRACE || returnedTrace == ReverseTraceMethod.PROCESSOR_TRACE || returnedTrace == ReverseTraceMethod.GDB_TRACE ) ? ReverseTraceMethod.HARDWARE_TRACE : returnedTrace; + if (currTrace != fTraceMethod) { + fLastTraceMethod = fTraceMethod; + fTraceMethod = currTrace; + } + return fTraceMethod; } catch (InterruptedException e) { } catch (ExecutionException e) { } catch (RejectedExecutionException e) { @@ -347,4 +358,9 @@ public class GdbReverseToggleCommand extends AbstractDebugCommand implements ICh return ReverseTraceMethod.STOP_TRACE; } + + @Override + public ReverseTraceMethod getLastTraceMethod(Object context) { + return fLastTraceMethod; + } }