tmf: Remove the ITmfEventTableColumns extension point
[deliverable/tracecompass.git] / org.eclipse.tracecompass.gdbtrace.core / src / org / eclipse / tracecompass / internal / gdbtrace / core / trace / GdbTrace.java
1 /*******************************************************************************
2 * Copyright (c) 2011, 2014 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 * Marc Dumais - Initial implementation
11 * Francois Chouinard - Initial API and implementation
12 * Patrick Tasse - Updated for TMF 2.0
13 * Matthew Khouzam - update validate
14 *******************************************************************************/
15
16 package org.eclipse.tracecompass.internal.gdbtrace.core.trace;
17
18 import java.io.BufferedInputStream;
19 import java.io.File;
20 import java.io.FileInputStream;
21 import java.io.IOException;
22 import java.util.Arrays;
23
24 import org.eclipse.cdt.dsf.gdb.IGDBLaunchConfigurationConstants;
25 import org.eclipse.cdt.dsf.gdb.IGdbDebugPreferenceConstants;
26 import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
27 import org.eclipse.core.resources.IProject;
28 import org.eclipse.core.resources.IResource;
29 import org.eclipse.core.runtime.CoreException;
30 import org.eclipse.core.runtime.IStatus;
31 import org.eclipse.core.runtime.Platform;
32 import org.eclipse.core.runtime.QualifiedName;
33 import org.eclipse.core.runtime.Status;
34 import org.eclipse.osgi.util.NLS;
35 import org.eclipse.tracecompass.internal.gdbtrace.core.Activator;
36 import org.eclipse.tracecompass.internal.gdbtrace.core.GdbTraceCorePlugin;
37 import org.eclipse.tracecompass.internal.gdbtrace.core.event.GdbTraceEvent;
38 import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
39 import org.eclipse.tracecompass.tmf.core.event.aspect.ITmfEventAspect;
40 import org.eclipse.tracecompass.tmf.core.exceptions.TmfTraceException;
41 import org.eclipse.tracecompass.tmf.core.timestamp.ITmfTimestamp;
42 import org.eclipse.tracecompass.tmf.core.trace.ITmfContext;
43 import org.eclipse.tracecompass.tmf.core.trace.ITmfEventParser;
44 import org.eclipse.tracecompass.tmf.core.trace.TmfContext;
45 import org.eclipse.tracecompass.tmf.core.trace.TmfTrace;
46 import org.eclipse.tracecompass.tmf.core.trace.TraceValidationStatus;
47 import org.eclipse.tracecompass.tmf.core.trace.location.ITmfLocation;
48 import org.eclipse.tracecompass.tmf.core.trace.location.TmfLongLocation;
49
50 /**
51 * GDB Tracepoint extension of TmfTrace. This class implements the necessary
52 * methods and functionalities so that a GDB tracepoint file can be used by the
53 * TMF framework as a "tracer".
54 * <p>
55 *
56 * @author Marc Dumais
57 * @author Francois Chouinard
58 * @author Matthew Khouzam
59 */
60 @SuppressWarnings("restriction")
61 public class GdbTrace extends TmfTrace implements ITmfEventParser {
62
63 // ------------------------------------------------------------------------
64 // Constants
65 // ------------------------------------------------------------------------
66
67 private static final int CACHE_SIZE = 20;
68
69 private static final byte[] HEADER = new byte[] {0x7f, 'T', 'R', 'A', 'C', 'E'};
70
71 /** The qualified name for the 'executable' persistent property */
72 public static final QualifiedName EXEC_KEY = new QualifiedName(GdbTraceCorePlugin.PLUGIN_ID, "executable"); //$NON-NLS-1$
73
74 // ------------------------------------------------------------------------
75 // Attributes
76 // ------------------------------------------------------------------------
77
78 // Interface to access GDB Tracepoints
79 private DsfGdbAdaptor fGdbTpRef;
80 private long fNbFrames = 0;
81
82 // The trace location
83 long fLocation;
84
85 // ------------------------------------------------------------------------
86 // Constructor
87 // ------------------------------------------------------------------------
88
89 /**
90 * Default constructor
91 */
92 public GdbTrace() {
93 setCacheSize(CACHE_SIZE);
94 }
95
96 @Override
97 public IStatus validate(IProject project, String path) {
98 File file = new File(path);
99 if (!file.exists()) {
100 return new Status(IStatus.ERROR, Activator.PLUGIN_ID,
101 NLS.bind(Messages.GdbTrace_FileNotFound, path));
102 }
103 if (!file.isFile()) {
104 return new Status(IStatus.ERROR, Activator.PLUGIN_ID,
105 NLS.bind(Messages.GdbTrace_GdbTracesMustBeAFile, path));
106 }
107 try (BufferedInputStream stream = new BufferedInputStream(new FileInputStream(file))) {
108 byte[] buffer = new byte[HEADER.length];
109 int read = stream.read(buffer);
110 if (read != HEADER.length || !Arrays.equals(buffer, HEADER)) {
111 return new Status(IStatus.ERROR, Activator.PLUGIN_ID,
112 NLS.bind(Messages.GdbTrace_NotGdbTraceFile, path));
113 }
114 } catch (IOException e) {
115 return new Status(IStatus.ERROR, Activator.PLUGIN_ID,
116 NLS.bind(Messages.GdbTrace_IOException, path), e);
117 }
118 return new TraceValidationStatus(100, GdbTraceCorePlugin.PLUGIN_ID);
119 }
120
121 @Override
122 public void initTrace(IResource resource, String path, Class<? extends ITmfEvent> type) throws TmfTraceException {
123 try {
124 String tracedExecutable = resource.getPersistentProperty(EXEC_KEY);
125 if (tracedExecutable == null) {
126 throw new TmfTraceException(Messages.GdbTrace_ExecutableNotSet);
127 }
128
129 String defaultGdbCommand = Platform.getPreferencesService().getString(GdbPlugin.PLUGIN_ID,
130 IGdbDebugPreferenceConstants.PREF_DEFAULT_GDB_COMMAND,
131 IGDBLaunchConfigurationConstants.DEBUGGER_DEBUG_NAME_DEFAULT, null);
132
133 fGdbTpRef = new DsfGdbAdaptor(this, defaultGdbCommand, path, tracedExecutable);
134 fNbFrames = getNbFrames();
135 } catch (CoreException e) {
136 throw new TmfTraceException(Messages.GdbTrace_FailedToInitializeTrace, e);
137 }
138
139 super.initTrace(resource, path, type);
140 }
141
142 @Override
143 public synchronized void dispose() {
144 if (fGdbTpRef != null) {
145 fGdbTpRef.dispose();
146 }
147 super.dispose();
148 }
149
150 /**
151 * @return GDB-DSF session id
152 */
153 public String getDsfSessionId() {
154 return fGdbTpRef.getSessionId();
155 }
156
157 /**
158 * @return the number of frames in current tp session
159 */
160 public synchronized long getNbFrames() {
161 fNbFrames = fGdbTpRef.getNumberOfFrames();
162 return fNbFrames;
163 }
164
165 // ------------------------------------------------------------------------
166 // TmfTrace
167 // ------------------------------------------------------------------------
168
169 @Override
170 public Iterable<ITmfEventAspect> getEventAspects() {
171 return GdbEventAspects.getAspects();
172 }
173
174 @Override
175 public synchronized TmfContext seekEvent(ITmfLocation location) {
176 fLocation = (location != null) ? ((Long) location.getLocationInfo()) : 0;
177 return new TmfContext(new TmfLongLocation(fLocation), fLocation);
178 }
179
180 @Override
181 public synchronized ITmfContext seekEvent(double ratio) {
182 TmfContext context = seekEvent((long) ratio * getNbEvents());
183 return context;
184 }
185
186 @Override
187 public double getLocationRatio(ITmfLocation location) {
188 if (getNbEvents() > 0 && location instanceof TmfLongLocation) {
189 return (double) ((TmfLongLocation) location).getLocationInfo() / getNbEvents();
190 }
191 return 0;
192 }
193
194 @Override
195 public ITmfLocation getCurrentLocation() {
196 return new TmfLongLocation(fLocation);
197 }
198
199 @Override
200 public GdbTraceEvent parseEvent(ITmfContext context) {
201 if (context.getRank() >= fNbFrames) {
202 return null;
203 }
204 // work-around to ensure that the select and parse of trace frame will
205 // be atomic
206 GdbTraceEvent event = fGdbTpRef.selectAndReadFrame(context.getRank());
207 fLocation++;
208 return event;
209 }
210
211 @Override
212 public synchronized TmfContext seekEvent(ITmfTimestamp timestamp) {
213 long rank = timestamp.getValue();
214 return seekEvent(rank);
215 }
216
217 @Override
218 public synchronized TmfContext seekEvent(long rank) {
219 fLocation = rank;
220 TmfContext context = new TmfContext(new TmfLongLocation(fLocation), rank);
221 return context;
222 }
223
224 /**
225 * Select a frame and update the visualization
226 *
227 * @param rank
228 * the rank
229 */
230 public synchronized void selectFrame(long rank) {
231 fGdbTpRef.selectDataFrame(rank, true);
232 }
233 }
This page took 0.036058 seconds and 5 git commands to generate.