gdbtrace: Prevent hang when a lot of commands are sent to GDB
[deliverable/tracecompass.git] / org.eclipse.linuxtools.gdbtrace.ui / src / org / eclipse / linuxtools / internal / gdbtrace / ui / views / events / GdbEventsTable.java
1 /*******************************************************************************
2 * Copyright (c) 2013 Ericsson
3 *
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
8 *
9 * Contributors:
10 * Patrick Tasse - Initial API and implementation
11 *******************************************************************************/
12
13 package org.eclipse.linuxtools.internal.gdbtrace.ui.views.events;
14
15 import org.eclipse.core.runtime.IProgressMonitor;
16 import org.eclipse.core.runtime.IStatus;
17 import org.eclipse.core.runtime.Status;
18 import org.eclipse.core.runtime.jobs.Job;
19 import org.eclipse.jface.viewers.ISelectionChangedListener;
20 import org.eclipse.jface.viewers.SelectionChangedEvent;
21 import org.eclipse.linuxtools.internal.gdbtrace.core.event.GdbTraceEvent;
22 import org.eclipse.linuxtools.internal.gdbtrace.core.event.GdbTraceEventContent;
23 import org.eclipse.linuxtools.internal.gdbtrace.core.trace.GdbTrace;
24 import org.eclipse.linuxtools.tmf.core.event.ITmfEvent;
25 import org.eclipse.linuxtools.tmf.core.event.ITmfEventField;
26 import org.eclipse.linuxtools.tmf.core.event.TmfEventField;
27 import org.eclipse.linuxtools.tmf.core.signal.TmfSignalHandler;
28 import org.eclipse.linuxtools.tmf.core.signal.TmfTimeSynchSignal;
29 import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;
30 import org.eclipse.linuxtools.tmf.core.trace.TmfExperiment;
31 import org.eclipse.linuxtools.tmf.ui.viewers.events.TmfEventsTable;
32 import org.eclipse.linuxtools.tmf.ui.widgets.virtualtable.ColumnData;
33 import org.eclipse.swt.SWT;
34 import org.eclipse.swt.widgets.Composite;
35 import org.eclipse.swt.widgets.TableItem;
36
37 /**
38 * GDB Events Table
39 * @author Patrick Tasse
40 *
41 */
42 public class GdbEventsTable extends TmfEventsTable {
43
44 private static final String TRACE_FRAME_COLUMN = GdbTraceEventContent.TRACE_FRAME;
45 private static final String TRACEPOINT_COLUMN = GdbTraceEventContent.TRACEPOINT;
46 private static final String FILE_COLUMN = "File"; //$NON-NLS-1$
47 private static final String CONTENT_COLUMN = "Content"; //$NON-NLS-1$
48 private static final ColumnData[] COLUMN_DATA = new ColumnData[] {
49 new ColumnData(TRACE_FRAME_COLUMN, 100, SWT.RIGHT),
50 new ColumnData(TRACEPOINT_COLUMN, 100, SWT.RIGHT),
51 new ColumnData(FILE_COLUMN, 100, SWT.LEFT),
52 new ColumnData(CONTENT_COLUMN, 100, SWT.LEFT)
53 };
54
55 private GdbTrace fSelectedTrace = null;
56 private long fSelectedFrame = 0;
57
58 /**
59 * Constructor
60 * @param parent the parent
61 * @param cacheSize the cache size
62 */
63 public GdbEventsTable(Composite parent, int cacheSize) {
64 super(parent, cacheSize, COLUMN_DATA);
65 // Set search field ids for event filter
66 fTable.getColumns()[2].setData(Key.FIELD_ID, ITmfEvent.EVENT_FIELD_REFERENCE);
67 fTable.getColumns()[3].setData(Key.FIELD_ID, ITmfEvent.EVENT_FIELD_CONTENT);
68
69 // Synchronize currently selected frame in GDB with table selection
70 addSelectionChangedListener(new ISelectionChangedListener() {
71 @Override
72 public void selectionChanged(SelectionChangedEvent e) {
73 TableItem[] selection = fTable.getSelection();
74 if (selection.length > 0) {
75 TableItem selectedTableItem = selection[0];
76 if (selectedTableItem != null) {
77 Object data = selectedTableItem.getData();
78 if (data instanceof GdbTraceEvent) {
79 GdbTraceEvent event = (GdbTraceEvent) data;
80 GdbTrace gdbTrace = (GdbTrace) event.getTrace();
81 GdbTraceEventContent content = (GdbTraceEventContent) event.getContent();
82 selectFrame(gdbTrace, content.getFrameNumber());
83 return;
84 }
85 }
86 }
87 fSelectedTrace = null;
88 }
89 });
90 }
91
92 @Override
93 public void setTrace(ITmfTrace trace, boolean disposeOnClose) {
94 super.setTrace(trace, disposeOnClose);
95 if (trace instanceof GdbTrace) {
96 fSelectedTrace = (GdbTrace) trace;
97 fSelectedFrame = 0;
98 } else if (trace instanceof TmfExperiment) {
99 TmfExperiment experiment = (TmfExperiment) trace;
100 if (experiment.getTraces().length > 0) {
101 fSelectedTrace = (GdbTrace) experiment.getTraces()[0];
102 fSelectedFrame = 0;
103 }
104 }
105 }
106
107 @Override
108 protected void populateCompleted() {
109 if (fSelectedTrace != null) {
110 selectFrame(fSelectedTrace, fSelectedFrame);
111 }
112 }
113
114 @Override
115 protected ITmfEventField[] extractItemFields(ITmfEvent event) {
116 ITmfEventField[] fields = EMPTY_FIELD_ARRAY;
117 if (event != null) {
118 GdbTraceEventContent content = (GdbTraceEventContent) event.getContent();
119 fields = new TmfEventField[] {
120 new TmfEventField(TRACE_FRAME_COLUMN, content.getFrameNumber(), null),
121 new TmfEventField(TRACEPOINT_COLUMN, content.getTracepointNumber(), null),
122 new TmfEventField(FILE_COLUMN, event.getReference(), null),
123 new TmfEventField(CONTENT_COLUMN, content.toString(), null)
124 };
125 }
126 return fields;
127 }
128
129 @Override
130 @TmfSignalHandler
131 public void currentTimeUpdated(final TmfTimeSynchSignal signal) {
132 // do not synchronize on time
133 }
134
135 private void selectFrame(final GdbTrace gdbTrace, final long frameNumber) {
136 Job b = new Job("GDB Trace select frame") { //$NON-NLS-1$
137 @Override
138 protected IStatus run(IProgressMonitor monitor) {
139 // This sends commands to GDB and can potentially wait on the UI
140 // thread (gdb traces console buffer full) so it needs to be
141 // exectued on a non-UI thread
142 gdbTrace.selectFrame(frameNumber);
143 fSelectedTrace = gdbTrace;
144 fSelectedFrame = frameNumber;
145 return Status.OK_STATUS;
146 }
147 };
148 b.setSystem(true);
149 b.schedule();
150 }
151 }
This page took 0.037146 seconds and 6 git commands to generate.