From ec884917647eda18d85c88c75a5904ca81afd6a3 Mon Sep 17 00:00:00 2001 From: Marc Khouzam Date: Mon, 25 Apr 2011 13:54:42 +0000 Subject: [PATCH] Bug 336961: selectTraceRecord() should not update the UI because it can be used for background activities. --- .../GdbSelectNextTraceRecordCommand.java | 19 ++++++++++++++++--- .../GdbSelectPrevTraceRecordCommand.java | 19 ++++++++++++++++--- .../dsf/gdb/service/GDBTraceControl_7_2.java | 14 +++++++++----- 3 files changed, 41 insertions(+), 11 deletions(-) diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbSelectNextTraceRecordCommand.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbSelectNextTraceRecordCommand.java index 168aa3c437b..b2a8f7ef1da 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbSelectNextTraceRecordCommand.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbSelectNextTraceRecordCommand.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2010 Ericsson and others. + * Copyright (c) 2010, 2011 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 @@ -10,15 +10,19 @@ *******************************************************************************/ package org.eclipse.cdt.dsf.gdb.internal.ui.commands; +import java.util.Hashtable; import java.util.concurrent.ExecutionException; import java.util.concurrent.RejectedExecutionException; import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor; import org.eclipse.cdt.dsf.concurrent.DsfExecutor; +import org.eclipse.cdt.dsf.concurrent.ImmediateExecutor; import org.eclipse.cdt.dsf.concurrent.Query; +import org.eclipse.cdt.dsf.concurrent.RequestMonitor; import org.eclipse.cdt.dsf.datamodel.DMContexts; import org.eclipse.cdt.dsf.gdb.internal.commands.ISelectNextTraceRecordHandler; import org.eclipse.cdt.dsf.gdb.internal.ui.GdbUIPlugin; +import org.eclipse.cdt.dsf.gdb.service.GDBTraceControl_7_2.TraceRecordSelectedChangedEvent; import org.eclipse.cdt.dsf.gdb.service.IGDBTraceControl; import org.eclipse.cdt.dsf.gdb.service.IGDBTraceControl.ITraceRecordDMContext; import org.eclipse.cdt.dsf.gdb.service.IGDBTraceControl.ITraceStatusDMData; @@ -38,13 +42,16 @@ import org.eclipse.debug.core.commands.IEnabledStateRequest; * * @since 2.1 */ +@SuppressWarnings("restriction") public class GdbSelectNextTraceRecordCommand extends AbstractDebugCommand implements ISelectNextTraceRecordHandler { private final DsfExecutor fExecutor; private final DsfServicesTracker fTracker; + private final DsfSession fSession; public GdbSelectNextTraceRecordCommand(DsfSession session) { fExecutor = session.getExecutor(); fTracker = new DsfServicesTracker(GdbUIPlugin.getBundleContext(), session.getId()); + fSession = session; } public void dispose() { @@ -73,8 +80,14 @@ public class GdbSelectNextTraceRecordCommand extends AbstractDebugCommand implem new DataRequestMonitor(fExecutor, rm) { @Override protected void handleSuccess() { - ITraceRecordDMContext nextDmc = traceControl.createNextRecordContext(getData()); - traceControl.selectTraceRecord(nextDmc, rm); + final ITraceRecordDMContext nextDmc = traceControl.createNextRecordContext(getData()); + traceControl.selectTraceRecord(nextDmc, new RequestMonitor(ImmediateExecutor.getInstance(), rm) { + @Override + protected void handleSuccess() { + fSession.dispatchEvent(new TraceRecordSelectedChangedEvent(nextDmc), new Hashtable()); + rm.done(); + } + }); }; }); } else { diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbSelectPrevTraceRecordCommand.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbSelectPrevTraceRecordCommand.java index e5c5df5fc37..ca98c4fac31 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbSelectPrevTraceRecordCommand.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbSelectPrevTraceRecordCommand.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2010 Ericsson and others. + * Copyright (c) 2010, 2011 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 @@ -10,16 +10,20 @@ *******************************************************************************/ package org.eclipse.cdt.dsf.gdb.internal.ui.commands; +import java.util.Hashtable; import java.util.concurrent.ExecutionException; import java.util.concurrent.RejectedExecutionException; import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor; import org.eclipse.cdt.dsf.concurrent.DsfExecutor; +import org.eclipse.cdt.dsf.concurrent.ImmediateExecutor; import org.eclipse.cdt.dsf.concurrent.Query; +import org.eclipse.cdt.dsf.concurrent.RequestMonitor; import org.eclipse.cdt.dsf.datamodel.DMContexts; import org.eclipse.cdt.dsf.gdb.internal.commands.ISelectPrevTraceRecordHandler; import org.eclipse.cdt.dsf.gdb.internal.ui.GdbUIPlugin; import org.eclipse.cdt.dsf.gdb.service.IGDBTraceControl; +import org.eclipse.cdt.dsf.gdb.service.GDBTraceControl_7_2.TraceRecordSelectedChangedEvent; import org.eclipse.cdt.dsf.gdb.service.IGDBTraceControl.ITraceRecordDMContext; import org.eclipse.cdt.dsf.gdb.service.IGDBTraceControl.ITraceStatusDMData; import org.eclipse.cdt.dsf.gdb.service.IGDBTraceControl.ITraceTargetDMContext; @@ -38,13 +42,16 @@ import org.eclipse.debug.core.commands.IEnabledStateRequest; * * @since 2.1 */ +@SuppressWarnings("restriction") public class GdbSelectPrevTraceRecordCommand extends AbstractDebugCommand implements ISelectPrevTraceRecordHandler { private final DsfExecutor fExecutor; private final DsfServicesTracker fTracker; + private final DsfSession fSession; public GdbSelectPrevTraceRecordCommand(DsfSession session) { fExecutor = session.getExecutor(); fTracker = new DsfServicesTracker(GdbUIPlugin.getBundleContext(), session.getId()); + fSession = session; } public void dispose() { @@ -73,8 +80,14 @@ public class GdbSelectPrevTraceRecordCommand extends AbstractDebugCommand implem new DataRequestMonitor(fExecutor, rm) { @Override protected void handleSuccess() { - ITraceRecordDMContext prevDmc = traceControl.createPrevRecordContext(getData()); - traceControl.selectTraceRecord(prevDmc, rm); + final ITraceRecordDMContext prevDmc = traceControl.createPrevRecordContext(getData()); + traceControl.selectTraceRecord(prevDmc, new RequestMonitor(ImmediateExecutor.getInstance(), rm) { + @Override + protected void handleSuccess() { + fSession.dispatchEvent(new TraceRecordSelectedChangedEvent(prevDmc), new Hashtable()); + rm.done(); + } + }); }; }); } else { diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBTraceControl_7_2.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBTraceControl_7_2.java index e6f8265e0b7..13f51dd5684 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBTraceControl_7_2.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBTraceControl_7_2.java @@ -684,8 +684,15 @@ public class GDBTraceControl_7_2 extends AbstractDsfService implements IGDBTrace // Workaround for GDB pre-release where we don't get the details // of the frame when we load a trace file. // To get around this, we can force a select of record 0 - ITraceRecordDMContext initialRecord = createTraceRecordContext(context, "0"); //$NON-NLS-1$ - selectTraceRecord(initialRecord, rm); + final ITraceRecordDMContext initialRecord = createTraceRecordContext(context, "0"); //$NON-NLS-1$ + selectTraceRecord(initialRecord, new RequestMonitor(ImmediateExecutor.getInstance(), rm) { + @Override + protected void handleSuccess() { + // This event will indicate to the other services that we are visualizing trace data. + getSession().dispatchEvent(new TraceRecordSelectedChangedEvent(initialRecord), getProperties()); + rm.done(); + } + }); } }); } @@ -911,9 +918,6 @@ public class GDBTraceControl_7_2 extends AbstractDsfService implements IGDBTrace fCurrentRecordDmc = context; fTracepointIndexForTraceRecord = getData().getTraceRecord().getTracepointId(); - // This event will indicate to the other services that we are visualizing trace data. - getSession().dispatchEvent(new TraceRecordSelectedChangedEvent(context), getProperties()); - // We could rely on the TraceRecordSelectedChangedEvent to update all the views, but this // would require a lot of changes. // Notice that looking at a new trace record should behave in the same manner