From 5af284cece004a79d644b720ee44dae1a6b4dbfb Mon Sep 17 00:00:00 2001 From: Marc Khouzam Date: Wed, 18 May 2011 18:09:23 +0000 Subject: [PATCH] Bug 335235 - Deadlock when pressing trace var button in Trace Control view when GDB is running --- .../ui/tracepoints/TraceControlView.java | 35 ++++++++----------- .../ui/tracepoints/TraceVarDetailsDialog.java | 11 ++++++ .../ui/tracepoints/TracepointsMessages.java | 1 + .../TracepointsMessages.properties | 1 + 4 files changed, 28 insertions(+), 20 deletions(-) diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepoints/TraceControlView.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepoints/TraceControlView.java index c2ba6b9ee7a..95f758b1820 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepoints/TraceControlView.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepoints/TraceControlView.java @@ -14,10 +14,13 @@ import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.concurrent.ExecutionException; import java.util.concurrent.RejectedExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor; import org.eclipse.cdt.dsf.concurrent.DsfRunnable; import org.eclipse.cdt.dsf.concurrent.IDsfStatusConstants; +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; @@ -282,25 +285,16 @@ public class TraceControlView extends ViewPart implements IViewPart, SessionEnde return; } - Query query = new Query() { - @Override - protected void execute(DataRequestMonitor rm) { - final IGDBTraceControl traceControl = getService(IGDBTraceControl.class); - if (traceControl != null) { - ITraceRecordDMContext emptyDmc = traceControl.createTraceRecordContext(ctx, "-1"); //$NON-NLS-1$ - traceControl.selectTraceRecord(emptyDmc, rm); - } else { - rm.setData(null); - rm.done(); - } - } - }; - try { - getSession().getExecutor().execute(query); - query.get(); - } catch (InterruptedException exc) { - } catch (ExecutionException exc) { - } + getSession().getExecutor().execute( + new DsfRunnable() { + public void run() { + final IGDBTraceControl traceControl = getService(IGDBTraceControl.class); + if (traceControl != null) { + ITraceRecordDMContext emptyDmc = traceControl.createTraceRecordContext(ctx, "-1"); //$NON-NLS-1$ + traceControl.selectTraceRecord(emptyDmc, new RequestMonitor(ImmediateExecutor.getInstance(), null)); + } + } + }); } protected void updateDebugContext() { @@ -513,9 +507,10 @@ public class TraceControlView extends ViewPart implements IViewPart, SessionEnde }; try { getSession().getExecutor().execute(query); - return query.get(); + return query.get(1, TimeUnit.SECONDS); } catch (InterruptedException exc) { } catch (ExecutionException exc) { + } catch (TimeoutException e) { } return null; diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepoints/TraceVarDetailsDialog.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepoints/TraceVarDetailsDialog.java index 0e2ddc00679..8df6738368a 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepoints/TraceVarDetailsDialog.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepoints/TraceVarDetailsDialog.java @@ -250,6 +250,17 @@ public final class TraceVarDetailsDialog extends Dialog { protected void handleRefresh() { ITraceVariableDMData[] vars = fView.getTraceVarList(); + if (vars == null) { + setWarningVisible(TracepointsMessages.TraceControlView_refresh_variable_error); + createButton.setEnabled(false); + return; + } + + // Remove the warning and re-enable the create button, since we now + // have a list of trace variables. + setWarningVisible(false); + createButton.setEnabled(true); + table.removeAll(); for (ITraceVariableDMData var : vars) { String currentVal = var.getValue(); diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepoints/TracepointsMessages.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepoints/TracepointsMessages.java index 18978de9726..8c8a677a83d 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepoints/TracepointsMessages.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepoints/TracepointsMessages.java @@ -37,6 +37,7 @@ public final class TracepointsMessages extends NLS { public static String TraceControlView_create_variable_error; public static String TraceControlView_create_variable_empty_name_error; public static String TraceControlView_action_exit_visualization_mode; + public static String TraceControlView_refresh_variable_error; static { NLS.initializeMessages(TracepointsMessages.class.getName(), TracepointsMessages.class); diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepoints/TracepointsMessages.properties b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepoints/TracepointsMessages.properties index 7e82ffebe6b..ec89dcf8205 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepoints/TracepointsMessages.properties +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepoints/TracepointsMessages.properties @@ -25,3 +25,4 @@ TraceControlView_trace_variable_details_value_label=Value: TraceControlView_create_variable_error=Error creating trace variable TraceControlView_create_variable_empty_name_error=Cannot create variable with empty name TraceControlView_action_exit_visualization_mode=Exit Visualization Mode +TraceControlView_refresh_variable_error=Unable to retrieve trace variables