// Native access functions
protected native long ltt_getTracefilePtr(long eventPtr);
- @SuppressWarnings("unused")
protected native long ltt_getBlock(long eventPtr);
- @SuppressWarnings("unused")
protected native long ltt_getOffset(long eventPtr);
- @SuppressWarnings("unused")
protected native long ltt_getCurrentTimestampCounter(long eventPtr);
- @SuppressWarnings("unused")
protected native long ltt_getTimestamp(long eventPtr);
protected native int ltt_getEventMarkerId(long eventPtr);
protected native long ltt_getNanosencondsTime(long eventPtr);
- @SuppressWarnings("unused")
protected native void ltt_feedEventTime(long eventPtr, JniTime eventTime);
protected native long ltt_getEventDataSize(long eventPtr);
- @SuppressWarnings("unused")
protected native long ltt_getEventSize(long eventPtr);
- @SuppressWarnings("unused")
protected native int ltt_getCount(long eventPtr);
- @SuppressWarnings("unused")
protected native long ltt_getOverflowNanoSeconds(long eventPtr);
// This method an event pointer
/**
* Default constructor is forbidden
*/
- @SuppressWarnings("unused")
protected JniEvent() {
- };
+ }
/**
* Copy constructor.<p>
// Native access method
protected native String ltt_getName(long markerPtr);
protected native String ltt_getFormatOverview(long markerPtr);
- @SuppressWarnings("unused")
protected native long ltt_getSize(long markerPtr);
- @SuppressWarnings("unused")
protected native short ltt_getLargestAlign(long markerPtr);
- @SuppressWarnings("unused")
protected native short ltt_getIntSize(long markerPtr);
- @SuppressWarnings("unused")
protected native short ltt_getLongSize(long markerPtr);
- @SuppressWarnings("unused")
protected native short ltt_getPointerSize(long markerPtr);
- @SuppressWarnings("unused")
protected native short ltt_getSize_tSize(long markerPtr);
protected native void ltt_getAllMarkerFields(long tracePtr);
- @SuppressWarnings("unused")
protected native short ltt_getAlignement(long markerPtr);
- @SuppressWarnings("unused")
protected native long ltt_getNextMarkerPtr(long markerPtr);
// Debug native function, ask LTT to print marker structure
/*
* Default constructor is forbidden
*/
- @SuppressWarnings("unused")
protected JniMarker() {
}
// Native access method
protected native String ltt_getField(long markerFieldPtr);
- @SuppressWarnings("unused")
protected native int ltt_getType(long markerFieldPtr);
- @SuppressWarnings("unused")
protected native long ltt_getOffset(long markerFieldPtr);
- @SuppressWarnings("unused")
protected native long ltt_getSize(long markerFieldPtr);
- @SuppressWarnings("unused")
protected native long ltt_getAlignment(long markerFieldPtr);
- @SuppressWarnings("unused")
protected native long ltt_getAttributes(long markerFieldPtr);
- @SuppressWarnings("unused")
protected native int ltt_getStatic_offset(long markerFieldPtr);
protected native String ltt_getFormat(long markerFieldPtr);
/*
* Default constructor is forbidden
*/
- @SuppressWarnings("unused")
protected JniMarkerField() {
}
/*
* Default constructor is forbidden
*/
- @SuppressWarnings("unused")
protected JniTracefile() {
}
bin.includes = META-INF/,\
.,\
plugin.properties,\
- test2.xml,\
traceset/,\
test.xml
import java.util.HashMap;
import junit.framework.TestCase;
+
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.Path;
-import org.eclipse.linuxtools.lttng.event.*;
+import org.eclipse.linuxtools.lttng.event.LttngEvent;
+import org.eclipse.linuxtools.lttng.event.LttngEventContent;
+import org.eclipse.linuxtools.lttng.event.LttngEventField;
+import org.eclipse.linuxtools.lttng.event.LttngEventType;
+import org.eclipse.linuxtools.lttng.event.LttngTimestamp;
import org.eclipse.linuxtools.lttng.tests.LTTngCoreTestPlugin;
import org.eclipse.linuxtools.lttng.trace.LTTngTextTrace;
import org.eclipse.linuxtools.tmf.trace.TmfTraceContext;
public class LttngEventContentTest extends TestCase {
private final static String tracepath1="traceset/trace-15316events_nolost_newformat.txt";
- private final static boolean skipIndexing=true;
+// private final static boolean skipIndexing=true;
private final static String firstEventContentFirstField = "alignment:0";
private final static String firstEventContentFirstFieldName = "alignment";
try {
testStream = null;
LTTngTextTrace tmpStream = initializeEventStream();
- tmpEventContent = (LttngEventContent)tmpStream.getNextEvent( new TmfTraceContext(0L, new LttngTimestamp(0L), 0) ).getContent();
+ tmpEventContent = (LttngEventContent)tmpStream.getNextEvent( new TmfTraceContext(0L, 0) ).getContent();
}
catch (Exception e) {
fail("ERROR : Failed to get content!");
// Require an event
tmpStream = initializeEventStream();
- tmpContext = new TmfTraceContext(0L, new LttngTimestamp(0L), 0);
+ tmpContext = new TmfTraceContext(0L, 0);
tmpEvent = (LttngEvent)tmpStream.getNextEvent(tmpContext);
testContent = prepareToTest();
// getFieldS()
//*** To test getFields with a fields number >0, we need to move to an event that have some more
tmpStream = initializeEventStream();
- tmpContext = new TmfTraceContext(0L, new LttngTimestamp(0L), 0);
+ tmpContext = new TmfTraceContext(0L, 0);
// Skip first events and seek to event pass metadata
tmpContext= tmpStream.seekEvent(new LttngTimestamp(timestampAfterMetadata) );
// Skip first one
// Require an event
tmpStream = initializeEventStream();
- tmpContext = new TmfTraceContext(0L, new LttngTimestamp(0L), 0);
+ tmpContext = new TmfTraceContext(0L, 0);
tmpEvent = (LttngEvent)tmpStream.getNextEvent(tmpContext);
LttngEventContent tmpContent = prepareToTest();
// Require an event
tmpStream = initializeEventStream();
- tmpContext = new TmfTraceContext(0L, new LttngTimestamp(0L), 0);
+ tmpContext = new TmfTraceContext(0L, 0);
tmpEvent = (LttngEvent)tmpStream.getNextEvent(tmpContext);
// Get the content
testContent = tmpEvent.getContent();
import org.eclipse.core.runtime.Path;
import org.eclipse.linuxtools.lttng.event.LttngEventContent;
import org.eclipse.linuxtools.lttng.event.LttngEventField;
-import org.eclipse.linuxtools.lttng.event.LttngTimestamp;
import org.eclipse.linuxtools.lttng.tests.LTTngCoreTestPlugin;
import org.eclipse.linuxtools.lttng.trace.LTTngTextTrace;
import org.eclipse.linuxtools.tmf.trace.TmfTraceContext;
private final static String tracepath1="traceset/trace-15316events_nolost_newformat.txt";
private final static boolean skipIndexing=true;
- private final static String firstEventName = "alignment";
+// private final static String firstEventName = "alignment";
private final static String firstEventValue = "0";
private static LTTngTextTrace testStream = null;
// This trace should be valid
try {
LTTngTextTrace tmpStream = initializeEventStream();
- tmpField = (LttngEventField)tmpStream.getNextEvent( new TmfTraceContext(0, new LttngTimestamp(0L), 0) ).getContent().getField(0);
+ tmpField = (LttngEventField)tmpStream.getNextEvent( new TmfTraceContext(0L, 0) ).getContent().getField(0);
}
catch (Exception e) {
fail("ERROR : Failed to get field!");
// *** To "really" test the field, we will get a real field from LTTngTrace
LTTngTextTrace tmpStream = initializeEventStream();
- LttngEventField testField = (LttngEventField)tmpStream.getNextEvent( new TmfTraceContext(0, new LttngTimestamp(0L), 0) ).getContent().getField(0);
+ LttngEventField testField = (LttngEventField)tmpStream.getNextEvent( new TmfTraceContext(0L, 0) ).getContent().getField(0);
assertNotSame("getField is null!",null,testField);
// *** FIXME ***
// This trace should be valid
try {
LTTngTextTrace tmpStream = initializeEventStream();
- tmpEventRef = (LttngEventReference)tmpStream.getNextEvent(new TmfTraceContext(null, null, 0) ).getReference();
+ tmpEventRef = (LttngEventReference)tmpStream.getNextEvent(new TmfTraceContext(null, 0) ).getReference();
}
catch (Exception e) {
fail("ERROR : Failed to get reference!");
private final static String eventChannel = "metadata";
private final static long eventCpu = 0;
private final static String eventMarker = "core_marker_id";
- private final static String eventContent = "alignment:0 size_t:4 int:4 name:vm_map pointer:4 event_id:0 long:4 channel:vm_state ";
+// private final static String eventContent = "alignment:0 size_t:4 int:4 name:vm_map pointer:4 event_id:0 long:4 channel:vm_state ";
private final static String eventReference = eventChannel + "_" + eventCpu;
try {
LTTngTextTrace tmpStream = initializeEventStream();
- tmpEvent = (LttngEvent)tmpStream.getNextEvent(new TmfTraceContext(0, new LttngTimestamp(0L), 0) );
+ tmpEvent = (LttngEvent)tmpStream.getNextEvent(new TmfTraceContext(0L, 0) );
}
catch (Exception e) {
System.out.println("ERROR : Could not open " + tracepath1);
// This trace should be valid
try {
LTTngTextTrace tmpStream = initializeEventStream();
- tmpEventType = (LttngEventType)tmpStream.getNextEvent( new TmfTraceContext(null, null, 0) ).getType();
+ tmpEventType = (LttngEventType)tmpStream.getNextEvent( new TmfTraceContext(null, 0) ).getType();
}
catch (Exception e) {
fail("ERROR : Failed to get reference!");
// This trace should be valid
try {
LTTngTextTrace tmpStream = initializeEventStream();
- tmpTime = (LttngTimestamp)tmpStream.getNextEvent( new TmfTraceContext(null, null, 0) ).getTimestamp();
+ tmpTime = (LttngTimestamp)tmpStream.getNextEvent( new TmfTraceContext(null, 0) ).getTimestamp();
}
catch (Exception e) {
fail("ERROR : Failed to get reference!");
import junit.framework.TestCase;
import org.eclipse.linuxtools.lttng.TraceDebug;
+import org.eclipse.linuxtools.lttng.event.LttngEvent;
import org.eclipse.linuxtools.lttng.state.StateManager;
import org.eclipse.linuxtools.lttng.trace.LTTngTrace;
-import org.eclipse.linuxtools.tmf.trace.TmfExperiment;
+import org.eclipse.linuxtools.tmf.experiment.TmfExperiment;
/**
* @author alvaro
if (testStream != null) {
LTTngTrace[] streamList = new LTTngTrace[1];
streamList[0] = testStream;
- TmfExperiment newExp = new TmfExperiment(logName, streamList);
+ TmfExperiment<LttngEvent> newExp = new TmfExperiment<LttngEvent>(LttngEvent.class, logName, streamList);
//Get the Test StateManager
StateManager manager = StateManagerFactoryTestSupport.getManager(newExp.getExperimentId());
TmfEvent tmpEvent = null;
LTTngTextTrace testStream1 = prepareStreamToTest();
- TmfTraceContext tmpContext = new TmfTraceContext(null, null, 0);
+ TmfTraceContext tmpContext = new TmfTraceContext(null, 0);
// We should be at the beginning of the trace, so we will just read the first event now
tmpEvent = testStream1.getNextEvent(tmpContext );
assertNotSame("tmpEvent is null after first getNextEvent()",null,tmpEvent );
TmfEvent tmpEvent = null;
LTTngTextTrace testStream1 = prepareStreamToTest();
- TmfTraceContext tmpContext = new TmfTraceContext(null, null, 0);
+ TmfTraceContext tmpContext = new TmfTraceContext(null, 0);
// We should be at the beginning of the trace, so we will just parse the first event now
tmpEvent = testStream1.parseEvent(tmpContext );
assertNotSame("tmpEvent is null after first parseEvent()",null,tmpEvent );
public void testSeekEventTimestamp() {
TmfEvent tmpEvent = null;
- TmfTraceContext tmpContext = new TmfTraceContext(null, null, 0);
+ TmfTraceContext tmpContext = new TmfTraceContext(null, 0);
LTTngTextTrace testStream1 = prepareStreamToTest();
// We should be at the beginning of the trace, we will seek at a certain timestamp
- tmpContext = testStream1.seekEvent(new TmfTimestamp(timestampToSeekTest1));
+ tmpContext = testStream1.seekEvent(new TmfTimestamp(timestampToSeekTest1, (byte) -9, 0));
tmpEvent = testStream1.getNextEvent(tmpContext);
assertNotSame("tmpContext is null after first seekEvent()",null,tmpContext );
- assertEquals("tmpContext has wrong timestamp after first seekEvent()",contextValueAfterSeekTest1,(long)((TmfTimestamp)tmpContext.getTimestamp()).getValue() );
+ assertEquals("tmpContext has wrong timestamp after first seekEvent()",contextValueAfterSeekTest1,(long)((TmfTimestamp)tmpEvent.getTimestamp()).getValue() );
assertNotSame("tmpEvent is null after first seekEvent()",null,tmpEvent );
assertTrue("tmpEvent has wrong reference after first seekEvent()", ((String)tmpEvent.getReference().getReference()).contains(seek1EventReference) );
// Seek to the last timestamp
- tmpContext = testStream1.seekEvent(new TmfTimestamp(timestampToSeekLast));
+ tmpContext = testStream1.seekEvent(new TmfTimestamp(timestampToSeekLast, (byte) -9, 0));
tmpEvent = testStream1.getNextEvent(tmpContext);
assertNotSame("tmpContext is null after seekEvent() to last",null,tmpContext );
- assertEquals("tmpContext has wrong timestamp after seekEvent() to last",contextValueAfterSeekLast,(long)((TmfTimestamp)tmpContext.getTimestamp()).getValue() );
+ assertEquals("tmpContext has wrong timestamp after seekEvent() to last",contextValueAfterSeekLast,(long)((TmfTimestamp)tmpEvent.getTimestamp()).getValue() );
assertNotSame("tmpEvent is null after seekEvent() to last ",null,tmpEvent );
assertTrue("tmpEvent has wrong reference after seekEvent() to last",((String)tmpEvent.getReference().getReference()).contains(seekLastEventReference) );
// Seek to the first timestamp (startTime)
- tmpContext = testStream1.seekEvent(new TmfTimestamp(firstEventTimestamp));
+ tmpContext = testStream1.seekEvent(new TmfTimestamp(firstEventTimestamp, (byte) -9, 0));
tmpEvent = testStream1.getNextEvent(tmpContext);
assertNotSame("tmpEvent is null after seekEvent() to start ",null,tmpEvent );
assertTrue("tmpEvent has wrong reference after seekEvent() to start",((String)tmpEvent.getReference().getReference()).contains(firstEventReference) );
assertNotSame("tmpContext is null after seekEvent() to first",null,tmpContext );
- assertEquals("tmpContext has wrong timestamp after seekEvent() to first",contextValueAfterFirstEvent,(long)((TmfTimestamp)tmpContext.getTimestamp()).getValue() );
+ assertEquals("tmpContext has wrong timestamp after seekEvent() to first",contextValueAfterFirstEvent,(long)((TmfTimestamp)tmpEvent.getTimestamp()).getValue() );
}
public void testSeekEventIndex() {
TmfEvent tmpEvent = null;
- TmfTraceContext tmpContext = new TmfTraceContext(null, null, 0);
+ TmfTraceContext tmpContext = new TmfTraceContext(null, 0);
LTTngTextTrace testStream1 = prepareStreamToTest();
// We should be at the beginning of the trace, we will seek at a certain timestamp
tmpContext = testStream1.seekEvent(indexToSeekTest1);
tmpEvent = testStream1.getNextEvent(tmpContext);
assertNotSame("tmpContext is null after first seekEvent()",null,tmpContext );
- assertEquals("tmpContext has wrong timestamp after first seekEvent()",contextValueAfterSeekTest1,(long)((TmfTimestamp)tmpContext.getTimestamp()).getValue() );
+ assertEquals("tmpContext has wrong timestamp after first seekEvent()",contextValueAfterSeekTest1,(long)((TmfTimestamp)tmpEvent.getTimestamp()).getValue() );
assertNotSame("tmpEvent is null after first seekEvent()",null,tmpEvent );
assertTrue("tmpEvent has wrong reference after first seekEvent()", ((String)tmpEvent.getReference().getReference()).contains(seek1EventReference) );
tmpContext = testStream1.seekEvent(indexToSeekLast);
tmpEvent = testStream1.getNextEvent(tmpContext);
assertNotSame("tmpContext is null after first seekEvent()",null,tmpContext );
- assertEquals("tmpContext has wrong timestamp after first seekEvent()",contextValueAfterSeekLast,(long)((TmfTimestamp)tmpContext.getTimestamp()).getValue() );
+ assertEquals("tmpContext has wrong timestamp after first seekEvent()",contextValueAfterSeekLast,(long)((TmfTimestamp)tmpEvent.getTimestamp()).getValue() );
assertNotSame("tmpEvent is null after seekEvent() to last ",null,tmpEvent );
assertTrue("tmpEvent has wrong reference after seekEvent() to last",((String)tmpEvent.getReference().getReference()).contains(seekLastEventReference) );
tmpContext = testStream1.seekEvent(indexToSeekFirst);
tmpEvent = testStream1.getNextEvent(tmpContext);
assertNotSame("tmpContext is null after first seekEvent()",null,tmpContext );
- assertEquals("tmpContext has wrong timestamp after first seekEvent()",contextValueAfterFirstEvent,(long)((TmfTimestamp)tmpContext.getTimestamp()).getValue() );
+ assertEquals("tmpContext has wrong timestamp after first seekEvent()",contextValueAfterFirstEvent,(long)((TmfTimestamp)tmpEvent.getTimestamp()).getValue() );
assertNotSame("tmpEvent is null after seekEvent() to start ",null,tmpEvent );
assertTrue("tmpEvent has wrong reference after seekEvent() to start",((String)tmpEvent.getReference().getReference()).contains(firstEventReference) );
}
public void testSeekLocation() {
TmfEvent tmpEvent = null;
- TmfTraceContext tmpContext = new TmfTraceContext(null, null, 0);
+ TmfTraceContext tmpContext = new TmfTraceContext(null, 0);
LTTngTextTrace testStream1 = prepareStreamToTest();
// We should be at the beginning of the trace, we will seek at a certain timestamp
tmpContext = testStream1.seekLocation(locationToSeekTest1);
tmpEvent = testStream1.getNextEvent(tmpContext);
assertNotSame("tmpContext is null after first seekLocation()",null,tmpContext );
- assertEquals("tmpContext has wrong timestamp after first seekLocation()",contextValueAfterSeekTest1,(long)((TmfTimestamp)tmpContext.getTimestamp()).getValue() );
+ assertEquals("tmpContext has wrong timestamp after first seekLocation()",contextValueAfterSeekTest1,(long)((TmfTimestamp)tmpEvent.getTimestamp()).getValue() );
assertNotSame("tmpEvent is null after first seekLocation()",null,tmpEvent );
assertTrue("tmpEvent has wrong reference after first seekLocation()", ((String)tmpEvent.getReference().getReference()).contains(seek1EventReference) );
tmpContext = testStream1.seekLocation(locationToSeekLast);
tmpEvent = testStream1.getNextEvent(tmpContext);
assertNotSame("tmpContext is null after first seekLocation()",null,tmpContext );
- assertEquals("tmpContext has wrong timestamp after first seekLocation()",contextValueAfterSeekLast,(long)((TmfTimestamp)tmpContext.getTimestamp()).getValue() );
+ assertEquals("tmpContext has wrong timestamp after first seekLocation()",contextValueAfterSeekLast,(long)((TmfTimestamp)tmpEvent.getTimestamp()).getValue() );
assertNotSame("tmpEvent is null after seekLocation() to last ",null,tmpEvent );
assertTrue("tmpEvent has wrong reference after seekLocation() to last",((String)tmpEvent.getReference().getReference()).contains(seekLastEventReference) );
tmpContext = testStream1.seekLocation(locationToSeekFirst);
tmpEvent = testStream1.getNextEvent(tmpContext);
assertNotSame("tmpContext is null after first seekLocation()",null,tmpContext );
- assertEquals("tmpContext has wrong timestamp after first seekLocation()",contextValueAfterFirstEvent,(long)((TmfTimestamp)tmpContext.getTimestamp()).getValue() );
+ assertEquals("tmpContext has wrong timestamp after first seekLocation()",contextValueAfterFirstEvent,(long)((TmfTimestamp)tmpEvent.getTimestamp()).getValue() );
assertNotSame("tmpEvent is null after seekLocation() to start ",null,tmpEvent );
assertTrue("tmpEvent has wrong reference after seekLocation() to start",((String)tmpEvent.getReference().getReference()).contains(firstEventReference) );
}
LTTngTextTrace testStream1 = prepareStreamToTest();
// Move to the first event to have something to play with
- tmpEvent = testStream1.parseEvent( new TmfTraceContext(null, null, 0));
+ tmpEvent = testStream1.parseEvent( new TmfTraceContext(null, 0));
// Test current event
assertNotSame("tmpEvent is null after first event",null,tmpEvent );
LTTngTextTrace testStream1 = prepareStreamToTest();
// Move to the first event to have something to play with
- testStream1.parseEvent( new TmfTraceContext(null, null, 0) );
+ testStream1.parseEvent( new TmfTraceContext(null, 0) );
// Just make sure toString() does not return null or the java reference
assertNotSame("toString returned null",null, testStream1.toString() );
*******************************************************************************/
package org.eclipse.linuxtools.lttng.ui.model.trange;
+
import org.eclipse.linuxtools.lttng.state.StateStrings;
import org.eclipse.linuxtools.lttng.state.model.LttngIRQState;
import org.eclipse.linuxtools.lttng.state.model.LttngTraceState;
+import org.eclipse.linuxtools.lttng.state.model.LttngTrapState;
import org.eclipse.linuxtools.lttng.ui.model.trange.TimeRangeEventResource.ResourceTypes;
/**
@Override
public String getStateMode(LttngTraceState traceSt) {
// Determine the trap state.
- long trapState = traceSt.getTrap_states().get(getResourceId())
- .getRunning().longValue();
String trapStateMode = "";
- if (trapState == 0) {
- trapStateMode = StateStrings.TrapMode.LTTV_TRAP_IDLE
- .getInName();
- } else {
- trapStateMode = StateStrings.TrapMode.LTTV_TRAP_BUSY
- .getInName();
+ LttngTrapState ts = traceSt.getTrap_states().get(getResourceId());
+
+ // *** Note :
+ // Ts might not have been created yet.
+ // This is because the state system will be updated next to this before hook
+ // It should be correct to create it here as Busy
+ // (traps are created with running++ so it wont be idle)
+ if ( ts != null ) {
+ Long trapState = ts.getRunning();
+
+ if (trapState == 0) {
+ trapStateMode = StateStrings.TrapMode.LTTV_TRAP_IDLE.getInName();
+ } else {
+ trapStateMode = StateStrings.TrapMode.LTTV_TRAP_BUSY.getInName();
+ }
}
-
+ else {
+ trapStateMode = StateStrings.TrapMode.LTTV_TRAP_BUSY.getInName();
+ }
+
return trapStateMode;
}
};
/*******************************************************************************
- * Copyright (c) 2009 Ericsson
+ * Copyright (c) 2009, 2010 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v1.0 which
public static final String ID = "org.eclipse.linuxtools.lttng.ui.views.events";
- // ========================================================================
+ // ------------------------------------------------------------------------
// Table data
- // ========================================================================
+ // ------------------------------------------------------------------------
// Table column names
private final String TIMESTAMP_COLUMN = "Timestamp";
};
private ColumnData[] columnData = new ColumnData[] {
- new ColumnData(columnProperties[0], 100, SWT.LEFT),
+ new ColumnData(columnProperties[0], 125, SWT.LEFT),
new ColumnData(columnProperties[1], 100, SWT.LEFT),
- new ColumnData(columnProperties[2], 100, SWT.LEFT),
- new ColumnData(columnProperties[3], 100, SWT.LEFT),
+ new ColumnData(columnProperties[2], 200, SWT.LEFT),
+ new ColumnData(columnProperties[3], 200, SWT.LEFT),
new ColumnData(columnProperties[4], 100, SWT.LEFT)
};
- // ========================================================================
+ // ------------------------------------------------------------------------
// Constructor
- // ========================================================================
+ // ------------------------------------------------------------------------
public EventsView() {
+ super(1);
}
/**
* FIXME: Add support for column selection
*/
@Override
- protected void setColumnHeaders(Table table) {
+ protected void createColumnHeaders(Table table) {
for (int i = 0; i < columnData.length; i++) {
final TableColumn column = new TableColumn(table, columnData[i].alignment, i);
column.setText(columnData[i].header);
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.linuxtools.lttng.event.LttngEvent;
import org.eclipse.linuxtools.lttng.trace.LTTngTrace;
import org.eclipse.linuxtools.lttng.ui.views.project.model.LTTngExperimentEntry;
import org.eclipse.linuxtools.lttng.ui.views.project.model.LTTngTraceEntry;
+import org.eclipse.linuxtools.tmf.experiment.TmfExperiment;
+import org.eclipse.linuxtools.tmf.experiment.TmfExperimentSelectedSignal;
import org.eclipse.linuxtools.tmf.trace.ITmfTrace;
-import org.eclipse.linuxtools.tmf.trace.TmfExperiment;
-import org.eclipse.linuxtools.tmf.trace.TmfExperimentSelectedSignal;
import org.eclipse.linuxtools.tmf.ui.views.TmfView;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
private final IWorkspace fWorkspace;
private final IResourceChangeListener fResourceChangeListener;
private TreeViewer fViewer;
- private TmfExperiment fExperiment = null;
+ private TmfExperiment<LttngEvent> fExperiment = null;
// private Object fSelection = null;
// To perform updates on the UI thread
private void selectExperiment(LTTngExperimentEntry experiment) {
String expId = experiment.getName();
if (fExperiment != null)
- fExperiment.dispose();
+ fExperiment.deregister();
try {
LTTngTraceEntry[] traceEntries = experiment.getTraces();
int nbTraces = traceEntries.length;
ITmfTrace trace = new LTTngTrace(location, waitForCompletion);
traces[i] = trace;
}
- fExperiment = new TmfExperiment(expId, traces, waitForCompletion);
- broadcastSignal(new TmfExperimentSelectedSignal(this, fExperiment));
+ fExperiment = new TmfExperiment<LttngEvent>(LttngEvent.class, expId, traces);
+ fExperiment.indexExperiment(waitForCompletion);
+ broadcast(new TmfExperimentSelectedSignal(this, fExperiment));
} catch (FileNotFoundException e) {
// TODO: Why not tell the user? He would appreciate...
// e.printStackTrace();
return "[ProjectView]";
}
-}
+}
\ No newline at end of file
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection)
*/
- @SuppressWarnings("unchecked")
public void init(IWorkbench workbench, IStructuredSelection selection) {
fWorkbench = workbench;
fSelection = selection;
return fMainPage.finish();
}
-}
+}
\ No newline at end of file
public String getValue() {
return folderNameField.getText();
}
+
+ public IResource getResource() {
+ // TODO Auto-generated method stub
+ return null;
+ }
});
}
super.okPressed();
}
-}
+}
\ No newline at end of file
package org.eclipse.linuxtools.lttng.ui.views.timeframe;
+import org.eclipse.linuxtools.lttng.event.LttngEvent;
import org.eclipse.linuxtools.tmf.event.TmfTimeRange;
import org.eclipse.linuxtools.tmf.event.TmfTimestamp;
+import org.eclipse.linuxtools.tmf.experiment.TmfExperiment;
+import org.eclipse.linuxtools.tmf.experiment.TmfExperimentSelectedSignal;
+import org.eclipse.linuxtools.tmf.experiment.TmfExperimentUpdatedSignal;
import org.eclipse.linuxtools.tmf.signal.TmfSignalHandler;
import org.eclipse.linuxtools.tmf.signal.TmfTimeSynchSignal;
-import org.eclipse.linuxtools.tmf.trace.TmfExperiment;
-import org.eclipse.linuxtools.tmf.trace.TmfExperimentSelectedSignal;
-import org.eclipse.linuxtools.tmf.trace.TmfExperimentUpdatedSignal;
import org.eclipse.linuxtools.tmf.ui.views.TmfView;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
private Slider fSlider;
// The current experiment
- TmfExperiment fExperiment = null;
+ TmfExperiment<LttngEvent> fExperiment = null;
/**
* Constructor
// Notify other views
if (!fCurrentTime.equals(currentTime)) {
fCurrentTime = currentTime;
- broadcastSignal(new TmfTimeSynchSignal(this, currentTime));
+ broadcast(new TmfTimeSynchSignal(this, currentTime));
}
}
// TMF Signal Handling
// ========================================================================
- /**
+ @SuppressWarnings("unchecked")
+ /**
* @param signal
*/
@TmfSignalHandler
public void experimentSelected(TmfExperimentSelectedSignal signal) {
// Update the trace reference
- fExperiment = signal.getExperiment();
+ fExperiment = (TmfExperiment<LttngEvent>) signal.getExperiment();
// Update the time frame
fTraceTimeRange = fExperiment.getTimeRange();
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
- * Francois Chouinard (fchouinard@gmail.com) - Initial API and implementation
+ * Francois Chouinard - Initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.lttng.stubs;
import java.io.IOException;
import org.eclipse.linuxtools.tmf.event.TmfEvent;
-import org.eclipse.linuxtools.tmf.trace.ITmfEventParser;
+import org.eclipse.linuxtools.tmf.parser.ITmfEventParser;
import org.eclipse.linuxtools.tmf.trace.ITmfTrace;
import org.eclipse.linuxtools.tmf.trace.TmfTraceContext;
// return null;
// }
-}
+}
\ No newline at end of file
import java.io.IOException;
import java.io.RandomAccessFile;
+import org.eclipse.linuxtools.lttng.event.LttngEvent;
import org.eclipse.linuxtools.tmf.event.TmfEvent;
-import org.eclipse.linuxtools.tmf.trace.ITmfEventParser;
+import org.eclipse.linuxtools.tmf.parser.ITmfEventParser;
import org.eclipse.linuxtools.tmf.trace.TmfTrace;
import org.eclipse.linuxtools.tmf.trace.TmfTraceContext;
* <p>
* Dummy test trace. Use in conjunction with LTTngEventParserStub.
*/
-public class LTTngTraceStub extends TmfTrace {
+public class LTTngTraceStub extends TmfTrace<LttngEvent> {
// ========================================================================
// Attributes
* @throws FileNotFoundException
*/
public LTTngTraceStub(String filename, int cacheSize) throws FileNotFoundException {
- super(filename, cacheSize, false);
+ super(LttngEvent.class, filename, cacheSize);
fTrace = new RandomAccessFile(filename, "r");
fParser = new LTTngEventParserStub();
- indexStream();
+ indexTrace(true);
}
// ========================================================================
try {
synchronized(fTrace) {
fTrace.seek((location != null) ? (Long) location : 0);
- context = new TmfTraceContext(getCurrentLocation(), null, 0);
- TmfTraceContext context2 = new TmfTraceContext(getCurrentLocation(), null, 0);
- TmfEvent event = parseEvent(context2);
- context.setTimestamp(event.getTimestamp());
+ context = new TmfTraceContext(getCurrentLocation(), 0);
+// TmfTraceContext context2 = new TmfTraceContext(getCurrentLocation(), 0);
+// TmfEvent event = parseEvent(context2);
+// context.setTimestamp(event.getTimestamp());
}
} catch (IOException e) {
// TODO Auto-generated catch block
// return null;
// }
-}
+}
\ No newline at end of file
// We don't want to send away events that are outdated as their informations could be invalid
// If the timestamp between the event and the trace are not coherent we will not perform the conversion
- if ( jniEventReference.getParentTracefile().getParentTrace().getCurrentEventTimestamp().getTime() == getTimestamp().getValue() ) {
- tmpEvent = jniEventReference;
- }
- else {
- System.out.println("convertEventTmfToJni() failed: Unsynced Timestamp > TMF:" + getTimestamp().getValue() + " <--> JNI:" + jniEventReference.getParentTracefile().getParentTrace().getCurrentEventTimestamp().getTime());
- }
+// if ( jniEventReference.getParentTracefile().getParentTrace().getCurrentEventTimestamp().getTime() == getTimestamp().getValue() ) {
+// tmpEvent = jniEventReference;
+// }
+// else {
+// System.out.println("convertEventTmfToJni() failed: Unsynced Timestamp > TMF:" + getTimestamp().getValue() + " <--> JNI:" + jniEventReference.getParentTracefile().getParentTrace().getCurrentEventTimestamp().getTime());
+// }
+ tmpEvent = jniEventReference;
return tmpEvent;
}
import java.util.HashMap;
+import org.eclipse.linuxtools.lttng.jni.JniEvent;
import org.eclipse.linuxtools.tmf.event.TmfEventContent;
/**
for ( int pos=0; pos<tmpType.getNbFields(); pos++ ) {
String name = tmpType.getLabel(pos);
- Object newValue = ((LttngEvent)getEvent()).convertEventTmfToJni().parseFieldByName(name);
+// Object newValue = ((LttngEvent)getEvent()).convertEventTmfToJni().parseFieldByName(name);
+ JniEvent jniEvent = ((LttngEvent)getEvent()).convertEventTmfToJni();
+ if (jniEvent == null) {
+ System.out.println("Bad event.");
+ }
+ Object newValue = (jniEvent != null) ? jniEvent.parseFieldByName(name) : null;
tmpField = new LttngEventField(this, name, newValue );
fFieldsMap.put(name, tmpField);
*/
@Override
public LttngEventField getField(String name) {
- // *** VERIFY ***
+ // *** VERIFY ***
// Should we check if the field exists in LttngType before parsing?
// It could avoid calling parse for non-existent fields but would waste some cpu cycle on check?
LttngEventField returnedField = fFieldsMap.get(name);
if ( returnedField == null ) {
// *** VERIFY ***
// Should we really make sure we didn't get null before creating/inserting a field?
- Object newValue = ((LttngEvent)getEvent()).convertEventTmfToJni().parseFieldByName(name);
+// Object newValue = ((LttngEvent)getEvent()).convertEventTmfToJni().parseFieldByName(name);
+ LttngEvent lttngEvent = (LttngEvent) getEvent();
+ JniEvent jniEvent = lttngEvent.convertEventTmfToJni();
+ Object newValue = (jniEvent != null) ? jniEvent.parseFieldByName(name) : null;
if ( newValue!= null ) {
returnedField = new LttngEventField(this, name, newValue);
import java.util.Vector;
-import org.eclipse.linuxtools.tmf.event.TmfEvent;
+import org.eclipse.linuxtools.lttng.event.LttngEvent;
import org.eclipse.linuxtools.tmf.event.TmfTimeRange;
-import org.eclipse.linuxtools.tmf.request.TmfDataRequest;
+import org.eclipse.linuxtools.tmf.experiment.TmfExperiment;
+import org.eclipse.linuxtools.tmf.request.TmfEventRequest;
import org.eclipse.linuxtools.tmf.signal.TmfSignalManager;
-import org.eclipse.linuxtools.tmf.trace.TmfExperiment;
/**
* This class is an extension of Data Request which includes specific references
* @author alvaro
*
*/
-public class StateDataRequest extends TmfDataRequest<TmfEvent> {
+public class StateDataRequest extends TmfEventRequest<LttngEvent> {
+
// ========================================================================
// Data
// =======================================================================
private long numOfEvents = 0;
private boolean broadcast = false;
private boolean clearDataInd = false;
+
// ========================================================================
// Constructors
// =======================================================================
int maxBlockSize, IStateDataRequestListener listener,
StateManager manager) {
- super(range, nbEvents, maxBlockSize);
+ super(LttngEvent.class, range, nbEvents, maxBlockSize);
//super(0, nbEvents, maxBlockSize);
this.manager = manager;
if (listener != null && !listeners.contains(listener)) {
* @param broadcast
* true: All views, false: only to registered listeners
*/
- public void startRequestInd(TmfExperiment experiment, boolean broadcast,
+ public void startRequestInd(TmfExperiment<LttngEvent> experiment, boolean broadcast,
boolean waitForCompletion) {
if (broadcast) {
// Notify all state views.
public boolean isclearDataInd() {
return clearDataInd;
}
-}
+}
\ No newline at end of file
import java.util.Vector;
import org.eclipse.linuxtools.lttng.TraceDebug;
+import org.eclipse.linuxtools.lttng.event.LttngEvent;
import org.eclipse.linuxtools.lttng.event.LttngTimestamp;
import org.eclipse.linuxtools.lttng.state.evProcessor.AbsEventProcessorFactory;
import org.eclipse.linuxtools.lttng.state.evProcessor.EventProcessorProxy;
import org.eclipse.linuxtools.tmf.event.TmfEvent;
import org.eclipse.linuxtools.tmf.event.TmfTimeRange;
import org.eclipse.linuxtools.tmf.event.TmfTimestamp;
+import org.eclipse.linuxtools.tmf.experiment.TmfExperiment;
import org.eclipse.linuxtools.tmf.request.TmfDataRequest;
-import org.eclipse.linuxtools.tmf.trace.TmfExperiment;
import org.eclipse.linuxtools.tmf.trace.TmfTrace;
import org.eclipse.linuxtools.tmf.trace.TmfTraceCheckpoint;
// ========================================================================
// Data
// =======================================================================
- private TmfExperiment fExperiment = null;
- private TmfTrace fEventLog = null;
+ private TmfExperiment<LttngEvent> fExperiment = null;
+ private TmfTrace<LttngEvent> fEventLog = null;
private StateStacksHandler stateIn = null;
private Long eventCount = 0L;
* @param experiment
* @param clearPreviousData
*/
- public void setTraceSelection(TmfExperiment experiment,
+ @SuppressWarnings("unchecked")
+ public void setTraceSelection(TmfExperiment<LttngEvent> experiment,
boolean clearPreviousData) {
// New log in use, read all events and build state transition stack
if (experiment != null) {
if (fExperiment != null && fExperiment != experiment) {
- this.fExperiment.dispose();
+ this.fExperiment.deregister();
}
this.fExperiment = experiment;
// this.fEventLog.dispose();
// }
- this.fEventLog = (TmfTrace)experiment.getTraces()[0];
+ this.fEventLog = (TmfTrace<LttngEvent>) experiment.getTraces()[0];
try {
stateIn.init(fEventLog);
} catch (LttngStateException e) {
*
* @return
*/
- public TmfTrace getEventLog() {
+ public TmfTrace<LttngEvent> getEventLog() {
return fEventLog;
}
// Create the new request and override the handlePartialResult function
StateDataRequest request = new StateDataRequest(timeWindow,
- DEFAULT_OFFSET, TmfDataRequest.ALL_EVENTS, DEFAULT_CHUNK,
+ DEFAULT_OFFSET, TmfDataRequest.ALL_DATA, DEFAULT_CHUNK,
listener, this) {
@Override
public void handleData() {
// Create the new request and override the handlePartialResult function
StateDataRequest request = new StateDataRequest(timeWindow,
- DEFAULT_OFFSET, TmfDataRequest.ALL_EVENTS, DEFAULT_CHUNK,
+ DEFAULT_OFFSET, TmfDataRequest.ALL_DATA, DEFAULT_CHUNK,
requestListener, this) {
@Override
}
}
}
-}
+}
\ No newline at end of file
}
+// static int nbEvents = 0;
protected void processEvent(TmfEvent tmfEvent) /* throws LttngStateException */{
if (tmfEvent == null) {
return;
if (!(tmfEvent instanceof LttngEvent)) {
TraceDebug
.debug("The event received is not an instance of LttngEvent and can not be processed");
+ return;
}
+// System.out.println("Event: " + nbEvents++ + ", timestamp: " + tmfEvent.getTimestamp());
+
LttngEvent trcEvent = (LttngEvent) tmfEvent;
// LttngEventField[] fields = ((LttngEventContent)trcEvent.getContent()).getFields();
// Notify the before Handlers
Set<AbsEventProcessorFactory> handlerRegister = EventProcessorProxy
.getInstance().getProcessingFactories();
-
// Notify the state BEFORE update handlers
for (Iterator<AbsEventProcessorFactory> iterator = handlerRegister
.iterator(); iterator.hasNext();) {
}
}
-
+
// Notify the STATE UPDATE handlers
// Only one state update expected
for (Iterator<AbsEventProcessorFactory> iterator = handlerRegister
LTTngCPUState cpust = traceSt.getCpu_states().get(cpu);
cpu_push_mode(cpust, StateStrings.CpuMode.LTTV_CPU_TRAP);
cpust.pushToTrapStack(trap); /* update trap status */
-
+
// update Trap State
- LttngTrapState trap_state = traceSt.getTrap_states().get(trap);
- trap_state.incrementRunning();
-
+ LttngTrapState trap_state = null;
+ trap_state = traceSt.getTrap_states().get(trap);
+
+ // If the trape_state exists, just increment it's counter,
+ // otherwise, create it
+ if ( trap_state == null ) {
+ trap_state = new LttngTrapState();
+ trap_state.incrementRunning();
+ traceSt.getTrap_states().put(trap, trap_state);
+ }
+ else {
+ trap_state.incrementRunning();
+ }
+
return false;
}
import java.util.HashMap;
import java.util.Map;
+import org.eclipse.linuxtools.lttng.event.LttngEvent;
import org.eclipse.linuxtools.lttng.state.IStateDataRequestListener;
import org.eclipse.linuxtools.lttng.state.StateManager;
import org.eclipse.linuxtools.tmf.component.TmfComponent;
import org.eclipse.linuxtools.tmf.event.TmfTimeRange;
+import org.eclipse.linuxtools.tmf.experiment.TmfExperiment;
+import org.eclipse.linuxtools.tmf.experiment.TmfExperimentSelectedSignal;
import org.eclipse.linuxtools.tmf.signal.TmfSignalHandler;
-import org.eclipse.linuxtools.tmf.trace.TmfExperiment;
-import org.eclipse.linuxtools.tmf.trace.TmfExperimentSelectedSignal;
/**
* @author alvaro
// =======================================================================
private final Map<String, StateManager> managersByID = new HashMap<String, StateManager>();
- private TmfExperiment fExperiment = null; // one experiment supported
+ private TmfExperiment<LttngEvent> fExperiment = null; // one experiment supported
// ========================================================================
// Constructors
* org.eclipse.linuxtools.tmf.eventlog.ITmfEventLogEventListener#handleEvent
* (org.eclipse.linuxtools.tmf.eventlog.ITmfEventLogEvent)
*/
+ @SuppressWarnings("unchecked")
@TmfSignalHandler
public void experimentSelected(TmfExperimentSelectedSignal signal) {
// TmfExperiment experiment = signal.getExperiment();
//
// }
if (signal != null) {
- fExperiment = signal.getExperiment();
+ fExperiment = (TmfExperiment<LttngEvent>) signal.getExperiment();
traceSelected(fExperiment);
}
}
*
* @param experiment
*/
- private void traceSelected(TmfExperiment experiment) {
+ private void traceSelected(TmfExperiment<LttngEvent> experiment) {
// TODO: Re-factor when multiple traces are supported
// traceId, as well as when the request can be specified at the trace
// level
return timeRangeResult;
}
-}
+}
\ No newline at end of file
*/
public static void dispose() {
if (experimentManager != null) {
- experimentManager.dispose();
+ experimentManager.deregister();
experimentManager = null;
instanceBook = null;
}
}
-}
+}
\ No newline at end of file
// Data
// =======================================================================
private Long running;
-
+
// ========================================================================
// Constructor
// =======================================================================
+
+ public LttngTrapState() {
+ this.running = 0L;
+ }
+
public LttngTrapState(Long running) {
this.running = running;
}
running--;
}
}
+
+ public String toString() {
+ return "running : " + running;
+ }
+
}
\ No newline at end of file
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
-import java.util.Collections;
import java.util.HashMap;
import org.eclipse.linuxtools.lttng.event.LttngEvent;
import org.eclipse.linuxtools.lttng.event.LttngEventType;
import org.eclipse.linuxtools.lttng.event.LttngTimestamp;
import org.eclipse.linuxtools.lttng.jni.JniEvent;
-import org.eclipse.linuxtools.tmf.event.TmfEvent;
+import org.eclipse.linuxtools.tmf.component.ITmfContext;
import org.eclipse.linuxtools.tmf.event.TmfTimeRange;
-import org.eclipse.linuxtools.tmf.event.TmfTimestamp;
-import org.eclipse.linuxtools.tmf.request.ITmfRequestHandler;
+import org.eclipse.linuxtools.tmf.request.TmfDataRequest;
import org.eclipse.linuxtools.tmf.trace.ITmfTrace;
import org.eclipse.linuxtools.tmf.trace.TmfTrace;
import org.eclipse.linuxtools.tmf.trace.TmfTraceCheckpoint;
import org.eclipse.linuxtools.tmf.trace.TmfTraceContext;
-public class LTTngTextTrace extends TmfTrace implements ITmfTrace, ITmfRequestHandler<TmfEvent> {
+public class LTTngTextTrace extends TmfTrace<LttngEvent> implements ITmfTrace {
private LttngTimestamp eventTimestamp = null;
private LttngEventSource eventSource = null;
private LttngEventType eventType = null;
private int cpuNumber = -1;
- private boolean showDebug = false;
+ private boolean showDebug = true;
public LTTngTextTrace(String path) throws Exception {
this(path, false);
}
public LTTngTextTrace(String path, boolean skipIndexing) throws Exception {
- super(path, 1, true);
+ super(LttngEvent.class, path, 1);
tracepath = path;
traceTypes = new HashMap<String, LttngEventType>();
fCheckpoints.add(new TmfTraceCheckpoint(new LttngTimestamp(0L), 0L));
}
else {
- indexStream();
+ indexTrace(true);
}
Long endTime = currentLttngEvent.getTimestamp().getValue();
positionToFirstEvent();
- getNextEvent(new TmfTraceContext(null, null, 0));
+ getNextEvent(new TmfTraceContext(null, 0));
Long starTime = currentLttngEvent.getTimestamp().getValue();
positionToFirstEvent();
private LTTngTextTrace(LTTngTrace oldStream) throws Exception {
- super(null);
+ super(LttngEvent.class, null);
throw new Exception("Copy constructor should never be use with a LTTngTrace!");
}
- @Override
- public void indexStream() {
- // Position the trace at the beginning
- TmfTraceContext context = seekLocation(null);
-
- long nbEvents=1L;
- fCheckpoints.add(new TmfTraceCheckpoint(new LttngTimestamp(0L), 0L));
-
- LttngTimestamp startTime = null;
- LttngTimestamp lastTime = new LttngTimestamp();
- LttngTimestamp timestamp = null;
- Long previousCharRead = 0L;
-
- TextLttngEvent tmpEvent = (TextLttngEvent)getNextEvent(context);
-
- while ( tmpEvent != null) {
- timestamp = (LttngTimestamp)context.getTimestamp();
- previousCharRead = nbCharRead;
-
- if ( startTime == null ) {
- startTime = new LttngTimestamp(timestamp.getValue());
- }
-
- if ((++nbEvents % fCacheSize) == 0) {
- fCheckpoints.add(new TmfTraceCheckpoint(new LttngTimestamp(timestamp.getValue()), previousCharRead));
- }
-
- tmpEvent = (TextLttngEvent)getNextEvent(context);
- }
-
- if (timestamp != null) {
- lastTime.setValue(timestamp.getValue());
-
- setTimeRange( new TmfTimeRange(startTime, lastTime) );
- notifyListeners(getTimeRange());
- }
-
- fNbEvents = nbEvents;
-
- if ( showDebug == true ) {
- for ( int pos=0; pos < fCheckpoints.size(); pos++) {
- System.out.print(pos + ": " + "\t");
- System.out.print( fCheckpoints.get(pos).getTimestamp() + "\t" );
- System.out.println( fCheckpoints.get(pos).getLocation() );
- }
- }
-
- }
-
private boolean positionToFirstEvent() {
boolean isSuccessful = true;
private void skipToPosition(Long skipPosition) {
try {
+ if ( skipPosition < 0 ) {
+ skipPosition = 0L;
+ }
+
if ( showDebug == true ) {
System.out.println("skipToPosition(Long skipPosition)");
System.out.println("\tSkipping to : " + skipPosition);
}
public TmfTraceContext seekLocation(Object location) {
+
if (location == null) {
location = 0L;
}
-
- TmfTraceContext tmpTraceContext = new TmfTraceContext(nbCharRead, (LttngTimestamp)currentLttngEvent.getTimestamp(), 0L);
- Long previousCharRead = nbCharRead;
- Long previousTimestamp = currentLttngEvent.getTimestamp().getValue();
- Long tmploc = (Long)location;
-
- if ( showDebug == true ) {
- System.out.println("seekLocation(Object location)");
- System.out.println("\ttimestamp: " + (LttngTimestamp)currentLttngEvent.getTimestamp());
- System.out.println("\tnbCharRead:" + nbCharRead);
- System.out.println("\tlocation: " + location);
- System.out.println();
- }
-
- if ( tmploc < nbCharRead ) {
- skipToPosition(tmploc);
- }
-
- if ( tmploc > nbCharRead ) {
- while ( tmploc > nbCharRead ) {
- previousCharRead = nbCharRead;
- previousTimestamp = currentLttngEvent.getTimestamp().getValue();
- getNextEvent(tmpTraceContext);
- }
- }
-
- tmpTraceContext.setTimestamp(new LttngTimestamp(previousTimestamp));
- tmpTraceContext.setLocation(previousCharRead);
-
- return tmpTraceContext;
- }
-
-
- @Override
- public TmfTraceContext seekEvent(TmfTimestamp timestamp) {
- if (timestamp == null) {
- timestamp = getStartTime();
+ if (!((Long) location).equals(nbCharRead)) {
+ skipToPosition((Long) location);
}
-
- int index = Collections.binarySearch(fCheckpoints, new TmfTraceCheckpoint(timestamp, 0));
-
- if (index < 0) {
- index = 0;
- }
-
- Object location = (index < fCheckpoints.size()) ? fCheckpoints.elementAt(index).getLocation() : null;
-
- if ( showDebug == true ) {
- System.out.println("seekEvent(TmfTimestamp timestamp)");
- System.out.println("\ttimestamp: " + timestamp.getValue());
- System.out.println("\tindex: " + index);
- System.out.println("\tlocation: " + location);
- System.out.println();
- }
-
- // *** HACK ***
- // We only know the timestamp AFTER we read the actual event
- // For this reason, we save the current "position" in byte (nbCharRead) and we seek back 1 event after we find our event
- TmfTraceContext currentEventContext = seekLocation(location);
-
- Long previousCharRead = nbCharRead;
- Long previousTimestamp = currentLttngEvent.getTimestamp().getValue();
- TmfEvent event = getNextEvent(currentEventContext);
-
- while ( (event != null) && (event.getTimestamp().getValue() < timestamp.getValue()) ) {
- previousCharRead = nbCharRead;
- previousTimestamp = currentLttngEvent.getTimestamp().getValue();
- event = getNextEvent(currentEventContext);
- }
-
- if ( event != null ) {
- skipToPosition(previousCharRead);
- currentEventContext.setLocation(previousCharRead);
- currentEventContext.setTimestamp(new LttngTimestamp(previousTimestamp));
- }
-
- return currentEventContext;
- }
-
- @Override
- public TmfTraceContext seekEvent(long position) {
+
+ TmfTraceContext tmpTraceContext = new TmfTraceContext(location, 0L);
- int checkPointPos = ((int)position / fCacheSize);
-
- Object location;
- location = ( checkPointPos < fCheckpoints.size()) ? fCheckpoints.elementAt(checkPointPos).getLocation() : null;
-
- long index = ((position / fCacheSize)*fCacheSize)-1;
-
- if ( index < 0) {
- index = 0;
- }
-
- if ( showDebug == true ) {
- System.out.println("seekEvent(long position)");
- System.out.println("\tposition: " + position);
- System.out.println("\tindex: " + index);
- System.out.println("\tlocation: " + location);
- System.out.println();
- }
- TmfTraceContext currentEventContext = seekLocation(location);
- Long previousCharRead = (Long)currentEventContext.getLocation();
- Long previousTimestamp = currentEventContext.getTimestamp().getValue();
-
- TmfEvent event = null;
- while (index < position) {
- event = getNextEvent(currentEventContext);
- previousCharRead = nbCharRead;
- previousTimestamp = currentLttngEvent.getTimestamp().getValue();
- index++;
- }
-
- if ( event != null ) {
- skipToPosition(previousCharRead);
- currentEventContext.setLocation(previousCharRead);
- currentEventContext.setTimestamp(new LttngTimestamp(previousTimestamp));
- }
-
- return currentEventContext;
+ return tmpTraceContext;
}
- @Override
- public TmfEvent getNextEvent(TmfTraceContext context) {
+ private LttngEvent parseMyNextEvent(TmfTraceContext context) {
// All parsing variables declared here so to be able to print them into the catch if needed
String tmpContent = null;
// *** HACK ***
// Evil exit case here : the two last line of the text dump does not contain "."
- // We should check in a better way (string comparaison and such) but it make the whole process to weight a lot more
+ // We should check in a better way (string comparison and such) but it make the whole process to weight a lot more
// Conclusion : this is ugly but fast.
if ( tmpCurIndex < 0 ) {
if ( showDebug == true ) {
System.out.println("END OF FILE.");
System.out.println();
}
- return returnedEvent;
+ return null;
}
tracefile = tmpContent.substring(tmpPrevIndex, tmpCurIndex ).trim();
currentLttngEvent.setContent(eventContent);
currentLttngEvent.setType(traceTypes.get(tmpTypeKey));
- context.setTimestamp(eventTimestamp);
- context.setLocation(nbCharRead);
-
returnedEvent = currentLttngEvent;
}
else if ( showDebug == true ) {
return nbCharRead;
}
- @Override
+ @Override
public LttngEvent parseEvent(TmfTraceContext context) {
- Long location = null;
- LttngEvent returnedEvent = null;
+ seekLocation(context.getLocation());
+ return parseMyNextEvent(context);
- if ( (currentLttngEvent!= null) && (! currentLttngEvent.getTimestamp().equals(context.getTimestamp()) ) ) {
- seekEvent(context.getTimestamp());
- getNextEvent(context);
- }
-
- if ( currentLttngEvent != null ) {
- returnedEvent = currentLttngEvent;
- }
-
- location = (Long)getCurrentLocation();
-
- context.setLocation(location);
- context.setTimestamp(currentLttngEvent.getTimestamp());
- context.incrIndex();
-
- return returnedEvent;
}
- public int getCpuNumber() {
+ public int getCpuNumber() {
return cpuNumber;
}
+
+ @Override
+ public ITmfContext setContext(TmfDataRequest<LttngEvent> request) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
}
return returnedField;
}
-}
+}
\ No newline at end of file
* LTTng trace implementation. It accesses the C trace handling library
* (seeking, reading and parsing) through the JNI component.
*/
-public class LTTngTrace extends TmfTrace {
+public class LTTngTrace extends TmfTrace<LttngEvent> {
private final static boolean SHOW_LTT_DEBUG_DEFAULT = false;
private final static boolean IS_PARSING_NEEDED_DEFAULT = false;
private final static int CHECKPOINT_PAGE_SIZE = 1;
*
*/
public LTTngTrace(String path, boolean waitForCompletion, boolean bypassIndexing) throws Exception {
- super(path, CHECKPOINT_PAGE_SIZE, true);
+ super(LttngEvent.class, path, CHECKPOINT_PAGE_SIZE);
try {
currentJniTrace = JniTraceFactory.getJniTrace(path, SHOW_LTT_DEBUG_DEFAULT);
}
)
);
+ //System.out.println("START :" + currentJniTrace.getStartTime().getTime());
+ //System.out.println("END :" + currentJniTrace.getEndTime().getTime());
+
// Export all the event types from the JNI side
traceTypes = new HashMap<String, LttngEventType>();
traceTypeNames = new Vector<String>();
// Bypass indexing if asked
if ( bypassIndexing == false ) {
- indexStream();
+ indexTrace(true);
}
}
* For this reason, copy constructor should NEVER be used.
*/
private LTTngTrace(LTTngTrace oldStream) throws Exception {
- super(null);
+ super(LttngEvent.class, null);
throw new Exception("Copy constructor should never be use with a LTTngTrace!");
}
LttngEvent returnedEvent = null;
synchronized (currentJniTrace) {
+
// Seek to the context's location
seekLocation(context.getLocation());
timestamp = (LttngTimestamp) getCurrentLocation();
}
context.setLocation(timestamp);
- context.setTimestamp(timestamp);
- context.incrIndex();
+// context.setTimestamp(timestamp);
+// context.incrRank();
return returnedEvent;
}
// If location is null, interpret this as a request to get back to the beginning of the trace
// in that case, just change the location, the seek will happen below
if (location == null) {
- location = getStartTime();
+ // *** FIXME ***
+ // Corrupted StartTime in TMF!!!
+ //location = getStartTime();
+ location = new LttngTimestamp(currentJniTrace.getStartTime().getTime());
}
if (location instanceof TmfTimestamp) {
long value = ((TmfTimestamp) location).getValue();
+
if (value != currentJniTrace.getCurrentEventTimestamp().getTime()) {
+ /*
+ System.out.println("\nLOCATION IS : " + ((TmfTimestamp) location).getValue());
+ System.out.println("JNI IS : " + currentJniTrace.getCurrentEventTimestamp().getTime());
+ System.out.println("SEEKING");
+ */
+
synchronized (currentJniTrace) {
- currentJniTrace.seekToTime(new JniTime(value));
+ //currentJniTrace.seekToTime(new JniTime(value));
+ currentJniTrace.seekAndRead(new JniTime(value));
timestamp = (LttngTimestamp) getCurrentLocation();
}
}
System.out.println("ERROR : Location not instance of TmfTimestamp");
}
- // FIXME: LTTng hack - start
- // return new TmfTraceContext(timestamp, timestamp, 0); // Original
- return new TmfTraceContext(timestamp, timestamp, -1); // Hacked
- // FIXME: LTTng hack - end
+ return new TmfTraceContext(timestamp, 0); // Original
}
/**
return returnedData;
}
+
}
/*
return key;
}
-}
+}
\ No newline at end of file
Bundle-Version: 0.2.0.qualifier
Bundle-RequiredExecutionEnvironment: J2SE-1.5
Bundle-Vendor: %Bundle-Vendor
-Require-Bundle: org.junit,
+Require-Bundle: org.junit;bundle-version="3.8.2",
org.eclipse.linuxtools.tmf;bundle-version="0.2.0",
org.eclipse.core.runtime;bundle-version="3.5.0"
Bundle-Localization: plugin
import junit.framework.TestCase;
-import org.eclipse.linuxtools.tmf.component.TmfDataProvider;
+import org.eclipse.linuxtools.tmf.component.ITmfContext;
+import org.eclipse.linuxtools.tmf.component.TmfProvider;
import org.eclipse.linuxtools.tmf.component.TmfProviderManager;
import org.eclipse.linuxtools.tmf.event.TmfEvent;
-import org.eclipse.linuxtools.tmf.request.ITmfDataRequest;
-import org.eclipse.linuxtools.tmf.trace.ITmfContext;
+import org.eclipse.linuxtools.tmf.request.TmfDataRequest;
/**
* <b><u>TmfProviderManagerTest</u></b>
* <p>
- * Test suite for the TmfProviderManager class.
+ * TODO: Implement me. Please.
*/
public class TmfProviderManagerTest extends TestCase {
- public TmfProviderManagerTest(String name) {
- super(name);
- }
-
@Override
protected void setUp() throws Exception {
super.setUp();
// Dummy Providers
// ------------------------------------------------------------------------
- public class TestProvider1 extends TmfDataProvider<TmfEvent> {
+ public class TestProvider1 extends TmfProvider<TmfEvent> {
public TestProvider1(Class<TmfEvent> type) {
- super("TestProvider1", type);
+ super(type);
}
@Override
- public ITmfContext armRequest(ITmfDataRequest<TmfEvent> request) {
+ public ITmfContext setContext(TmfDataRequest<TmfEvent> request) {
return null;
}
@Override
return null;
}
@Override
- public boolean isCompleted(ITmfDataRequest<TmfEvent> request, TmfEvent data, int nbRead) {
+ public boolean isCompleted(TmfDataRequest<TmfEvent> request, TmfEvent data) {
return false;
}
}
- public class TestProvider2 extends TmfDataProvider<TmfEvent> {
+ public class TestProvider2 extends TmfProvider<TmfEvent> {
public TestProvider2(Class<TmfEvent> type) {
- super("TestProvider2", type);
+ super(type);
}
@Override
- public ITmfContext armRequest(ITmfDataRequest<TmfEvent> request) {
+ public ITmfContext setContext(TmfDataRequest<TmfEvent> request) {
return null;
}
@Override
return null;
}
@Override
- public boolean isCompleted(ITmfDataRequest<TmfEvent> request, TmfEvent data, int nbRead) {
+ public boolean isCompleted(TmfDataRequest<TmfEvent> request, TmfEvent data) {
return false;
}
}
}
}
- public class TestProvider3 extends TmfDataProvider<TmfEvent3> {
+ public class TestProvider3 extends TmfProvider<TmfEvent3> {
public TestProvider3(Class<TmfEvent3> type) {
- super("TestProvider3", type);
+ super(type);
}
@Override
- public ITmfContext armRequest(ITmfDataRequest<TmfEvent3> request) {
+ public ITmfContext setContext(TmfDataRequest<TmfEvent3> request) {
return null;
}
@Override
return null;
}
@Override
- public boolean isCompleted(ITmfDataRequest<TmfEvent3> request, TmfEvent3 data, int nbRead) {
+ public boolean isCompleted(TmfDataRequest<TmfEvent3> request, TmfEvent3 data) {
return false;
}
}
+// For multiple data types
+// public class TestProvider4 extends TmfProvider<TmfEvent> {
+// public TestProvider4(Class<TmfEvent> type) {
+// super(type);
+// TmfProviderManager.register(TmfEvent3.class, this);
+// }
+// @Override
+// public ITmfContext setContext(TmfDataRequest<TmfEvent> request) {
+// return null;
+// }
+// @Override
+// public TmfEvent getNext(ITmfContext context) {
+// return null;
+// }
+// @Override
+// public boolean isCompleted(TmfDataRequest<TmfEvent> request, TmfEvent data) {
+// return false;
+// }
+// }
+
// ------------------------------------------------------------------------
- // register/dispose
+ // register()
// ------------------------------------------------------------------------
@SuppressWarnings("unchecked")
public void testRegister_0() {
- TmfDataProvider<TmfEvent>[] providers = (TmfDataProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class);
- assertEquals("getProviders", 0, providers.length);
+ TmfProvider<TmfEvent>[] providers = (TmfProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class);
+ assertTrue(providers.length == 0);
- providers = (TmfDataProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class);
- assertEquals("getProviders", 0, providers.length);
+ providers = (TmfProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class);
+ assertTrue(providers.length == 0);
}
@SuppressWarnings("unchecked")
// Register a single provider
TestProvider1 testProvider1 = new TestProvider1(TmfEvent.class);
- TmfDataProvider<TmfEvent>[] providers = (TmfDataProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class);
- assertEquals("getProviders", 1, providers.length);
- assertEquals("getProviders", testProvider1, providers[0]);
+ TmfProvider<TmfEvent>[] providers = (TmfProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class);
+ assertTrue(providers.length == 1);
+ assertTrue(providers[0] == testProvider1);
- providers = (TmfDataProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class);
- assertEquals("getProviders", 1, providers.length);
- assertEquals("getProviders", testProvider1, providers[0]);
+ providers = (TmfProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class);
+ assertTrue(providers.length == 1);
+ assertTrue(providers[0] == testProvider1);
// Unregister it
- testProvider1.dispose();
+ testProvider1.deregister();
- providers = (TmfDataProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class);
- assertEquals("getProviders", 0, providers.length);
+ providers = (TmfProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class);
+ assertTrue(providers.length == 0);
- providers = (TmfDataProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class);
- assertEquals("getProviders", 0, providers.length);
+ providers = (TmfProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class);
+ assertTrue(providers.length == 0);
}
@SuppressWarnings("unchecked")
TestProvider1 testProvider1 = new TestProvider1(TmfEvent.class);
TestProvider2 testProvider2 = new TestProvider2(TmfEvent.class);
- TmfDataProvider<TmfEvent>[] providers = (TmfDataProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class);
- assertEquals("getProviders", 2, providers.length);
+ TmfProvider<TmfEvent>[] providers = (TmfProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class);
assertTrue(providers.length == 2);
if (providers[0] == testProvider1) {
- assertEquals("getProviders", testProvider2, providers[1]);
+ assertTrue(providers[1] == testProvider2);
}
else {
- assertEquals("getProviders", testProvider2, providers[0]);
- assertEquals("getProviders", testProvider1, providers[1]);
+ assertTrue(providers[1] == testProvider1);
+ assertTrue(providers[0] == testProvider2);
}
- providers = (TmfDataProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class);
- assertEquals("getProviders", 1, providers.length);
- assertEquals("getProviders", testProvider1, providers[0]);
+ providers = (TmfProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class);
+ assertTrue(providers.length == 1);
+ assertTrue(providers[0] == testProvider1);
- providers = (TmfDataProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider2.class);
- assertEquals("getProviders", 1, providers.length);
- assertEquals("getProviders", testProvider2, providers[0]);
+ providers = (TmfProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider2.class);
+ assertTrue(providers.length == 1);
+ assertTrue(providers[0] == testProvider2);
// Remove one
- testProvider1.dispose();
+ testProvider1.deregister();
- providers = (TmfDataProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class);
- assertEquals("getProviders", 1, providers.length);
- assertEquals("getProviders", testProvider2, providers[0]);
+ providers = (TmfProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class);
+ assertTrue(providers.length == 1);
+ assertTrue(providers[0] == testProvider2);
- providers = (TmfDataProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class);
- assertEquals("getProviders", 0, providers.length);
+ providers = (TmfProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class);
+ assertTrue(providers.length == 0);
- providers = (TmfDataProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider2.class);
- assertEquals("getProviders", 1, providers.length);
- assertEquals("getProviders", testProvider2, providers[0]);
+ providers = (TmfProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider2.class);
+ assertTrue(providers.length == 1);
+ assertTrue(providers[0] == testProvider2);
// Remove the other
- testProvider2.dispose();
+ testProvider2.deregister();
- providers = (TmfDataProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class);
- assertEquals("getProviders", 0, providers.length);
+ providers = (TmfProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class);
+ assertTrue(providers.length == 0);
- providers = (TmfDataProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class);
- assertEquals("getProviders", 0, providers.length);
+ providers = (TmfProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class);
+ assertTrue(providers.length == 0);
- providers = (TmfDataProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider2.class);
- assertEquals("getProviders", 0, providers.length);
+ providers = (TmfProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider2.class);
+ assertTrue(providers.length == 0);
}
@SuppressWarnings("unchecked")
TestProvider2 testProvider2 = new TestProvider2(TmfEvent.class);
TestProvider3 testProvider3 = new TestProvider3(TmfEvent3.class);
- TmfDataProvider<TmfEvent>[] providers = (TmfDataProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class);
- assertEquals("getProviders", 2, providers.length);
+ TmfProvider<TmfEvent>[] providers = (TmfProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class);
+ assertTrue(providers.length == 2);
if (providers[0] == testProvider1) {
- assertEquals("getProviders", testProvider2, providers[1]);
+ assertTrue(providers[1] == testProvider2);
}
else {
- assertEquals("getProviders", testProvider2, providers[0]);
- assertEquals("getProviders", testProvider1, providers[1]);
+ assertTrue(providers[1] == testProvider1);
+ assertTrue(providers[0] == testProvider2);
}
- TmfDataProvider<TmfEvent3>[] providers3 = (TmfDataProvider<TmfEvent3>[]) TmfProviderManager.getProviders(TmfEvent3.class);
- assertEquals("getProviders", 1, providers3.length);
- assertEquals("getProviders", testProvider3, providers3[0]);
+ TmfProvider<TmfEvent3>[] providers3 = (TmfProvider<TmfEvent3>[]) TmfProviderManager.getProviders(TmfEvent3.class);
+ assertTrue(providers3.length == 1);
+ assertTrue(providers3[0] == testProvider3);
- providers = (TmfDataProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class);
- assertEquals("getProviders", 1, providers.length);
- assertEquals("getProviders", testProvider1, providers[0]);
+ providers = (TmfProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class);
+ assertTrue(providers.length == 1);
+ assertTrue(providers[0] == testProvider1);
- providers = (TmfDataProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider2.class);
- assertEquals("getProviders", 1, providers.length);
- assertEquals("getProviders", testProvider2, providers[0]);
+ providers = (TmfProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider2.class);
+ assertTrue(providers.length == 1);
+ assertTrue(providers[0] == testProvider2);
- providers3 = (TmfDataProvider<TmfEvent3>[]) TmfProviderManager.getProviders(TmfEvent3.class, TestProvider3.class);
- assertEquals("getProviders", 1, providers3.length);
- assertEquals("getProviders", testProvider3, providers3[0]);
+ providers3 = (TmfProvider<TmfEvent3>[]) TmfProviderManager.getProviders(TmfEvent3.class, TestProvider3.class);
+ assertTrue(providers3.length == 1);
+ assertTrue(providers3[0] == testProvider3);
// Remove one
- testProvider1.dispose();
+ testProvider1.deregister();
- providers = (TmfDataProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class);
- assertEquals("getProviders", 1, providers.length);
- assertEquals("getProviders", testProvider2, providers[0]);
+ providers = (TmfProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class);
+ assertTrue(providers.length == 1);
+ assertTrue(providers[0] == testProvider2);
- providers = (TmfDataProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class);
- assertEquals("getProviders", 0, providers.length);
+ providers = (TmfProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class);
+ assertTrue(providers.length == 0);
- providers = (TmfDataProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider2.class);
- assertEquals("getProviders", 1, providers.length);
- assertEquals("getProviders", testProvider2, providers[0]);
+ providers = (TmfProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider2.class);
+ assertTrue(providers.length == 1);
+ assertTrue(providers[0] == testProvider2);
- providers3 = (TmfDataProvider<TmfEvent3>[]) TmfProviderManager.getProviders(TmfEvent3.class);
- assertEquals("getProviders", 1, providers3.length);
- assertEquals("getProviders", testProvider3, providers3[0]);
+ providers3 = (TmfProvider<TmfEvent3>[]) TmfProviderManager.getProviders(TmfEvent3.class);
+ assertTrue(providers3.length == 1);
+ assertTrue(providers3[0] == testProvider3);
- providers3 = (TmfDataProvider<TmfEvent3>[]) TmfProviderManager.getProviders(TmfEvent3.class, TestProvider3.class);
- assertEquals("getProviders", 1, providers3.length);
- assertEquals("getProviders", testProvider3, providers3[0]);
+ providers3 = (TmfProvider<TmfEvent3>[]) TmfProviderManager.getProviders(TmfEvent3.class, TestProvider3.class);
+ assertTrue(providers3.length == 1);
+ assertTrue(providers3[0] == testProvider3);
// Remove another one
- testProvider2.dispose();
+ testProvider2.deregister();
- providers = (TmfDataProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class);
- assertEquals("getProviders", 0, providers.length);
+ providers = (TmfProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class);
+ assertTrue(providers.length == 0);
- providers = (TmfDataProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class);
- assertEquals("getProviders", 0, providers.length);
+ providers = (TmfProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class);
+ assertTrue(providers.length == 0);
- providers = (TmfDataProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider2.class);
- assertEquals("getProviders", 0, providers.length);
+ providers = (TmfProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider2.class);
+ assertTrue(providers.length == 0);
- providers3 = (TmfDataProvider<TmfEvent3>[]) TmfProviderManager.getProviders(TmfEvent3.class);
+ providers3 = (TmfProvider<TmfEvent3>[]) TmfProviderManager.getProviders(TmfEvent3.class);
assertTrue(providers3.length == 1);
assertTrue(providers3[0] == testProvider3);
- providers3 = (TmfDataProvider<TmfEvent3>[]) TmfProviderManager.getProviders(TmfEvent3.class, TestProvider3.class);
- assertEquals("getProviders", 1, providers3.length);
- assertEquals("getProviders", testProvider3, providers3[0]);
+ providers3 = (TmfProvider<TmfEvent3>[]) TmfProviderManager.getProviders(TmfEvent3.class, TestProvider3.class);
+ assertTrue(providers3.length == 1);
+ assertTrue(providers3[0] == testProvider3);
// Remove the last one
- testProvider3.dispose();
-
- providers = (TmfDataProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class);
- assertEquals("getProviders", 0, providers.length);
+ testProvider3.deregister();
- providers = (TmfDataProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class);
- assertEquals("getProviders", 0, providers.length);
+ providers = (TmfProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class);
+ assertTrue(providers.length == 0);
- providers = (TmfDataProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider2.class);
- assertEquals("getProviders", 0, providers.length);
+ providers = (TmfProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class);
+ assertTrue(providers.length == 0);
- providers3 = (TmfDataProvider<TmfEvent3>[]) TmfProviderManager.getProviders(TmfEvent3.class);
- assertEquals("getProviders", 0, providers.length);
-
- providers3 = (TmfDataProvider<TmfEvent3>[]) TmfProviderManager.getProviders(TmfEvent3.class, TestProvider3.class);
- assertEquals("getProviders", 0, providers.length);
- }
-
- @SuppressWarnings("unchecked")
- public void testGetProvider() {
-
- // Register 3 providers, mixed data types
- TestProvider1 testProvider1 = new TestProvider1(TmfEvent.class);
- TestProvider2 testProvider2 = new TestProvider2(TmfEvent.class);
- TestProvider3 testProvider3 = new TestProvider3(TmfEvent3.class);
-
- TmfDataProvider<TmfEvent>[] providers = (TmfDataProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, null);
- assertEquals("getProviders", 2, providers.length);
- if (providers[0] == testProvider1) {
- assertEquals("getProviders", testProvider2, providers[1]);
- }
- else {
- assertEquals("getProviders", testProvider2, providers[0]);
- assertEquals("getProviders", testProvider1, providers[1]);
- }
+ providers = (TmfProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider2.class);
+ assertTrue(providers.length == 0);
- providers = (TmfDataProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent3.class, null);
- assertEquals("getProviders", 1, providers.length);
- assertEquals("getProviders", testProvider3, providers[0]);
+ providers3 = (TmfProvider<TmfEvent3>[]) TmfProviderManager.getProviders(TmfEvent3.class);
+ assertTrue(providers3.length == 0);
- // Remove the providers
- testProvider1.dispose();
- testProvider2.dispose();
- testProvider3.dispose();
+ providers3 = (TmfProvider<TmfEvent3>[]) TmfProviderManager.getProviders(TmfEvent3.class, TestProvider3.class);
+ assertTrue(providers3.length == 0);
}
}
\ No newline at end of file
TestSuite suite = new TestSuite("Test suite for " + TmfCorePlugin.PLUGIN_ID + ".request"); //$NON-NLS-1$);
//$JUnit-BEGIN$
suite.addTestSuite(TmfDataRequestTest.class);
+ suite.addTestSuite(TmfEventRequestTest.class);
//$JUnit-END$
return suite;
}
/*******************************************************************************
- * Copyright (c) 2009 Ericsson
+ * Copyright (c) 2009, 2010 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v1.0 which
import junit.framework.TestCase;
import org.eclipse.linuxtools.tmf.event.TmfEvent;
-import org.eclipse.linuxtools.tmf.event.TmfTimeRange;
-import org.eclipse.linuxtools.tmf.event.TmfTimestamp;
import org.eclipse.linuxtools.tmf.request.TmfDataRequest;
/**
*/
public class TmfDataRequestTest extends TestCase {
- // ========================================================================
+ // ------------------------------------------------------------------------
// Housekeeping
- // ========================================================================
+ // ------------------------------------------------------------------------
public TmfDataRequestTest(String name) {
super(name);
super.tearDown();
}
- // ========================================================================
+ // ------------------------------------------------------------------------
// Constructors
- // ========================================================================
+ // ------------------------------------------------------------------------
- public void testTmfDataRequestIndexNbEvents() {
- TmfDataRequest<TmfEvent> request = new TmfDataRequest<TmfEvent>(10, 100);
+ public void testTmfDataRequest() {
+ TmfDataRequest<TmfEvent> request = new TmfDataRequest<TmfEvent>(TmfEvent.class);
- assertEquals("getRange", null, request.getRange());
- assertEquals("getIndex", 10, request.getIndex());
- assertEquals("getNbRequestedEvents", 100, request.getNbRequestedEvents());
+ assertEquals("getIndex", 0, request.getIndex());
+ assertEquals("getNbRequestedEvents", TmfDataRequest.ALL_DATA, request.getNbRequested());
assertEquals("getBlockize", TmfDataRequest.DEFAULT_BLOCK_SIZE, request.getBlockize());
}
- public void testTmfDataRequestIndexNbEventsBlocksize() {
- TmfDataRequest<TmfEvent> request = new TmfDataRequest<TmfEvent>(10, 100, 200);
-
- assertEquals("getRange", null, request.getRange());
- assertEquals("getIndex", 10, request.getIndex());
- assertEquals("getNbRequestedEvents", 100, request.getNbRequestedEvents());
- assertEquals("getBlockize", 200, request.getBlockize());
- }
+ public void testTmfDataRequestIndex() {
+ TmfDataRequest<TmfEvent> request = new TmfDataRequest<TmfEvent>(TmfEvent.class, 10);
- public void testTmfDataRequestTimeRange() {
- TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch);
- TmfDataRequest<TmfEvent> request = new TmfDataRequest<TmfEvent>(range);
-
- assertEquals("StartTime", TmfTimestamp.BigBang, request.getRange().getStartTime());
- assertEquals("EndTime", TmfTimestamp.BigCrunch, request.getRange().getEndTime());
- assertEquals("getIndex", 0, request.getIndex());
- assertEquals("getNbRequestedEvents", -1, request.getNbRequestedEvents());
+ assertEquals("getIndex", 10, request.getIndex());
+ assertEquals("getNbRequestedEvents", TmfDataRequest.ALL_DATA, request.getNbRequested());
assertEquals("getBlockize", TmfDataRequest.DEFAULT_BLOCK_SIZE, request.getBlockize());
}
- public void testTmfDataRequestTimeRangeNbEvents() {
- TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch);
- TmfDataRequest<TmfEvent> request = new TmfDataRequest<TmfEvent>(range, 10);
+ public void testTmfDataRequestIndexNbRequested() {
+ TmfDataRequest<TmfEvent> request = new TmfDataRequest<TmfEvent>(TmfEvent.class, 10, 100);
- assertEquals("StartTime", TmfTimestamp.BigBang, request.getRange().getStartTime());
- assertEquals("EndTime", TmfTimestamp.BigCrunch, request.getRange().getEndTime());
- assertEquals("getIndex", 0, request.getIndex());
- assertEquals("getNbRequestedEvents", 10, request.getNbRequestedEvents());
+ assertEquals("getIndex", 10, request.getIndex());
+ assertEquals("getNbRequestedEvents", 100, request.getNbRequested());
assertEquals("getBlockize", TmfDataRequest.DEFAULT_BLOCK_SIZE, request.getBlockize());
}
- public void testTmfDataRequestTimeRangeNbEventsBlockSize() {
- TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch);
- TmfDataRequest<TmfEvent> request = new TmfDataRequest<TmfEvent>(range, 10, 100);
+ public void testTmfDataRequestIndexNbEventsBlocksize() {
+ TmfDataRequest<TmfEvent> request = new TmfDataRequest<TmfEvent>(TmfEvent.class, 10, 100, 200);
- assertEquals("StartTime", TmfTimestamp.BigBang, request.getRange().getStartTime());
- assertEquals("EndTime", TmfTimestamp.BigCrunch, request.getRange().getEndTime());
- assertEquals("getIndex", 0, request.getIndex());
- assertEquals("getNbRequestedEvents", 10, request.getNbRequestedEvents());
- assertEquals("getBlockize", 100, request.getBlockize());
+ assertEquals("getIndex", 10, request.getIndex());
+ assertEquals("getNbRequestedEvents", 100, request.getNbRequested());
+ assertEquals("getBlockize", 200, request.getBlockize());
}
-}
+}
\ No newline at end of file
import junit.framework.TestCase;
import org.eclipse.linuxtools.tmf.event.TmfEvent;
-import org.eclipse.linuxtools.tmf.event.TmfEventReference;
-import org.eclipse.linuxtools.tmf.event.TmfEventSource;
-import org.eclipse.linuxtools.tmf.event.TmfEventType;
import org.eclipse.linuxtools.tmf.event.TmfTimeRange;
import org.eclipse.linuxtools.tmf.event.TmfTimestamp;
import org.eclipse.linuxtools.tmf.request.TmfDataRequest;
import org.eclipse.linuxtools.tmf.request.TmfEventRequest;
-import org.eclipse.linuxtools.tmf.request.TmfEventRequestStub;
/**
* <b><u>TmfEventRequestTest</u></b>
* <p>
- * Test suite for the TmfEventRequest class.
+ * TODO: Implement me. Please.
*/
public class TmfEventRequestTest extends TestCase {
- // ------------------------------------------------------------------------
- // Variables
- // ------------------------------------------------------------------------
-
- private static TmfTimeRange range1 = new TmfTimeRange(TmfTimeRange.Eternity);
- private static TmfTimeRange range2 = new TmfTimeRange(new TmfTimestamp(), TmfTimestamp.BigCrunch);
-
- private static TmfEventRequest<TmfEvent> fRequest1;
- private static TmfEventRequest<TmfEvent> fRequest1b;
- private static TmfEventRequest<TmfEvent> fRequest1c;
- private static TmfEventRequest<TmfEvent> fRequest2;
- private static TmfEventRequest<TmfEvent> fRequest3;
- private static TmfEventRequest<TmfEvent> fRequest4;
-
- private static int fRequestCount;
-
// ------------------------------------------------------------------------
// Housekeeping
// ------------------------------------------------------------------------
@Override
protected void setUp() throws Exception {
super.setUp();
- TmfDataRequest.reset();
- fRequest1 = new TmfEventRequestStub<TmfEvent>(TmfEvent.class, range1, 100, 200);
- fRequest2 = new TmfEventRequestStub<TmfEvent>(TmfEvent.class, range2, 100, 200);
- fRequest3 = new TmfEventRequestStub<TmfEvent>(TmfEvent.class, range2, 200, 200);
- fRequest4 = new TmfEventRequestStub<TmfEvent>(TmfEvent.class, range2, 200, 300);
- fRequest1b = new TmfEventRequestStub<TmfEvent>(TmfEvent.class, range1, 100, 200);
- fRequest1c = new TmfEventRequestStub<TmfEvent>(TmfEvent.class, range1, 100, 200);
- fRequestCount = fRequest1c.getRequestId() + 1;
}
@Override
super.tearDown();
}
- private TmfEventRequest<TmfEvent> setupTestRequest(final boolean[] flags) {
-
- TmfEventRequest<TmfEvent> request = new TmfEventRequestStub<TmfEvent>(TmfEvent.class, new TmfTimeRange(TmfTimeRange.Eternity), 100, 200) {
- @Override
- public void handleCompleted() {
- super.handleCompleted();
- flags[0] = true;
- }
- @Override
- public void handleSuccess() {
- super.handleSuccess();
- flags[1] = true;
- }
- @Override
- public void handleFailure() {
- super.handleFailure();
- flags[2] = true;
- }
- @Override
- public void handleCancel() {
- super.handleCancel();
- flags[3] = true;
- }
- };
- return request;
- }
-
// ------------------------------------------------------------------------
// Constructors
// ------------------------------------------------------------------------
- public void testTmfEventRequest() {
- TmfEventRequest<TmfEvent> request = new TmfEventRequestStub<TmfEvent>(TmfEvent.class);
-
- assertEquals("getRequestId", fRequestCount++, request.getRequestId());
- assertEquals("getDataType", TmfEvent.class, request.getDataType());
+ public void testTmfDataRequest() {
+ TmfEventRequest<TmfEvent> request = new TmfEventRequest<TmfEvent>(TmfEvent.class);
assertEquals("StartTime", TmfTimestamp.BigBang, request.getRange().getStartTime());
assertEquals("EndTime", TmfTimestamp.BigCrunch, request.getRange().getEndTime());
- assertEquals("getIndex", 0, request.getIndex());
+ assertEquals("getIndex", 0, request.getIndex());
assertEquals("getNbRequestedEvents", TmfDataRequest.ALL_DATA, request.getNbRequested());
assertEquals("getBlockize", TmfDataRequest.DEFAULT_BLOCK_SIZE, request.getBlockize());
-
- assertFalse("isCompleted", request.isCompleted());
- assertFalse("isFailed", request.isFailed());
- assertFalse("isCancelled", request.isCancelled());
-
- assertEquals("getNbRead", 0, request.getNbRead());
}
- public void testTmfEventRequestTimeRange() {
+ public void testTmfDataRequestTimeRange() {
TmfTimeRange range = new TmfTimeRange(new TmfTimestamp(), TmfTimestamp.BigCrunch);
- TmfEventRequest<TmfEvent> request = new TmfEventRequestStub<TmfEvent>(TmfEvent.class, range);
+ TmfEventRequest<TmfEvent> request = new TmfEventRequest<TmfEvent>(TmfEvent.class, range);
- assertEquals("getRequestId", fRequestCount++, request.getRequestId());
- assertEquals("getDataType", TmfEvent.class, request.getDataType());
-
- assertEquals("StartTime", new TmfTimestamp(), request.getRange().getStartTime());
- assertEquals("EndTime", TmfTimestamp.BigCrunch, request.getRange().getEndTime());
+ assertEquals("StartTime", range.getStartTime(), request.getRange().getStartTime());
+ assertEquals("EndTime", range.getEndTime(), request.getRange().getEndTime());
- assertEquals("getIndex", 0, request.getIndex());
+ assertEquals("getIndex", 0, request.getIndex());
assertEquals("getNbRequestedEvents", TmfDataRequest.ALL_DATA, request.getNbRequested());
assertEquals("getBlockize", TmfDataRequest.DEFAULT_BLOCK_SIZE, request.getBlockize());
-
- assertFalse("isCompleted", request.isCompleted());
- assertFalse("isFailed", request.isFailed());
- assertFalse("isCancelled", request.isCancelled());
-
- assertEquals("getNbRead", 0, request.getNbRead());
}
- public void testTmfEventRequestTimeRangeNbRequested() {
+ public void testTmfDataRequestTimeRangeNbRequested() {
TmfTimeRange range = new TmfTimeRange(new TmfTimestamp(), TmfTimestamp.BigCrunch);
- TmfEventRequest<TmfEvent> request = new TmfEventRequestStub<TmfEvent>(TmfEvent.class, range, 100);
+ TmfEventRequest<TmfEvent> request = new TmfEventRequest<TmfEvent>(TmfEvent.class, range, 100);
- assertEquals("getRequestId", fRequestCount++, request.getRequestId());
- assertEquals("getDataType", TmfEvent.class, request.getDataType());
+ assertEquals("StartTime", range.getStartTime(), request.getRange().getStartTime());
+ assertEquals("EndTime", range.getEndTime(), request.getRange().getEndTime());
- assertEquals("StartTime", new TmfTimestamp(), request.getRange().getStartTime());
- assertEquals("EndTime", TmfTimestamp.BigCrunch, request.getRange().getEndTime());
-
- assertEquals("getIndex", 0, request.getIndex());
+ assertEquals("getIndex", 0, request.getIndex());
assertEquals("getNbRequestedEvents", 100, request.getNbRequested());
assertEquals("getBlockize", TmfDataRequest.DEFAULT_BLOCK_SIZE, request.getBlockize());
-
- assertFalse("isCompleted", request.isCompleted());
- assertFalse("isFailed", request.isFailed());
- assertFalse("isCancelled", request.isCancelled());
-
- assertEquals("getNbRead", 0, request.getNbRead());
}
- public void testTmfEventRequestTimeRangeNbRequestedBlocksize() {
+ public void testTmfDataRequestTimeRangeNbRequestedBlocksize() {
TmfTimeRange range = new TmfTimeRange(new TmfTimestamp(), TmfTimestamp.BigCrunch);
- TmfEventRequest<TmfEvent> request = new TmfEventRequestStub<TmfEvent>(TmfEvent.class, range, 100, 200);
-
- assertEquals("getRequestId", fRequestCount++, request.getRequestId());
- assertEquals("getDataType", TmfEvent.class, request.getDataType());
+ TmfEventRequest<TmfEvent> request = new TmfEventRequest<TmfEvent>(TmfEvent.class, range, 100, 200);
- assertEquals("StartTime", new TmfTimestamp(), request.getRange().getStartTime());
- assertEquals("EndTime", TmfTimestamp.BigCrunch, request.getRange().getEndTime());
+ assertEquals("StartTime", range.getStartTime(), request.getRange().getStartTime());
+ assertEquals("EndTime", range.getEndTime(), request.getRange().getEndTime());
- assertEquals("getIndex", 0, request.getIndex());
+ assertEquals("getIndex", 0, request.getIndex());
assertEquals("getNbRequestedEvents", 100, request.getNbRequested());
- assertEquals("getBlockize", 200, request.getBlockize());
-
- assertFalse("isCompleted", request.isCompleted());
- assertFalse("isFailed", request.isFailed());
- assertFalse("isCancelled", request.isCancelled());
-
- assertEquals("getNbRead", 0, request.getNbRead());
- }
-
- // ------------------------------------------------------------------------
- // equals
- // ------------------------------------------------------------------------
-
- public void testEqualsReflexivity() throws Exception {
- assertTrue("equals", fRequest1.equals(fRequest1));
- assertTrue("equals", fRequest2.equals(fRequest2));
-
- assertFalse("equals", fRequest1.equals(fRequest2));
- assertFalse("equals", fRequest2.equals(fRequest1));
- }
-
- public void testEqualsSymmetry() throws Exception {
- assertTrue("equals", fRequest1.equals(fRequest1b));
- assertTrue("equals", fRequest1b.equals(fRequest1));
-
- assertFalse("equals", fRequest1.equals(fRequest3));
- assertFalse("equals", fRequest2.equals(fRequest3));
- assertFalse("equals", fRequest3.equals(fRequest1));
- assertFalse("equals", fRequest3.equals(fRequest2));
- }
-
- public void testEqualsTransivity() throws Exception {
- assertTrue("equals", fRequest1.equals(fRequest1b));
- assertTrue("equals", fRequest1b.equals(fRequest1c));
- assertTrue("equals", fRequest1.equals(fRequest1c));
- }
-
- public void testEqualsNull() throws Exception {
- assertFalse("equals", fRequest1.equals(null));
- assertFalse("equals", fRequest2.equals(null));
- }
-
- // ------------------------------------------------------------------------
- // hashCode
- // ------------------------------------------------------------------------
-
- public void testHashCode() throws Exception {
- assertTrue("hashCode", fRequest1.hashCode() == fRequest1.hashCode());
- assertTrue("hashCode", fRequest2.hashCode() == fRequest2.hashCode());
- assertTrue("hashCode", fRequest1.hashCode() != fRequest2.hashCode());
- }
-
- // ------------------------------------------------------------------------
- // toString
- // ------------------------------------------------------------------------
-
- public void testToString() {
- String expected1 = "[TmfEventRequest(0,TmfEvent," + range1 + ",100,200)]";
- String expected2 = "[TmfEventRequest(1,TmfEvent," + range2 + ",100,200)]";
- String expected3 = "[TmfEventRequest(2,TmfEvent," + range2 + ",200,200)]";
- String expected4 = "[TmfEventRequest(3,TmfEvent," + range2 + ",200,300)]";
-
- assertEquals("toString", expected1, fRequest1.toString());
- assertEquals("toString", expected2, fRequest2.toString());
- assertEquals("toString", expected3, fRequest3.toString());
- assertEquals("toString", expected4, fRequest4.toString());
- }
-
- // ------------------------------------------------------------------------
- // setData/getData
- // ------------------------------------------------------------------------
-
- public void testSetData() {
- // Initialize the data
- int nbEvents = 10;
- TmfEvent[] events = new TmfEvent[nbEvents];
- for (int i = 0; i < nbEvents; i++) {
- events[i] = new TmfEvent(new TmfTimestamp(i), new TmfEventSource(),
- new TmfEventType(), new TmfEventReference());
- }
-
- fRequest1.setData(events);
- assertEquals("setData", nbEvents, fRequest1.getNbRead());
-
- TmfEvent[] eventsRead = fRequest1.getData();
- assertEquals("getData", nbEvents, eventsRead.length);
-
- for (int i = 0; i < nbEvents; i++) {
- assertEquals("getData", i, eventsRead[i].getTimestamp().getValue());
- }
- }
-
- // ------------------------------------------------------------------------
- // done
- // ------------------------------------------------------------------------
-
- public void testDone() {
-
- final boolean[] flags = new boolean[4];
- TmfEventRequest<TmfEvent> request = setupTestRequest(flags);
- request.done();
-
- assertTrue ("isCompleted", request.isCompleted());
- assertFalse("isFailed", request.isFailed());
- assertFalse("isCancelled", request.isCancelled());
-
- assertTrue ("handleCompleted", flags[0]);
- assertTrue ("handleSuccess", flags[1]);
- assertFalse("handleFailure", flags[2]);
- assertFalse("handleCancel", flags[3]);
+ assertEquals("getBlockize", 200, request.getBlockize());
}
- // ------------------------------------------------------------------------
- // fail
- // ------------------------------------------------------------------------
-
- public void testFail() {
-
- final boolean[] flags = new boolean[4];
- TmfEventRequest<TmfEvent> request = setupTestRequest(flags);
- request.fail();
-
- assertTrue ("isCompleted", request.isCompleted());
- assertTrue ("isFailed", request.isFailed());
- assertFalse("isCancelled", request.isCancelled());
-
- assertTrue ("handleCompleted", flags[0]);
- assertFalse("handleSuccess", flags[1]);
- assertTrue ("handleFailure", flags[2]);
- assertFalse("handleCancel", flags[3]);
- }
-
- // ------------------------------------------------------------------------
- // cancel
- // ------------------------------------------------------------------------
-
- public void testCancel() {
-
- final boolean[] flags = new boolean[4];
- TmfEventRequest<TmfEvent> request = setupTestRequest(flags);
- request.cancel();
-
- assertTrue ("isCompleted", request.isCompleted());
- assertFalse("isFailed", request.isFailed());
- assertTrue ("isCancelled", request.isCancelled());
-
- assertTrue ("handleCompleted", flags[0]);
- assertFalse("handleSuccess", flags[1]);
- assertFalse("handleFailure", flags[2]);
- assertTrue ("handleCancel", flags[3]);
- }
-
- // ------------------------------------------------------------------------
- // waitForCompletion
- // ------------------------------------------------------------------------
-
}
\ No newline at end of file
TestSuite suite = new TestSuite("Test suite for " + TmfCorePlugin.PLUGIN_ID + ".trace"); //$NON-NLS-1$);
//$JUnit-BEGIN$
suite.addTestSuite(TmfTraceTest.class);
-// suite.addTestSuite(TmfExperimentTest.class);
+ suite.addTestSuite(TmfExperimentTest.class);
//$JUnit-END$
return suite;
}
-}
+}
\ No newline at end of file
/*******************************************************************************
- * Copyright (c) 2009 Ericsson
+ * Copyright (c) 2009, 2010 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v1.0 which
package org.eclipse.linuxtools.tmf.tests.trace;
import java.io.File;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.net.URL;
import java.util.Vector;
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.Path;
import org.eclipse.linuxtools.tmf.event.TmfEvent;
import org.eclipse.linuxtools.tmf.event.TmfTimeRange;
import org.eclipse.linuxtools.tmf.event.TmfTimestamp;
-import org.eclipse.linuxtools.tmf.request.TmfDataRequest;
+import org.eclipse.linuxtools.tmf.experiment.TmfExperiment;
+import org.eclipse.linuxtools.tmf.request.TmfEventRequest;
+import org.eclipse.linuxtools.tmf.tests.TmfCoreTestPlugin;
import org.eclipse.linuxtools.tmf.trace.ITmfTrace;
-import org.eclipse.linuxtools.tmf.trace.TmfExperiment;
import org.eclipse.linuxtools.tmf.trace.TmfTraceStub;
-import junit.framework.TestCase;
-
/**
* <b><u>TmfExperimentTest</u></b>
* <p>
private static final String DIRECTORY = "testfiles";
private static final String TEST_STREAM = "M-Test-10K";
private static final String EXPERIMENT = "MyExperiment";
- private static String testfile;
- private static int NB_EVENTS = 10000;
- private static int fDefaultBlockSize = 1000;
+ private static int NB_EVENTS = 10000;
+ private static int fDefaultBlockSize = 1000;
- private static ITmfTrace fStream;
- private static TmfExperiment fExperiment;
+ private static ITmfTrace fTrace;
+ private static TmfExperiment<TmfEvent> fExperiment;
- // ========================================================================
+ // ------------------------------------------------------------------------
// Housekeeping
- // ========================================================================
+ // ------------------------------------------------------------------------
+
+ private ITmfTrace setupTrace(String path) {
+ if (fTrace == null) {
+ try {
+ URL location = FileLocator.find(TmfCoreTestPlugin.getPlugin().getBundle(), new Path(path), null);
+ File test = new File(FileLocator.toFileURL(location).toURI());
+ TmfTraceStub trace = new TmfTraceStub(test.getPath(), true);
+ fTrace = trace;
+ } catch (URISyntaxException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ return fTrace;
+ }
+
+ private void setupExperiment() {
+ if (fExperiment == null) {
+ fExperiment = new TmfExperiment<TmfEvent>(TmfEvent.class, EXPERIMENT, new ITmfTrace[] { fTrace });
+ fExperiment.indexExperiment(true);
+ }
+ }
public TmfExperimentTest(String name) throws Exception {
super(name);
- String directory = new File(".").getCanonicalPath() + File.separator + DIRECTORY;
- testfile = directory + File.separator + TEST_STREAM;
-
- fStream = new TmfTraceStub(testfile);
- fExperiment = new TmfExperiment(EXPERIMENT, new ITmfTrace[] { fStream }, true);
}
@Override
protected void setUp() throws Exception {
super.setUp();
+ setupTrace(DIRECTORY + File.separator + TEST_STREAM);
+ setupExperiment();
}
@Override
super.tearDown();
}
- // ========================================================================
+ // ------------------------------------------------------------------------
// Constructor
- // ========================================================================
+ // ------------------------------------------------------------------------
public void testBasicTmfTrace() {
assertEquals("GetId", EXPERIMENT, fExperiment.getExperimentId());
- assertEquals("GetEpoch", TmfTimestamp.BigBang, fExperiment.getEpoch());
+ assertEquals("GetEpoch", TmfTimestamp.Zero, fExperiment.getEpoch());
assertEquals("GetNbEvents", NB_EVENTS, fExperiment.getNbEvents());
TmfTimeRange timeRange = fExperiment.getTimeRange();
- assertEquals("GetTimeRange-start", 1, timeRange.getStartTime().getValue());
- assertEquals("GetTimeRange-end", NB_EVENTS, timeRange.getEndTime().getValue());
+ assertEquals("getStartTime", 1, timeRange.getStartTime().getValue());
+ assertEquals("getEndTime", NB_EVENTS, timeRange.getEndTime().getValue());
}
- // ========================================================================
+ // ------------------------------------------------------------------------
// processRequest
- // ========================================================================
+ // ------------------------------------------------------------------------
public void testProcessRequestForNbEvents() throws Exception {
final int blockSize = 100;
- final int nbEvents = 1000;
+ final int nbEvents = 1000;
final Vector<TmfEvent> requestedEvents = new Vector<TmfEvent>();
TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch);
- final TmfDataRequest<TmfEvent> request = new TmfDataRequest<TmfEvent>(range, nbEvents, blockSize) {
+ final TmfEventRequest<TmfEvent> request = new TmfEventRequest<TmfEvent>(TmfEvent.class, range, nbEvents, blockSize) {
@Override
public void handleData() {
TmfEvent[] events = getData();
final Vector<TmfEvent> requestedEvents = new Vector<TmfEvent>();
TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch);
- final TmfDataRequest<TmfEvent> request = new TmfDataRequest<TmfEvent>(range, nbEvents, blockSize) {
+ final TmfEventRequest<TmfEvent> request = new TmfEventRequest<TmfEvent>(TmfEvent.class, range, nbEvents, blockSize) {
@Override
public void handleData() {
TmfEvent[] events = getData();
}
public void testProcessRequestForAllEvents() throws Exception {
- final int nbEvents = -1;
+ final int nbEvents = TmfEventRequest.ALL_DATA;
final int blockSize = 1;
final Vector<TmfEvent> requestedEvents = new Vector<TmfEvent>();
int nbExpectedEvents = fExperiment.getNbEvents();
TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch);
- final TmfDataRequest<TmfEvent> request = new TmfDataRequest<TmfEvent>(range, nbEvents, blockSize) {
+ final TmfEventRequest<TmfEvent> request = new TmfEventRequest<TmfEvent>(TmfEvent.class, range, nbEvents, blockSize) {
@Override
public void handleData() {
TmfEvent[] events = getData();
}
}
- // ========================================================================
+ // ------------------------------------------------------------------------
// cancel
- // ========================================================================
+ // ------------------------------------------------------------------------
public void testCancel() throws Exception {
final int nbEvents = NB_EVENTS;
final Vector<TmfEvent> requestedEvents = new Vector<TmfEvent>();
TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch);
- final TmfDataRequest<TmfEvent> request = new TmfDataRequest<TmfEvent>(range, nbEvents, blockSize) {
+ final TmfEventRequest<TmfEvent> request = new TmfEventRequest<TmfEvent>(TmfEvent.class, range, nbEvents, blockSize) {
@Override
public void handleData() {
TmfEvent[] events = getData();
assertTrue("isCompleted", request.isCompleted());
assertTrue("isCancelled", request.isCancelled());
}
-}
+
+ // ------------------------------------------------------------------------
+ // getRank
+ // ------------------------------------------------------------------------
+
+ public void testGetRank() throws Exception {
+ assertEquals("getRank", 0, fExperiment.getRank(new TmfTimestamp()));
+ assertEquals("getRank", 0, fExperiment.getRank(new TmfTimestamp( 1, (byte) -3)));
+ assertEquals("getRank", 10, fExperiment.getRank(new TmfTimestamp( 11, (byte) -3)));
+ assertEquals("getRank", 100, fExperiment.getRank(new TmfTimestamp( 101, (byte) -3)));
+ assertEquals("getRank", 1000, fExperiment.getRank(new TmfTimestamp(1001, (byte) -3)));
+ }
+
+}
\ No newline at end of file
/*******************************************************************************
- * Copyright (c) 2009 Ericsson
+ * Copyright (c) 2009, 2010 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v1.0 which
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.Path;
+import org.eclipse.linuxtools.tmf.component.TmfProvider;
+import org.eclipse.linuxtools.tmf.component.TmfProviderManager;
import org.eclipse.linuxtools.tmf.event.TmfEvent;
import org.eclipse.linuxtools.tmf.event.TmfTimeRange;
import org.eclipse.linuxtools.tmf.event.TmfTimestamp;
-import org.eclipse.linuxtools.tmf.request.TmfDataRequest;
+import org.eclipse.linuxtools.tmf.request.TmfEventRequest;
import org.eclipse.linuxtools.tmf.tests.TmfCoreTestPlugin;
import org.eclipse.linuxtools.tmf.trace.TmfTraceContext;
import org.eclipse.linuxtools.tmf.trace.TmfTraceStub;
private static final String DIRECTORY = "testfiles";
private static final String TEST_STREAM = "M-Test-10K";
- private static final int NB_EVENTS = 10000;
- private static TmfTraceStub fTrace = null;
+ private static final int NB_EVENTS = 10000;
+ private static TmfTraceStub fTrace = null;
private static byte SCALE = (byte) -3;
- // ========================================================================
+ // ------------------------------------------------------------------------
// Housekeeping
- // ========================================================================
+ // ------------------------------------------------------------------------
private TmfTraceStub setupTrace(String path) {
if (fTrace == null) {
super.tearDown();
}
- // ========================================================================
+ // ------------------------------------------------------------------------
// Constructors
- // ========================================================================
+ // ------------------------------------------------------------------------
public void testTmfTraceDefault() throws Exception {
TmfTraceStub trace = null;
} catch (IOException e) {
e.printStackTrace();
}
- assertTrue("Oen Trace", trace != null);
-
+ assertTrue("Opened trace", trace != null);
assertEquals("getCacheSize", TmfTraceStub.DEFAULT_CACHE_SIZE, trace.getCacheSize());
- assertEquals("getTraceSize", 0, trace.getNbEvents());
- assertEquals("getRange-start", 0, trace.getTimeRange().getStartTime().getValue());
- assertEquals("getRange-end", 0, trace.getTimeRange().getEndTime().getValue());
+ assertEquals("getTraceSize", NB_EVENTS, trace.getNbEvents());
}
public void testTmfTrace() throws Exception {
- assertEquals("getCacheSize", 500, fTrace.getCacheSize());
- assertEquals("getTraceSize", 0, fTrace.getNbEvents());
- assertEquals("getRange-start", 0, fTrace.getTimeRange().getStartTime().getValue());
- assertEquals("getRange-end", 0, fTrace.getTimeRange().getEndTime().getValue());
+ assertEquals("getCacheSize", 500, fTrace.getCacheSize());
+ assertEquals("getTraceSize", NB_EVENTS, fTrace.getNbEvents());
+ assertEquals("getRange-start", 1, fTrace.getTimeRange().getStartTime().getValue());
+ assertEquals("getRange-end", NB_EVENTS, fTrace.getTimeRange().getEndTime().getValue());
}
- // ========================================================================
+ // ------------------------------------------------------------------------
// seek
- // ========================================================================
+ // ------------------------------------------------------------------------
public void testSeekOnCacheBoundary() throws Exception {
TmfTraceContext context = fTrace.seekLocation(null);
- context = fTrace.seekEvent(new TmfTimestamp(0, SCALE, 0));
+ context = fTrace.seekEvent(new TmfTimestamp(1, SCALE, 0));
TmfEvent event = fTrace.getNextEvent(context);
assertEquals("Event timestamp", 1, event.getTimestamp().getValue());
+ assertEquals("Event rank", 1, context.getRank());
- context = fTrace.seekEvent(new TmfTimestamp(1000, SCALE, 0));
+ context = fTrace.seekEvent(new TmfTimestamp(1001, SCALE, 0));
event = fTrace.getNextEvent(context);
- assertEquals("Event timestamp", 1000, event.getTimestamp().getValue());
+ assertEquals("Event timestamp", 1001, event.getTimestamp().getValue());
+ assertEquals("Event rank", 1001, context.getRank());
- context = fTrace.seekEvent(new TmfTimestamp(4000, SCALE, 0));
+ context = fTrace.seekEvent(new TmfTimestamp(4001, SCALE, 0));
event = fTrace.getNextEvent(context);
- assertEquals("Event timestamp", 4000, event.getTimestamp().getValue());
+ assertEquals("Event timestamp", 4001, event.getTimestamp().getValue());
+ assertEquals("Event rank", 4001, context.getRank());
}
public void testSeekNotOnCacheBoundary() throws Exception {
TmfTraceContext context = fTrace.seekLocation(null);
- context = fTrace.seekEvent(new TmfTimestamp(1, SCALE, 0));
+ context = fTrace.seekEvent(new TmfTimestamp(10, SCALE, 0));
TmfEvent event = fTrace.getNextEvent(context);
- assertEquals("Event timestamp", 1, event.getTimestamp().getValue());
+ assertEquals("Event timestamp", 10, event.getTimestamp().getValue());
+ assertEquals("Event rank", 10, context.getRank());
context = fTrace.seekEvent(new TmfTimestamp(999, SCALE, 0));
event = fTrace.getNextEvent(context);
assertEquals("Event timestamp", 999, event.getTimestamp().getValue());
+ assertEquals("Event rank", 999, context.getRank());
+
+ context = fTrace.seekEvent(new TmfTimestamp(1001, SCALE, 0));
+ event = fTrace.getNextEvent(context);
+ assertEquals("Event timestamp", 1001, event.getTimestamp().getValue());
+ assertEquals("Event rank", 1001, context.getRank());
context = fTrace.seekEvent(new TmfTimestamp(4499, SCALE, 0));
event = fTrace.getNextEvent(context);
assertEquals("Event timestamp", 4499, event.getTimestamp().getValue());
+ assertEquals("Event rank", 4499, context.getRank());
}
public void testSeekForEventOutOfBounds() throws Exception {
assertEquals("Event timestamp", null, event);
}
- // ========================================================================
+ public void testSeekOnIndex() throws Exception {
+ TmfTraceContext context = fTrace.seekLocation(null);
+
+ // On lower bound, returns the first event (ts = 1)
+ context = fTrace.seekEvent(0);
+ TmfEvent event = fTrace.getNextEvent(context);
+ assertEquals("Event timestamp", 1, event.getTimestamp().getValue());
+
+ // On higher bound
+ context = fTrace.seekEvent(NB_EVENTS - 1);
+ event = fTrace.getNextEvent(context);
+ assertEquals("Event timestamp", NB_EVENTS, event.getTimestamp().getValue());
+
+ // Above high bound
+ context = fTrace.seekEvent(NB_EVENTS);
+ event = fTrace.getNextEvent(context);
+ assertEquals("Event", null, event);
+ }
+
+ // ------------------------------------------------------------------------
// getNextEvent
- // ========================================================================
+ // ------------------------------------------------------------------------
public void testGetNextEvent() throws Exception {
TmfTraceContext context = fTrace.seekLocation(null);
}
}
- // ========================================================================
+ // ------------------------------------------------------------------------
// processRequest
- // ========================================================================
+ // ------------------------------------------------------------------------
- public void testProcessRequestForNbEvents() throws Exception {
+ @SuppressWarnings("unchecked")
+ public void testProcessRequestForNbEvents() throws Exception {
final int BLOCK_SIZE = 100;
final int NB_EVENTS = 1000;
final Vector<TmfEvent> requestedEvents = new Vector<TmfEvent>();
TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch);
- final TmfDataRequest<TmfEvent> request = new TmfDataRequest<TmfEvent>(range, NB_EVENTS, BLOCK_SIZE) {
+ final TmfEventRequest<TmfEvent> request = new TmfEventRequest<TmfEvent>(TmfEvent.class, range, NB_EVENTS, BLOCK_SIZE) {
@Override
public void handleData() {
TmfEvent[] events = getData();
}
}
};
- fTrace.processRequest(request, true);
+ TmfProvider<TmfEvent>[] providers = (TmfProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TmfTraceStub.class);
+ providers[0].processRequest(request, true);
assertEquals("nbEvents", NB_EVENTS, requestedEvents.size());
assertTrue("isCompleted", request.isCompleted());
}
}
- public void testProcessRequestForAllEvents() throws Exception {
+ @SuppressWarnings("unchecked")
+ public void testProcessRequestForAllEvents() throws Exception {
final int BLOCK_SIZE = 1;
final Vector<TmfEvent> requestedEvents = new Vector<TmfEvent>();
// long nbExpectedEvents = NB_EVENTS;
TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch);
- final TmfDataRequest<TmfEvent> request = new TmfDataRequest<TmfEvent>(range, NB_EVENTS, BLOCK_SIZE) {
+ final TmfEventRequest<TmfEvent> request = new TmfEventRequest<TmfEvent>(TmfEvent.class, range, NB_EVENTS, BLOCK_SIZE) {
@Override
public void handleData() {
TmfEvent[] events = getData();
}
}
};
- fTrace.processRequest(request, true);
+ TmfProvider<TmfEvent>[] providers = (TmfProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TmfTraceStub.class);
+ providers[0].processRequest(request, true);
assertEquals("nbEvents", NB_EVENTS, requestedEvents.size());
assertTrue("isCompleted", request.isCompleted());
}
}
- // ========================================================================
+ // ------------------------------------------------------------------------
// cancel
- // ========================================================================
+ // ------------------------------------------------------------------------
- public void testCancel() throws Exception {
+ @SuppressWarnings("unchecked")
+ public void testCancel() throws Exception {
final Vector<TmfEvent> requestedEvents = new Vector<TmfEvent>();
TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch);
- final TmfDataRequest<TmfEvent> request = new TmfDataRequest<TmfEvent>(range, NB_EVENTS, NB_EVENTS) {
+ final TmfEventRequest<TmfEvent> request = new TmfEventRequest<TmfEvent>(TmfEvent.class, range, NB_EVENTS, NB_EVENTS) {
@Override
public void handleData() {
TmfEvent[] events = getData();
cancel();
}
};
- fTrace.processRequest(request, true);
+ TmfProvider<TmfEvent>[] providers = (TmfProvider<TmfEvent>[]) TmfProviderManager.getProviders(TmfEvent.class, TmfTraceStub.class);
+ providers[0].processRequest(request, true);
assertEquals("nbEvents", NB_EVENTS, requestedEvents.size());
assertTrue("isCompleted", request.isCompleted());
assertTrue("isCancelled", request.isCancelled());
}
-}
+
+}
\ No newline at end of file
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Ericsson
+ *
+ * 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Francois Chouinard - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.tmf.component;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.net.URL;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.linuxtools.tmf.event.TmfEvent;
+import org.eclipse.linuxtools.tmf.event.TmfTimestamp;
+import org.eclipse.linuxtools.tmf.request.TmfDataRequest;
+import org.eclipse.linuxtools.tmf.request.TmfEventRequest;
+import org.eclipse.linuxtools.tmf.tests.TmfCoreTestPlugin;
+import org.eclipse.linuxtools.tmf.trace.TmfTraceContext;
+import org.eclipse.linuxtools.tmf.trace.TmfTraceStub;
+
+/**
+ * <b><u>TmfProviderStub</u></b>
+ * <p>
+ * TODO: Implement me. Please.
+ */
+public class TmfProviderStub extends TmfProvider<TmfEvent> {
+
+ private TmfTraceStub fTrace;
+
+ public TmfProviderStub(String path) throws IOException {
+ super(TmfEvent.class);
+ URL location = FileLocator.find(TmfCoreTestPlugin.getPlugin().getBundle(), new Path(path), null);
+ try {
+ File test = new File(FileLocator.toFileURL(location).toURI());
+ fTrace = new TmfTraceStub(test.getPath(), true);
+ } catch (URISyntaxException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public ITmfContext setContext(TmfDataRequest<TmfEvent> request) {
+ if (request instanceof TmfEventRequest<?>) {
+ TmfTraceContext context = fTrace.seekEvent(((TmfEventRequest<?>) request).getRange().getStartTime());
+ return context;
+ }
+ return null;
+ }
+
+ @Override
+ public TmfEvent getNext(ITmfContext context) {
+ return fTrace.getNext(context);
+ }
+
+ @Override
+ public boolean isCompleted(TmfDataRequest<TmfEvent> request, TmfEvent event) {
+ TmfTimestamp endTime = ((TmfEventRequest<?>) request).getRange().getEndTime();
+ return event.getTimestamp().compareTo(endTime, false) <= 0;
+ }
+
+}
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2009 Ericsson
- *
- * 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Francois Chouinard - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.tmf.request;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Vector;
-
-import org.eclipse.linuxtools.tmf.event.TmfEvent;
-import org.eclipse.linuxtools.tmf.event.TmfTimestamp;
-import org.eclipse.linuxtools.tmf.trace.TmfTraceContext;
-import org.eclipse.linuxtools.tmf.trace.TmfTraceStub;
-
-/**
- * <b><u>TmfRequestHandlerStub</u></b>
- * <p>
- * TODO: Implement me. Please.
- */
-public class TmfRequestHandlerStub implements ITmfRequestHandler<TmfEvent> {
-
- // The test file
- private static final String TEST_STREAM = "M-Test-100K";
-
- // A constant to limit the number of events for the tests
- public static final int MAX_GENERATED_EVENTS = 1000;
-
- private TmfTraceStub fTrace;
-
- public TmfRequestHandlerStub() throws IOException {
- String directory = new File(".").getCanonicalPath() + File.separator + "testfiles";
- String filename = directory + File.separator + TEST_STREAM;
- fTrace = new TmfTraceStub(filename);
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.linuxtools.tmf.eventlog.ITmfRequestHandler#processRequest(org.eclipse.linuxtools.tmf.eventlog.TmfEventRequest, boolean)
- */
- public void processRequest(final TmfDataRequest<TmfEvent> request, boolean waitForCompletion) {
-
- Thread thread = new Thread() {
- @Override
- public void run() {
- TmfTimestamp startTime = request.getRange().getStartTime();
- TmfTimestamp endTime = request.getRange().getEndTime();
- int blockSize = request.getBlockize();
-
- int nbRequestedEvents = request.getNbRequestedEvents();
- if (nbRequestedEvents <= 0) {
- nbRequestedEvents = MAX_GENERATED_EVENTS;
- }
-
- Vector<TmfEvent> events = new Vector<TmfEvent>();
- int nbEvents = 0;
- TmfTraceContext context = fTrace.seekEvent(startTime);
- TmfEvent event = fTrace.getNextEvent(context);
- while (!request.isCancelled() && nbEvents < nbRequestedEvents &&
- event != null && event.getTimestamp().compareTo(endTime, false) <= 0 )
- {
- events.add(event);
- if (++nbEvents % blockSize == 0) {
- TmfEvent[] result = new TmfEvent[events.size()];
- events.toArray(result);
- request.setData(result);
- request.handleData();
- events.removeAllElements();
- }
- event = fTrace.getNextEvent(context);
- }
- TmfEvent[] result = new TmfEvent[events.size()];
- events.toArray(result);
-
- request.setData(result);
- request.handleData();
- request.done();
- }
- };
- thread.start();
-
- if (waitForCompletion) {
- request.waitForCompletion();
- }
- }
-
-}
import org.eclipse.linuxtools.tmf.event.TmfEventSource;
import org.eclipse.linuxtools.tmf.event.TmfEventType;
import org.eclipse.linuxtools.tmf.event.TmfTimestamp;
+import org.eclipse.linuxtools.tmf.parser.ITmfEventParser;
/**
* <b><u>TmfEventParserStub</u></b>
*/
public class TmfEventParserStub implements ITmfEventParser {
- // ========================================================================
+ // ------------------------------------------------------------------------
// Attributes
- // ========================================================================
+ // ------------------------------------------------------------------------
private final int NB_TYPES = 10;
private final TmfEventType[] fTypes;
- // ========================================================================
+ // ------------------------------------------------------------------------
// Constructors
- // ========================================================================
+ // ------------------------------------------------------------------------
public TmfEventParserStub() {
fTypes = new TmfEventType[NB_TYPES];
}
}
- // ========================================================================
+ // ------------------------------------------------------------------------
// Operators
- // ========================================================================
+ // ------------------------------------------------------------------------
static final String typePrefix = "Type-";
public TmfEvent parseNextEvent(ITmfTrace eventStream, TmfTraceContext context) throws IOException {
fields[i] = stream.readUTF();
}
- // Update the context
- context.setLocation(stream.getFilePointer());
- context.incrIndex();
-
String content = "[";
if (typeIndex > 0) {
content += fields[0];
return null;
}
-}
+}
\ No newline at end of file
/*******************************************************************************
- * Copyright (c) 2009 Ericsson
+ * Copyright (c) 2009, 2010 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v1.0 which
import java.io.RandomAccessFile;
import org.eclipse.linuxtools.tmf.event.TmfEvent;
+import org.eclipse.linuxtools.tmf.parser.ITmfEventParser;
/**
* <b><u>TmfTraceStub</u></b>
* <p>
* Dummy test trace. Use in conjunction with TmfEventParserStub.
*/
-public class TmfTraceStub extends TmfTrace {
+public class TmfTraceStub extends TmfTrace<TmfEvent> {
- // ========================================================================
+ // ------------------------------------------------------------------------
// Attributes
- // ========================================================================
+ // ------------------------------------------------------------------------
// The actual stream
private final RandomAccessFile fTrace;
// The associated event parser
private final ITmfEventParser fParser;
- // ========================================================================
+ // ------------------------------------------------------------------------
// Constructors
- // ========================================================================
+ // ------------------------------------------------------------------------
/**
* @param filename
/**
* @param filename
+ * @param cacheSize
* @throws FileNotFoundException
*/
- public TmfTraceStub(String filename, boolean waitForCompletion) throws FileNotFoundException {
- this(filename, DEFAULT_CACHE_SIZE, waitForCompletion);
+ public TmfTraceStub(String filename, int cacheSize) throws FileNotFoundException {
+ this(filename, cacheSize, false);
}
/**
* @param filename
- * @param cacheSize
* @throws FileNotFoundException
*/
- public TmfTraceStub(String filename, int cacheSize) throws FileNotFoundException {
- this(filename, cacheSize, false);
+ public TmfTraceStub(String filename, boolean waitForCompletion) throws FileNotFoundException {
+ this(filename, DEFAULT_CACHE_SIZE, waitForCompletion);
}
/**
* @throws FileNotFoundException
*/
public TmfTraceStub(String filename, int cacheSize, boolean waitForCompletion) throws FileNotFoundException {
- super(filename, cacheSize, waitForCompletion);
+ super(TmfEvent.class, filename, cacheSize);
fTrace = new RandomAccessFile(filename, "r");
fParser = new TmfEventParserStub();
- indexStream();
+ indexTrace(waitForCompletion);
}
- // ========================================================================
+ // ------------------------------------------------------------------------
// Accessors
- // ========================================================================
+ // ------------------------------------------------------------------------
public RandomAccessFile getStream() {
return fTrace;
}
- // ========================================================================
+ // ------------------------------------------------------------------------
// Operators
- // ========================================================================
+ // ------------------------------------------------------------------------
/* (non-Javadoc)
* @see org.eclipse.linuxtools.tmf.eventlog.ITmfStreamLocator#seekLocation(java.lang.Object)
*/
public TmfTraceContext seekLocation(Object location) {
- TmfTraceContext context = null;
try {
synchronized(fTrace) {
+ // Position the trace, read the event (to obtain its timestamp)
+ // and then re-position the trace (not great...)
fTrace.seek((location != null) ? (Long) location : 0);
- context = new TmfTraceContext(getCurrentLocation(), null, 0);
+ TmfTraceContext context = new TmfTraceContext(getCurrentLocation());
+ return context;
}
} catch (IOException e) {
- // TODO Auto-generated catch block
e.printStackTrace();
}
- return context;
+ return null;
}
/* (non-Javadoc)
try {
// paserNextEvent updates the context
TmfEvent event = fParser.parseNextEvent(this, context);
- if (event != null) {
- context.setTimestamp(event.getTimestamp());
- }
return event;
}
catch (IOException e) {
return null;
}
- // ========================================================================
- // Helper functions
- // ========================================================================
-
-}
+}
\ No newline at end of file
package org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.widgets;\r
\r
import java.util.ArrayList;\r
-import java.util.Arrays;\r
import java.util.HashMap;\r
import java.util.Iterator;\r
import java.util.List;\r
/*******************************************************************************
- * Copyright (c) 2009 Ericsson
+ * Copyright (c) 2009, 2010 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v1.0 which
import org.eclipse.linuxtools.tmf.event.TmfEvent;
import org.eclipse.linuxtools.tmf.event.TmfTimestamp;
+import org.eclipse.linuxtools.tmf.experiment.TmfExperiment;
+import org.eclipse.linuxtools.tmf.experiment.TmfExperimentSelectedSignal;
+import org.eclipse.linuxtools.tmf.experiment.TmfExperimentUpdatedSignal;
import org.eclipse.linuxtools.tmf.request.TmfDataRequest;
import org.eclipse.linuxtools.tmf.signal.TmfSignalHandler;
import org.eclipse.linuxtools.tmf.signal.TmfTimeSynchSignal;
-import org.eclipse.linuxtools.tmf.trace.TmfExperiment;
-import org.eclipse.linuxtools.tmf.trace.TmfExperimentSelectedSignal;
-import org.eclipse.linuxtools.tmf.trace.TmfExperimentUpdatedSignal;
import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
*/
public class TmfEventsView extends TmfView {
- public static final String ID = "org.eclipse.linuxtools.tmf.ui.viewer.events";
+ public static final String ID = "org.eclipse.linuxtools.tmf.ui.views.events";
- private TmfExperiment fExperiment;
+ private TmfExperiment<TmfEvent> fExperiment;
private String fTitlePrefix;
- // ========================================================================
+ // ------------------------------------------------------------------------
// Table data
- // ========================================================================
+ // ------------------------------------------------------------------------
private Table fTable;
private final String REFERENCE_COLUMN = "File";
private final String CONTENT_COLUMN = "Content";
private final String[] columnProperties = new String[] {
- TIMESTAMP_COLUMN,
+ TIMESTAMP_COLUMN,
SOURCE_COLUMN,
TYPE_COLUMN,
REFERENCE_COLUMN,
new ColumnData(columnProperties[4], 100, SWT.LEFT)
};
- // ========================================================================
+ // ------------------------------------------------------------------------
+ // Event cache
+ // ------------------------------------------------------------------------
+
+ private static final int DEFAULT_CACHE_SIZE = 1000;
+ private final int fCacheSize;
+ private TmfEvent[] cache = new TmfEvent[1];
+ private int cacheStartIndex = 0;
+ private int cacheEndIndex = 0;
+
+ // ------------------------------------------------------------------------
// Constructor
- // ========================================================================
+ // ------------------------------------------------------------------------
- public TmfEventsView() {
+ public TmfEventsView(int cacheSize) {
super();
+ fCacheSize = cacheSize;
}
- /* (non-Javadoc)
- * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
- */
- @Override
+ public TmfEventsView() {
+ this(DEFAULT_CACHE_SIZE);
+ }
+
+ // ------------------------------------------------------------------------
+ // ViewPart
+ // ------------------------------------------------------------------------
+
+ @SuppressWarnings("unchecked")
+ @Override
public void createPartControl(Composite parent) {
// Create a virtual table
// Set the table layout
GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
- layoutData.horizontalSpan= columnData.length;
fTable.setLayoutData(layoutData);
// Some cosmetic enhancements
fTable.setLinesVisible(true);
// Set the columns
- setColumnHeaders(fTable);
+ createColumnHeaders(fTable);
// Handle the table item requests
- fTable.addSelectionListener(new SelectionListener() {
+ fTable.addSelectionListener(new SelectionAdapter() {
- public void widgetDefaultSelected(SelectionEvent e) {
- // TODO Auto-generated method stub
- }
-
- public void widgetSelected(SelectionEvent e) {
- TmfTimestamp ts = extractTimestamp(fTable.getSelection()[0].getText());
- broadcastSignal(new TmfTimeSynchSignal(fTable, ts));
+ public void widgetSelected(SelectionEvent e) {
+ TmfTimestamp ts = (TmfTimestamp) fTable.getSelection()[0].getData();
+ broadcast(new TmfTimeSynchSignal(fTable, ts));
}
});
// Handle the table item requests
fTable.addListener(SWT.SetData, new Listener() {
+
public void handleEvent(Event event) {
- TableItem item = (TableItem) event.item;
+
+ TableItem item = (TableItem) event.item;
final int index = fTable.indexOf(item);
+
// Note: this works because handleEvent() is called once for each row, in sequence
if ((index >= cacheStartIndex ) && (index < cacheEndIndex)) {
- item.setText(extractItemFields(cache[index - cacheStartIndex]));
+ int i = index - cacheStartIndex;
+ item.setText(extractItemFields(cache[i]));
+ item.setData(new TmfTimestamp(cache[i].getTimestamp()));
return;
}
-
- // *** TODO ***
- // This is broken!
- //
- // This one fails to return any result :
- // TmfDataRequest<TmfEvent> request = new TmfDataRequest<TmfEvent>(fExperiment.getTimeRange(), index, 1) {
- // All these will return THE SAME RESULT!
- // TmfDataRequest<TmfEvent> request = new TmfDataRequest<TmfEvent>(index, 1) {
- // TmfDataRequest<TmfEvent> request = new TmfDataRequest<TmfEvent>(index+10, 1) {
- // TmfDataRequest<TmfEvent> request = new TmfDataRequest<TmfEvent>(null, 1) {
- //
- // THIS IS ONLY A TEMPORARY FIX!
-
- TmfDataRequest<TmfEvent> request = new TmfDataRequest<TmfEvent>(index, 1) {
+
+ TmfDataRequest<TmfEvent> request = new TmfDataRequest<TmfEvent>(TmfEvent.class, index, fCacheSize) {
@Override
public void handleData() {
TmfEvent[] tmpEvent = getData();
if ( (tmpEvent != null) && (tmpEvent.length > 0) ) {
cache = tmpEvent;
+ cacheStartIndex = index;
+ cacheEndIndex = index + cache.length;
}
-// cacheStartIndex = index;
-// cacheEndIndex = index + cache.length;
}
};
fExperiment.processRequest(request, true);
- if (cache[0] != null) {
+ if (cache[0] != null && cacheStartIndex == index) {
item.setText(extractItemFields(cache[0]));
+ item.setData(new TmfTimestamp(cache[0].getTimestamp()));
}
}
fTitlePrefix = getTitle();
// If an experiment is already selected, update the table
- fExperiment = TmfExperiment.getCurrentExperiment();
+ fExperiment = (TmfExperiment<TmfEvent>) TmfExperiment.getCurrentExperiment();
if (fExperiment != null) {
experimentSelected(new TmfExperimentSelectedSignal(fTable, fExperiment));
}
}
- // Events cache - temporary stuff
-// private final int CACHE_SIZE = 1;
- private TmfEvent[] cache;
- private int cacheStartIndex = 0;
- private int cacheEndIndex = 0;
-
-
- private TmfTimestamp extractTimestamp(String entry) {
- TmfTimestamp ts = null;
-
- int pos = entry.indexOf('.');
- if (pos > 0) {
- String integer = entry.substring(0, pos);
- String fraction = entry.substring(pos + 1);
-
- byte exponent = (byte) -fraction.length();
- String value = integer + fraction;
- ts = new TmfTimestamp(new Long(value), exponent);
- }
-
- return ts;
- }
-
/**
* @param table
*
* FIXME: Add support for column selection
*/
- protected void setColumnHeaders(Table table) {
+ protected void createColumnHeaders(Table table) {
for (int i = 0; i < columnData.length; i++) {
TableColumn column = new TableColumn(table, columnData[i].alignment, i);
column.setText(columnData[i].header);
return "[TmfEventsView]";
}
- // ========================================================================
+ // ------------------------------------------------------------------------
// Signal handlers
- // ========================================================================
+ // ------------------------------------------------------------------------
+ @SuppressWarnings("unchecked")
@TmfSignalHandler
public void experimentSelected(TmfExperimentSelectedSignal signal) {
// Update the trace reference
- fExperiment = signal.getExperiment();
+ fExperiment = (TmfExperiment<TmfEvent>) signal.getExperiment();
setPartName(fTitlePrefix + " - " + fExperiment.getExperimentId());
// Perform the updates on the UI thread
@TmfSignalHandler
public void currentTimeUpdated(TmfTimeSynchSignal signal) {
if (signal.getSource() != fTable && fExperiment != null) {
- final int index = (int) fExperiment.getIndex(signal.getCurrentTime());
+ final int index = (int) fExperiment.getRank(signal.getCurrentTime());
// Perform the updates on the UI thread
fTable.getDisplay().asyncExec(new Runnable() {
public void run() {
}
}
-}
+}
\ No newline at end of file
/*******************************************************************************
- * Copyright (c) 2009 Ericsson
+ * Copyright (c) 2009, 2010 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v1.0 which
import org.eclipse.ui.part.ViewPart;
/**
- * <b><u>TmfViewer</u></b>
+ * <b><u>TmfView</u></b>
* <p>
* TODO: Implement me. Please.
*/
public abstract class TmfView extends ViewPart implements ITmfComponent {
- /**
- * Constructor
- */
+ // ------------------------------------------------------------------------
+ // Constructor
+ // ------------------------------------------------------------------------
+
public TmfView() {
- TmfSignalManager.addListener(this);
+ super();
+ register();
}
- /**
- * Destructor
- */
- @Override
- public void dispose() {
- TmfSignalManager.removeListener(this);
+ // ------------------------------------------------------------------------
+ // ITmfComponent
+ // ------------------------------------------------------------------------
+
+ public void register() {
+ TmfSignalManager.register(this);
+ }
+
+ public void deregister() {
+ TmfSignalManager.deregister(this);
}
- /**
- * broadcastSignal
- */
- public void broadcastSignal(TmfSignal signal) {
+ public void broadcast(TmfSignal signal) {
TmfSignalManager.dispatchSignal(signal);
}
- /* (non-Javadoc)
- * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
- */
+ // ------------------------------------------------------------------------
+ // ViewPart
+ // ------------------------------------------------------------------------
+
@Override
public void createPartControl(Composite parent) {
// TODO Auto-generated method stub
}
- /* (non-Javadoc)
- * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
- */
@Override
public void setFocus() {
// TODO Auto-generated method stub
}
-}
+}
\ No newline at end of file
Export-Package: org.eclipse.linuxtools.tmf,
org.eclipse.linuxtools.tmf.component,
org.eclipse.linuxtools.tmf.event,
+ org.eclipse.linuxtools.tmf.experiment,
+ org.eclipse.linuxtools.tmf.parser,
org.eclipse.linuxtools.tmf.request,
org.eclipse.linuxtools.tmf.signal,
org.eclipse.linuxtools.tmf.trace
*/
public class TmfCorePlugin extends Plugin {
- // ========================================================================
+ // ------------------------------------------------------------------------
// Attributes
- // ========================================================================
+ // ------------------------------------------------------------------------
// The plug-in ID
public static final String PLUGIN_ID = "org.eclipse.linuxtools.tmf";
// The shared instance
private static TmfCorePlugin plugin;
- // ========================================================================
+ // ------------------------------------------------------------------------
// Constructors
- // ========================================================================
+ // ------------------------------------------------------------------------
/**
* The constructor
plugin = this;
}
- // ========================================================================
+ // ------------------------------------------------------------------------
// Accessors
- // ========================================================================
+ // ------------------------------------------------------------------------
/**
* @return the shared instance
/*******************************************************************************
- * Copyright (c) 2009 Ericsson
+ * Copyright (c) 2009, 2010 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v1.0 which
/**
* <b><u>ITmfComponent</u></b>
* <p>
- * TODO: Implement me. Please.
+ * This is the basic interface of all the TMF components.
+ * <p>
+ * Currently, it only addresses the inter-component signaling.
*/
public interface ITmfComponent {
- public void dispose();
+ /**
+ * Register to the signal manager
+ */
+ public void register();
+
+ /**
+ * De-register from the signal manager
+ */
+ public void deregister();
+
+ /**
+ * Broadcast a signal to all the interested listeners.
+ *
+ * @param signal
+ */
+ public void broadcast(TmfSignal signal);
- public void broadcastSignal(TmfSignal signal);
}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Ericsson
+ *
+ * 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Francois Chouinard - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.tmf.component;
+
+/**
+ * <b><u>ITmfContext</u></b>
+ * <p>
+ * This is a place-holder for the context objects.
+ */
+public interface ITmfContext {
+
+ public ITmfContext clone();
+}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2009 Ericsson
- *
- * 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Francois Chouinard - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.tmf.component;
-
-/**
- * <b><u>ITmfTransform</u></b>
- * <p>
- * TODO: Implement me. Please.
- */
-public interface ITmfTransform extends ITmfComponent {
-
- /**
- *
- */
- public void transformData();
-}
/*******************************************************************************
- * Copyright (c) 2009 Ericsson
+ * Copyright (c) 2009, 2010 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v1.0 which
/**
* <b><u>TmfComponent</u></b>
* <p>
+ * This is the base class of the TMF components.
+ * <p>
+ * Currently, it only addresses the inter-component signaling.
*/
public abstract class TmfComponent implements ITmfComponent {
+ // ------------------------------------------------------------------------
+ // Constructor
+ // ------------------------------------------------------------------------
+
public TmfComponent() {
- TmfSignalManager.addListener(this);
+ register();
+ }
+
+ // ------------------------------------------------------------------------
+ // ITmfComponent
+ // ------------------------------------------------------------------------
+
+ /* (non-Javadoc)
+ * @see org.eclipse.linuxtools.tmf.component.ITmfComponent#register()
+ */
+ public void register() {
+ TmfSignalManager.register(this);
}
- public void dispose() {
- TmfSignalManager.removeListener(this);
+ /* (non-Javadoc)
+ * @see org.eclipse.linuxtools.tmf.component.ITmfComponent#deregister()
+ */
+ public void deregister() {
+ TmfSignalManager.deregister(this);
}
- public void broadcastSignal(TmfSignal signal) {
+ /* (non-Javadoc)
+ * @see org.eclipse.linuxtools.tmf.component.ITmfComponent#broadcast(org.eclipse.linuxtools.tmf.signal.TmfSignal)
+ */
+ public void broadcast(TmfSignal signal) {
TmfSignalManager.dispatchSignal(signal);
}
+
}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Ericsson
+ *
+ * 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Francois Chouinard - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.tmf.component;
+
+import java.lang.reflect.Array;
+import java.util.Vector;
+
+import org.eclipse.linuxtools.tmf.event.TmfData;
+import org.eclipse.linuxtools.tmf.request.ITmfRequestHandler;
+import org.eclipse.linuxtools.tmf.request.TmfDataRequest;
+
+/**
+ * <b><u>TmfProvider</u></b>
+ * <p>
+ * The TmfProvider<T> is a provider for a data of type <T>.
+ * <p>
+ * This abstract class implements the housekeeking methods to register/
+ * deregister the event provider and to handle generically the event requests.
+ * <p>
+ * The concrete class can either re-implement processRequest() entirely or
+ * just implement the hooks (initializeContext() and getNext()).
+ * <p>
+ * TODO: Add support for providing multiple data types.
+ */
+public abstract class TmfProvider<T extends TmfData> extends TmfComponent implements ITmfRequestHandler<T> {
+
+ private Class<T> fType;
+
+ // ------------------------------------------------------------------------
+ // Constructors (enforce that a type be supplied)
+ // ------------------------------------------------------------------------
+
+ @SuppressWarnings("unused")
+ private TmfProvider() {
+ }
+
+ @SuppressWarnings("unused")
+ private TmfProvider(TmfProvider<T> other) {
+ }
+
+ protected TmfProvider(Class<T> type) {
+ fType = type;
+ register();
+ }
+
+ @Override
+ public void register() {
+ super.register();
+ TmfProviderManager.register(fType, this);
+ }
+
+ @Override
+ public void deregister() {
+ TmfProviderManager.deregister(fType, this);
+ super.deregister();
+ }
+
+ // ------------------------------------------------------------------------
+ // ITmfRequestHandler
+ // ------------------------------------------------------------------------
+
+ // TODO: Request coalescing, filtering, result dispatching
+
+ public void processRequest(final TmfDataRequest<T> request, boolean waitForCompletion) {
+
+ //Process the request
+ processDataRequest(request);
+
+ // Wait for completion if needed
+ if (waitForCompletion) {
+ request.waitForCompletion();
+ }
+ }
+
+ protected void processDataRequest(final TmfDataRequest<T> request) {
+
+ // Process the request
+ Thread thread = new Thread() {
+
+ @Override
+ public void run() {
+
+ // Extract the generic information
+ int blockSize = request.getBlockize();
+ int nbRequested = request.getNbRequested();
+
+ // Create the result buffer
+ Vector<T> result = new Vector<T>();
+ int nbRead = 0;
+
+ // Initialize the execution
+ ITmfContext context = setContext(request);
+
+ // Get the ordered events
+ T data = getNext(context);
+ while (data != null && !request.isCancelled() && nbRead < nbRequested && !isCompleted(request, data))
+ {
+ result.add(data);
+ if (++nbRead % blockSize == 0) {
+ pushData(request, result);
+ }
+ // To avoid an unnecessary read passed the last data requested
+ if (nbRead < nbRequested)
+ data = getNext(context);
+ }
+ pushData(request, result);
+ request.done();
+ }
+ };
+ thread.start();
+ }
+
+ /**
+ * Format the result data and forwards it to the requester.
+ * Note: after handling, the data is *removed*.
+ *
+ * @param request
+ * @param data
+ */
+ @SuppressWarnings("unchecked")
+ private void pushData(TmfDataRequest<T> request, Vector<T> data) {
+ synchronized(request) {
+ if (!request.isCompleted()) {
+ T[] result = (T[]) Array.newInstance(fType, data.size());
+ data.toArray(result);
+ request.setData(result);
+ request.handleData();
+ data.removeAllElements();
+ }
+ }
+ }
+
+ /**
+ * Initialize the provider based on the request. The context is
+ * application specific and will be updated by getNext().
+ *
+ * @param request
+ * @return
+ */
+ public abstract ITmfContext setContext(TmfDataRequest<T> request);
+
+ /**
+ * Return the next piece of data based on the context supplied. The context
+ * would typically be updated for the subsequent read.
+ *
+ * @param context
+ * @return
+ */
+ public abstract T getNext(ITmfContext context);
+
+ /**
+ * Checks if the data meets the request completion criteria.
+ *
+ * @param request
+ * @param data
+ * @return
+ */
+ public abstract boolean isCompleted(TmfDataRequest<T> request, T data);
+
+}
*/
public class TmfProviderManager {
- // ------------------------------------------------------------------------
- // No constructor
- // ------------------------------------------------------------------------
-
- private TmfProviderManager() {}
-
// ------------------------------------------------------------------------
// Keeps track of the providers for each event type
// ------------------------------------------------------------------------
- private static Map<Class<? extends TmfData>, List<TmfDataProvider<? extends TmfData>>> fProviders =
- new HashMap<Class<? extends TmfData>, List<TmfDataProvider<? extends TmfData>>>();
+ private static Map<Class<? extends TmfData>, List<TmfProvider<? extends TmfData>>> fProviders =
+ new HashMap<Class<? extends TmfData>, List<TmfProvider<? extends TmfData>>>();
/**
* Registers [provider] as a provider of [eventType]
* @param eventType
* @param provider
*/
- public static <T extends TmfData> void register(Class<T> eventType, TmfDataProvider<? extends TmfData> provider) {
+ public static <T extends TmfData> void register(Class<T> eventType, TmfProvider<? extends TmfData> provider) {
if (fProviders.get(eventType) == null)
- fProviders.put(eventType, new ArrayList<TmfDataProvider<? extends TmfData>>());
+ fProviders.put(eventType, new ArrayList<TmfProvider<? extends TmfData>>());
+ assert(fProviders.get(eventType) != null);
fProviders.get(eventType).add(provider);
}
/**
* Re-registers [provider] as a provider of [eventType]
*
- * @param dataClass
+ * @param eventType
* @param provider
*/
- public static <T extends TmfData> void deregister(Class<T> dataClass, TmfDataProvider<? extends TmfData> provider) {
- List<TmfDataProvider<? extends TmfData>> list = fProviders.get(dataClass);
+ public static <T extends TmfData> void deregister(Class<T> eventType, TmfProvider<? extends TmfData> provider) {
+ List<TmfProvider<? extends TmfData>> list = fProviders.get(eventType);
if (list != null) {
list.remove(provider);
if (list.size() == 0)
- fProviders.remove(dataClass);
+ fProviders.remove(eventType);
}
}
/**
* Returns the list of components that provide [eventType]
*
- * @param dataClass
+ * @param eventType
* @return
*/
@SuppressWarnings("unchecked")
- public static TmfDataProvider<? extends TmfData>[] getProviders(Class<? extends TmfData> dataClass) {
- List<TmfDataProvider<? extends TmfData>> list = fProviders.get(dataClass);
+ public static TmfProvider<? extends TmfData>[] getProviders(Class<? extends TmfData> eventType) {
+ List<TmfProvider<? extends TmfData>> list = fProviders.get(eventType);
if (list == null)
- list = new ArrayList<TmfDataProvider<? extends TmfData>>();
- TmfDataProvider<? extends TmfData>[] result = new TmfDataProvider[list.size()];
+ list = new ArrayList<TmfProvider<? extends TmfData>>();
+ TmfProvider<? extends TmfData>[] result = new TmfProvider[list.size()];
return list.toArray(result);
}
* @return
*/
@SuppressWarnings("unchecked")
- public static TmfDataProvider<? extends TmfData>[] getProviders(Class<? extends TmfData> dataClass, Class<? extends TmfDataProvider<? extends TmfData>> providerClass) {
- if (providerClass == null) {
- return getProviders(dataClass);
- }
- TmfDataProvider<? extends TmfData>[] list = getProviders(dataClass);
- List<TmfDataProvider<? extends TmfData>> result = new ArrayList<TmfDataProvider<? extends TmfData>>();
+ public static TmfProvider<? extends TmfData>[] getProviders(Class<? extends TmfData> eventType, Class<? extends TmfProvider<? extends TmfData>> providerType) {
+ TmfProvider<? extends TmfData>[] list = getProviders(eventType);
+ List<TmfProvider<? extends TmfData>> result = new ArrayList<TmfProvider<? extends TmfData>>();
if (list != null) {
- for (TmfDataProvider<? extends TmfData> provider : list) {
- if (provider.getClass() == providerClass) {
+ for (TmfProvider<? extends TmfData> provider : list) {
+ if (provider.getClass() == providerType) {
result.add(provider);
}
}
}
- TmfDataProvider<? extends TmfData>[] array = new TmfDataProvider[result.size()];
+ TmfProvider<? extends TmfData>[] array = new TmfProvider[result.size()];
return result.toArray(array);
}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2009 Ericsson
- *
- * 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Francois Chouinard - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.tmf.component;
-
-/**
- * <b><u>TmfTransform</u></b>
- * <p>
- * TODO: Implement me. Please.
- */
-public abstract class TmfTransform extends TmfComponent implements ITmfTransform {
-
-}
// The beginning and end of time
public static final TmfTimestamp BigBang = new TmfTimestamp(Long.MIN_VALUE, Byte.MAX_VALUE, 0);
public static final TmfTimestamp BigCrunch = new TmfTimestamp(Long.MAX_VALUE, Byte.MAX_VALUE, 0);
+ public static final TmfTimestamp Zero = new TmfTimestamp(0, (byte) 0, 0);
// ========================================================================
// Constructors
package org.eclipse.linuxtools.tmf.experiment;
-import java.util.Collections;
import java.util.Vector;
-import org.eclipse.linuxtools.tmf.component.TmfEventProvider;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.linuxtools.tmf.component.ITmfContext;
+import org.eclipse.linuxtools.tmf.component.TmfProvider;
import org.eclipse.linuxtools.tmf.event.TmfEvent;
import org.eclipse.linuxtools.tmf.event.TmfTimeRange;
import org.eclipse.linuxtools.tmf.event.TmfTimestamp;
-import org.eclipse.linuxtools.tmf.request.ITmfDataRequest;
-import org.eclipse.linuxtools.tmf.request.ITmfEventRequest;
import org.eclipse.linuxtools.tmf.request.TmfDataRequest;
import org.eclipse.linuxtools.tmf.request.TmfEventRequest;
-import org.eclipse.linuxtools.tmf.signal.TmfExperimentSelectedSignal;
-import org.eclipse.linuxtools.tmf.signal.TmfExperimentUpdatedSignal;
import org.eclipse.linuxtools.tmf.signal.TmfSignalHandler;
-import org.eclipse.linuxtools.tmf.signal.TmfSignalManager;
-import org.eclipse.linuxtools.tmf.signal.TmfTraceUpdatedSignal;
-import org.eclipse.linuxtools.tmf.trace.ITmfContext;
-import org.eclipse.linuxtools.tmf.trace.ITmfLocation;
import org.eclipse.linuxtools.tmf.trace.ITmfTrace;
-import org.eclipse.linuxtools.tmf.trace.TmfCheckpoint;
-import org.eclipse.linuxtools.tmf.trace.TmfContext;
+import org.eclipse.linuxtools.tmf.trace.TmfTraceContext;
+import org.eclipse.linuxtools.tmf.trace.TmfTraceUpdatedSignal;
/**
* <b><u>TmfExperiment</u></b>
* that are part of a tracing experiment.
* <p>
*/
-public class TmfExperiment<T extends TmfEvent> extends TmfEventProvider<T> implements ITmfTrace {
+public class TmfExperiment<T extends TmfEvent> extends TmfProvider<T> {
+
+// TODO: Complete multi-trace experiment
+// TODO: Add support for dynamic addition/removal of traces
+// TODO: Add support for live streaming (notifications, incremental indexing, ...)
+// TODO: Implement indexing-on-demand
// ------------------------------------------------------------------------
// Attributes
// ------------------------------------------------------------------------
// The currently selected experiment
- private static TmfExperiment<?> fCurrentExperiment = null;
+ private static TmfExperiment<?> fCurrentExperiment;
+
+ // The experiment ID
+ private String fExperimentId;
- // The set of traces that constitute the experiment
- private ITmfTrace[] fTraces;
+ // The set of trace sthat constitute the experiment
+ private Vector<ITmfTrace> fTraces;
// The total number of events
- private long fNbEvents;
+ private int fNbEvents;
// The experiment time range
private TmfTimeRange fTimeRange;
// The experiment reference timestamp (default: BigBang)
private TmfTimestamp fEpoch;
- // The experiment index
- private Vector<TmfCheckpoint> fCheckpoints = new Vector<TmfCheckpoint>();
-
// ------------------------------------------------------------------------
// Constructors
// ------------------------------------------------------------------------
* @param indexPageSize
*/
public TmfExperiment(Class<T> type, String id, ITmfTrace[] traces, TmfTimestamp epoch, int indexPageSize) {
- super(id, type);
+ super(type);
- fTraces = traces;
+ fExperimentId = id;
+ fTraces = new Vector<ITmfTrace>();
+ for (ITmfTrace trace : traces) {
+ fTraces.add(trace);
+ }
fEpoch = epoch;
fIndexPageSize = indexPageSize;
- fClone = createTraceCopy();
updateNbEvents();
updateTimeRange();
- }
+ }
/**
* @param type
public TmfExperiment(Class<T> type, String id, ITmfTrace[] traces, int indexPageSize) {
this(type, id, traces, TmfTimestamp.Zero, indexPageSize);
}
-
- public TmfExperiment(TmfExperiment<T> other) {
- super(other.getName() + "(clone)", other.fType);
-
- fEpoch = other.fEpoch;
- fIndexPageSize = other.fIndexPageSize;
-
- fTraces = new ITmfTrace[other.fTraces.length];
- for (int trace = 0; trace < other.fTraces.length; trace++) {
- fTraces[trace] = other.fTraces[trace].createTraceCopy();
- }
-
- fNbEvents = other.fNbEvents;
- fTimeRange = other.fTimeRange;
- fClone = null;
- }
-
- public TmfExperiment<T> createTraceCopy() {
- TmfExperiment<T> experiment = new TmfExperiment<T>(this);
- TmfSignalManager.deregister(experiment);
- return experiment;
- }
-
+
/**
- * Clears the experiment
+ *
*/
@Override
- public void dispose() {
- for (ITmfTrace trace : fTraces) {
- trace.dispose();
- }
- fTraces = null;
- fCheckpoints.clear();
- super.dispose();
- }
-
- private static void setCurrentExperiment(TmfExperiment<?> experiment) {
- fCurrentExperiment = experiment;
+ public void deregister() {
+ fTraces.clear();
+ fCurrentExperiment= null;
+ super.deregister();
}
// ------------------------------------------------------------------------
- // ITmfTrace
+ // Accessors
// ------------------------------------------------------------------------
- public String getPath() {
- return null;
- }
-
- public long getNbEvents() {
- return fNbEvents;
- }
-
- public int getCacheSize() {
- return fIndexPageSize;
+ public static TmfExperiment<?> getCurrentExperiment() {
+ return fCurrentExperiment;
}
- public TmfTimeRange getTimeRange() {
- return fTimeRange;
- }
-
- public TmfTimestamp getStartTime() {
- return fTimeRange.getStartTime();
- }
-
- public TmfTimestamp getEndTime() {
- return fTimeRange.getEndTime();
- }
-
- public Vector<TmfCheckpoint> getCheckpoints() {
- return fCheckpoints;
+ public String getExperimentId() {
+ return fExperimentId;
}
- // ------------------------------------------------------------------------
- // Accessors
- // ------------------------------------------------------------------------
-
- public static TmfExperiment<?> getCurrentExperiment() {
- return fCurrentExperiment;
+ public ITmfTrace[] getTraces() {
+ ITmfTrace[] result = new ITmfTrace[fTraces.size()];
+ return fTraces.toArray(result);
}
public TmfTimestamp getEpoch() {
return fEpoch;
}
- public ITmfTrace[] getTraces() {
- return fTraces;
+ public TmfTimeRange getTimeRange() {
+ return fTimeRange;
+ }
+
+ public int getNbEvents() {
+ return fNbEvents;
}
/**
* Returns the rank of the first event with the requested timestamp.
* If none, returns the index of the next event (if any).
*
- * @param timestamp
+ * @param ts
* @return
*/
- public long getRank(TmfTimestamp timestamp) {
- TmfExperimentContext context = seekEvent(timestamp);
+ public long getRank(TmfTimestamp ts) {
+ // FIXME: Go over all the traces
+ ITmfTrace trace = fTraces.firstElement();
+ TmfTraceContext context = trace.seekEvent(ts);
return context.getRank();
}
* @return
*/
public TmfTimestamp getTimestamp(int index) {
- TmfExperimentContext context = seekEvent(index);
- TmfEvent event = getNextEvent(context);
- return (event != null) ? event.getTimestamp() : null;
+ // FIXME: Go over all the traces
+ ITmfTrace trace = fTraces.firstElement();
+ TmfTraceContext context = trace.seekEvent(index);
+ TmfEvent event = trace.getNextEvent(context);
+ TmfTimestamp ts = (event != null) ? event.getTimestamp() : null;
+ return ts;
}
// ------------------------------------------------------------------------
// Operators
// ------------------------------------------------------------------------
+ /**
+ * Add a trace to the experiment trace set
+ *
+ * @param trace
+ */
+ public void addTrace(ITmfTrace trace) {
+ fTraces.add(trace);
+ synchronized(this) {
+ updateNbEvents();
+ updateTimeRange();
+ }
+ }
+
/**
* Update the total number of events
*/
TmfTimestamp endTime = fTimeRange != null ? fTimeRange.getEndTime() : TmfTimestamp.BigBang;
for (ITmfTrace trace : fTraces) {
- if (trace.getNbEvents() > 0) {
- TmfTimestamp traceStartTime = trace.getStartTime();
- if (traceStartTime.compareTo(startTime, true) < 0)
- startTime = traceStartTime;
-
- TmfTimestamp traceEndTime = trace.getEndTime();
- if (traceEndTime.compareTo(endTime, true) > 0)
- endTime = traceEndTime;
- }
+ TmfTimestamp traceStartTime = trace.getStartTime();
+ if (traceStartTime.compareTo(startTime, true) < 0)
+ startTime = traceStartTime;
+
+ TmfTimestamp traceEndTime = trace.getEndTime();
+ if (traceEndTime.compareTo(endTime, true) > 0)
+ endTime = traceEndTime;
}
fTimeRange = new TmfTimeRange(startTime, endTime);
}
// ------------------------------------------------------------------------
@Override
- public ITmfContext armRequest(ITmfDataRequest<T> request) {
- TmfTimestamp timestamp = (request instanceof ITmfEventRequest<?>) ?
- ((ITmfEventRequest<T>) request).getRange().getStartTime() : null;
- TmfExperimentContext context = (timestamp != null) ?
- seekEvent(timestamp) : seekEvent(request.getIndex());
+ public ITmfContext setContext(TmfDataRequest<T> request) {
+ TmfExperimentContext context = new TmfExperimentContext(fTraces);
+ positionTraces(request.getIndex(), context);
return context;
}
return null;
}
- // ------------------------------------------------------------------------
- // ITmfTrace trace positioning
- // ------------------------------------------------------------------------
-
- // Returns a brand new context based on the location provided
- // and initializes the event queues
- public TmfExperimentContext seekLocation(ITmfLocation<?> location) {
-
- // Validate the location
- if (location != null && !(location instanceof TmfExperimentLocation)) {
- return null; // Throw an exception?
- }
-
- // Instantiate the location
- TmfExperimentLocation expLocation = (location == null)
- ? new TmfExperimentLocation(new ITmfLocation<?>[fTraces.length], new long[fTraces.length])
- : (TmfExperimentLocation) location.clone();
-
- // Create and populate the context's traces contexts
- TmfExperimentContext context = new TmfExperimentContext(fTraces, new TmfContext[fTraces.length]);
- long rank = 0;
- for (int i = 0; i < fTraces.length; i++) {
- // Get the relevant trace attributes
- ITmfLocation<?> traceLocation = expLocation.getLocation()[i];
- long traceRank = expLocation.getRanks()[i];
-
- // Set the corresponding sub-context
- context.getContexts()[i] = fTraces[i].seekLocation(traceLocation);
- context.getContexts()[i].setRank(traceRank);
- rank += traceRank;
-
- // Set the trace location and read the corresponding event
- expLocation.getLocation()[i] = context.getContexts()[i].getLocation();
- context.getEvents()[i] = fTraces[i].getNextEvent(context.getContexts()[i]);
+ @Override
+ public boolean isCompleted(TmfDataRequest<T> request, T data) {
+ if (request instanceof TmfEventRequest<?> && data != null) {
+ return data.getTimestamp().compareTo(((TmfEventRequest<T>) request).getRange().getEndTime(), false) > 0;
}
-
- // Finalize context
- context.setLocation(expLocation);
- context.setRank(rank);
- context.setLastTrace(TmfExperimentContext.NO_TRACE);
- return context;
+ return false;
}
- /* (non-Javadoc)
- * @see org.eclipse.linuxtools.tmf.trace.ITmfTrace#seekEvent(org.eclipse.linuxtools.tmf.event.TmfTimestamp)
+ /**
+ * Given an experiment event index, position the set of traces so a call
+ * to getNextEvent() will retrieve the corresponding event.
+ *
+ * @param index
+ * @param context
*/
- public TmfExperimentContext seekEvent(TmfTimestamp timestamp) {
+ private synchronized void positionTraces(long index, TmfExperimentContext context) {
- if (timestamp == null) {
- timestamp = TmfTimestamp.BigBang;
- }
+ // Extract the relevant information
+ ITmfTrace[] traces = context.getTraces();
+ TmfEvent[] events = context.getEvents();
+ TmfTraceContext[] contexts = context.getContexts();
- // First, find the right checkpoint
- int index = Collections.binarySearch(fCheckpoints, new TmfCheckpoint(timestamp, null));
-
- // In the very likely case that the checkpoint was not found, bsearch
- // returns its negated would-be location (not an offset...). From that
- // index, we can then position the stream and get the event.
- if (index < 0) {
- index = Math.max(0, -(index + 2));
- }
-
- // Position the experiment at the checkpoint
- ITmfLocation<?> location;
- synchronized (fCheckpoints) {
- if (fCheckpoints.size() > 0) {
- if (index >= fCheckpoints.size()) {
- index = fCheckpoints.size() - 1;
- }
- location = fCheckpoints.elementAt(index).getLocation();
- }
- else {
- location = null;
- }
- }
-
- TmfExperimentContext context = seekLocation(location);
- context.setRank((long) index * fIndexPageSize);
-
- // And locate the event
- TmfExperimentContext nextEventContext = new TmfExperimentContext(context);
- TmfEvent event = getNextEvent(nextEventContext);
- while (event != null && event.getTimestamp().compareTo(timestamp, false) < 0) {
- context = new TmfExperimentContext(nextEventContext);
- event = getNextEvent(nextEventContext);
- }
- context.setLastTrace(TmfExperimentContext.NO_TRACE);
-
- return context;
- }
+ int page = 0; // The checkpoint page
+ int current = 0; // The current event index (rank)
- /* (non-Javadoc)
- * @see org.eclipse.linuxtools.tmf.trace.ITmfTrace#seekEvent(long)
- */
- public TmfExperimentContext seekEvent(long rank) {
-
- // Position the stream at the previous checkpoint
- int index = (int) rank / fIndexPageSize;
- ITmfLocation<?> location;
- synchronized (fCheckpoints) {
- if (fCheckpoints.size() == 0) {
- location = null;
- }
- else {
- if (index >= fCheckpoints.size()) {
- index = fCheckpoints.size() - 1;
- }
- location = fCheckpoints.elementAt(index).getLocation();
- }
- }
-
- TmfExperimentContext context = seekLocation(location);
- long pos = (long) index * fIndexPageSize;
- context.setRank(pos);
-
- // And locate the event
- TmfExperimentContext nextEventContext = new TmfExperimentContext(context);
- TmfEvent event = getNextEvent(nextEventContext);
- while (event != null && pos++ < rank) {
- event = getNextEvent(nextEventContext);
- context = new TmfExperimentContext(nextEventContext);
- if (event != null) context.updateRank(-1);
- }
- context.setLastTrace(TmfExperimentContext.NO_TRACE);
-
- return context;
+ // If there is no checkpoint created yet, start from the beginning
+ if (fExperimentIndex.size() == 0) {
+ for (int i = 0; i < contexts.length; i++) {
+ contexts[i] = traces[i].seekLocation(null).clone();
+ events[i] = traces[i].parseEvent(contexts[i]);
+ }
+ }
+ else {
+ page = (int) index / fIndexPageSize;
+ if (page >= fExperimentIndex.size()) {
+ page = fExperimentIndex.size() - 1;
+ }
+
+ TmfTraceContext[] checkpoint = fExperimentIndex.elementAt(page).getContexts();
+ for (int i = 0; i < contexts.length; i++) {
+ contexts[i] = checkpoint[i].clone();
+ events[i] = traces[i].parseEvent(contexts[i]);
+ }
+ current = page * fIndexPageSize;
+ }
+
+ // Position the traces at the requested index
+ while (current++ < index) {
+ getNextEvent(context);
+ }
}
/**
* @param context
* @return
*/
- public synchronized TmfEvent getNextEvent(TmfContext context) {
-
- // Validate the context
- if (!(context instanceof TmfExperimentContext)) {
- return null; // Throw an exception?
- }
-
- TmfExperimentContext expContext = (TmfExperimentContext) context;
-
- // If an event was consumed previously, get the next one from that trace
- int lastTrace = expContext.getLastTrace();
- if (lastTrace != TmfExperimentContext.NO_TRACE) {
- TmfContext traceContext = expContext.getContexts()[lastTrace];
- expContext.getEvents()[lastTrace] = expContext.getTraces()[lastTrace].getNextEvent(traceContext);
- }
-
- // Scan the candidate events and identify the "next" trace to read from
- int trace = TmfExperimentContext.NO_TRACE;
+ private TmfEvent getNextEvent(TmfExperimentContext context) {
+ // TODO: Consider the time adjustment
+ int trace = 0;
TmfTimestamp timestamp = TmfTimestamp.BigCrunch;
- for (int i = 0; i < expContext.getTraces().length; i++) {
- TmfEvent event = expContext.getEvents()[i];
- if (event != null && event.getTimestamp() != null) {
- TmfTimestamp otherTS = event.getTimestamp();
+ if (context.getEvents()[trace] != null) {
+ timestamp = context.getEvents()[trace].getTimestamp();
+ }
+ for (int i = 1; i < context.getTraces().length; i++) {
+ if (context.getEvents()[i].getTimestamp() != null) {
+ TmfTimestamp otherTS = context.getEvents()[i].getTimestamp();
if (otherTS.compareTo(timestamp, true) < 0) {
trace = i;
timestamp = otherTS;
}
}
}
-
- // Update the experiment context and set the "next" event
- TmfEvent event = null;
- if (trace >= 0) {
- long savedRank = expContext.getRank();
- expContext.setLastTrace(trace);
- expContext.updateRank(1);
- TmfExperimentLocation expLocation = (TmfExperimentLocation) expContext.getLocation();
- TmfContext traceContext = expContext.getContexts()[trace];
- expLocation.getLocation()[trace] = traceContext.getLocation().clone();
- expLocation.getRanks()[trace] = traceContext.getRank();
- event = expContext.getEvents()[trace];
- updateIndex(expContext, savedRank, timestamp);
- }
-
+ TmfEvent event = context.getTraces()[trace].getNextEvent(context.getContexts()[trace]);
+ context.getEvents()[trace] = context.getTraces()[trace].parseEvent(context.getContexts()[trace]);
return event;
}
- public synchronized void updateIndex(ITmfContext context, long rank, TmfTimestamp timestamp) {
- // Build the index as we go along
- if (context.isValidRank() && (rank % fIndexPageSize) == 0) {
- // Determine the table position
- long position = context.getRank() / fIndexPageSize;
- // Add new entry at proper location (if empty)
- if (fCheckpoints.size() == position) {
- ITmfLocation<?> location = context.getLocation().clone();
- fCheckpoints.add(new TmfCheckpoint(timestamp, location));
-// System.out.println(this + "[" + (fCheckpoints.size() - 1) + "] " + timestamp + ", " + location.toString());
- }
- }
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.linuxtools.tmf.trace.ITmfTrace#parseEvent(org.eclipse.linuxtools.tmf.trace.TmfContext)
+ /**
+ * Scan the next events from all traces and return the next one
+ * in chronological order.
+ *
+ * @param context
+ * @return
*/
- public TmfEvent parseEvent(TmfContext context) {
-
- if (context instanceof TmfExperimentContext) {
- TmfExperimentContext expContext = (TmfExperimentContext) context;
- int lastTrace = expContext.getLastTrace();
- if (lastTrace != -1) {
- TmfContext traceContext = expContext.getContexts()[lastTrace];
- expContext.getEvents()[lastTrace] = expContext.getTraces()[lastTrace].getNextEvent(traceContext);
- expContext.updateRank(1);
- TmfExperimentLocation expLocation = (TmfExperimentLocation) expContext.getLocation();
- expLocation.getLocation()[lastTrace] = traceContext.getLocation().clone();
- }
-
- int trace = -1;
- TmfTimestamp timestamp = TmfTimestamp.BigCrunch;
- for (int i = 0; i < expContext.getTraces().length; i++) {
- if (expContext.getEvents()[i] != null) {
- if (expContext.getEvents()[i].getTimestamp() != null) {
- TmfTimestamp otherTS = expContext.getEvents()[i].getTimestamp();
- if (otherTS.compareTo(timestamp, true) < 0) {
- trace = i;
- timestamp = otherTS;
- }
- }
+ private TmfTimestamp getNextEventTimestamp(TmfExperimentContext context) {
+ // TODO: Consider the time adjustment
+ int trace = 0;
+ TmfTimestamp timestamp = TmfTimestamp.BigCrunch;
+ if (context.getEvents()[trace] != null) {
+ timestamp = context.getEvents()[trace].getTimestamp();
+ }
+ for (int i = 1; i < context.getTraces().length; i++) {
+ if (context.getEvents()[i].getTimestamp() != null) {
+ TmfTimestamp otherTS = context.getEvents()[i].getTimestamp();
+ if (otherTS.compareTo(timestamp, true) < 0) {
+ trace = i;
+ timestamp = otherTS;
}
}
- if (trace >= 0) {
- expContext.setLastTrace(TmfExperimentContext.NO_TRACE);
- return expContext.getEvents()[trace];
- }
}
-
- return null;
+ return timestamp;
}
/* (non-Javadoc)
*/
@Override
public String toString() {
- return "[TmfExperiment (" + getName() + ")]";
+ return "[TmfExperiment (" + fExperimentId + ")]";
}
// ------------------------------------------------------------------------
/*
* The experiment holds the globally ordered events of its set of traces.
* It is expected to provide access to each individual event by index i.e.
- * it must be possible to request the Nth event of the experiment.
+ * it must be possible to request the nth event of the experiment.
*
* The purpose of the index is to keep the information needed to rapidly
* restore the traces contexts at regular intervals (every INDEX_PAGE_SIZE
// The index page size
private static final int DEFAULT_INDEX_PAGE_SIZE = 1000;
- private final int fIndexPageSize;
+ private final int fIndexPageSize;
- @SuppressWarnings("unchecked")
- public void indexExperiment() {
-
- final TmfExperiment<?> experiment = getCurrentExperiment();
- fCheckpoints.clear();
-
- ITmfEventRequest<TmfEvent> request = new TmfEventRequest<TmfEvent>(TmfEvent.class, TmfTimeRange.Eternity, TmfDataRequest.ALL_DATA, 1) {
-
- long indexingStart = System.nanoTime();
-
- TmfTimestamp startTime = null;
- TmfTimestamp lastTime = null;
- int nbEvents = 0;
-
- @Override
- public void handleData() {
- TmfEvent[] events = getData();
- if (events.length > 0) {
- nbEvents++;
- TmfTimestamp ts = events[0].getTimestamp();
- if (startTime == null)
- startTime = new TmfTimestamp(ts);
- lastTime = new TmfTimestamp(ts);
-
- if ((nbEvents % DEFAULT_INDEX_PAGE_SIZE) == 0) {
- updateExperiment();
- }
- }
- }
+ // The experiment index
+ private Vector<TmfExperimentCheckpoint> fExperimentIndex = new Vector<TmfExperimentCheckpoint>();
- @Override
- public void handleSuccess() {
- long indexingEnd = System.nanoTime();
-
- updateExperiment();
-// experiment.fCheckpoints = new Vector<TmfCheckpoint>();
-// for (int i = 0; i < fCheckpoints.size(); i++) {
-// TmfCheckpoint checkpoint = fCheckpoints.get(i).clone();
-// experiment.fCheckpoints.add(checkpoint);
-// System.out.println("fCheckpoints[" + i + "] " + checkpoint.getTimestamp() + ", " + checkpoint.getLocation().toString());
-// }
-
-// clone.dispose();
-// if (Tracer.INTERNALS) Tracer.trace(getName() + ": nbEvents=" + nbEvents + " (" + ((indexingEnd-indexingStart)/nbEvents)+ " ns/evt), start=" + startTime + ", end=" + lastTime);
-
- System.out.println(getName() + ": start=" + startTime + ", end=" + lastTime + ", elapsed=" + (indexingEnd*1.0 - indexingStart) / 1000000000);
- System.out.println(getName() + ": nbEvents=" + fNbEvents + " (" + ((indexingEnd-indexingStart)/nbEvents)+ " ns/evt)");
-// for (int i = 0; i < experiment.fCheckpoints.size(); i++) {
-// TmfCheckpoint checkpoint = experiment.fCheckpoints.get(i);
-// System.out.println("fCheckpoints[" + i + "] " + checkpoint.getTimestamp() + ", " + checkpoint.getLocation().toString());
-// }
- }
+ // Indicates that an indexing job is already running
+ private Boolean fIndexing = false;
+ private Boolean fIndexed = false;
- private void updateExperiment() {
- if (experiment == fCurrentExperiment)
- experiment.fTimeRange = new TmfTimeRange(startTime, new TmfTimestamp(lastTime));
- experiment.fNbEvents = nbEvents;
- experiment.fCheckpoints = ((TmfExperiment<T>) fClone).fCheckpoints;
- notifyListeners();
+ // The indexing job
+ private IndexingJob job;
+
+ /**
+ * indexExperiment
+ *
+ * Creates the experiment index.
+ */
+ public void indexExperiment(boolean waitForCompletion) {
+
+ synchronized(fIndexing) {
+ if (fIndexed || fIndexing) {
+ // An indexing job is already running but a new request came
+ // in (probably due to a change in the trace set). The index
+ // being currently built is therefore already invalid.
+ // TODO: Cancel and restart the job
+ // TODO: Add support for dynamically adding/removing traces
+ return;
}
- };
+ fIndexing = true;
+ }
- sendRequest((ITmfDataRequest<T>) request, ExecutionType.LONG);
- }
-
- protected void notifyListeners() {
- broadcast(new TmfExperimentUpdatedSignal(this, this, null));
+ job = new IndexingJob(fExperimentId);
+ job.schedule();
+
+ if (waitForCompletion) {
+ try {
+ job.join();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
}
-
+
+ private class IndexingJob extends Job {
+
+ public IndexingJob(String name) {
+ super(name);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+
+ // Minimal check
+ if (fTraces.size() == 0) {
+ fIndexing = false;
+ return Status.OK_STATUS;
+ }
+
+ monitor.beginTask("Indexing " + fExperimentId, IProgressMonitor.UNKNOWN);
+
+ int nbEvents = 0;
+ TmfTimestamp startTime = null;
+ TmfTimestamp lastTime = null;
+
+ fExperimentIndex = new Vector<TmfExperimentCheckpoint>();
+
+ try {
+ // Reset the traces
+ TmfExperimentContext context = new TmfExperimentContext(fTraces);
+ positionTraces(0, context);
+ TmfTraceContext[] traces = context.cloneContexts();
+
+ TmfTimestamp timestamp = getNextEventTimestamp(context);
+ startTime = new TmfTimestamp(timestamp);
+ lastTime = new TmfTimestamp(timestamp);
+ TmfEvent event = getNextEvent(context);
+ while (event != null) {
+ if ((nbEvents++ % fIndexPageSize) == 0) {
+ fExperimentIndex.add(new TmfExperimentCheckpoint(lastTime, traces));
+ fNbEvents = nbEvents;
+ fTimeRange = new TmfTimeRange(startTime, lastTime);
+
+ monitor.worked(1);
+
+ // Check monitor *after* fCheckpoints has been updated
+ if (monitor.isCanceled()) {
+ monitor.done();
+ return Status.CANCEL_STATUS;
+ }
+ }
+
+ // We will need the contexts at the next iteration
+ if ((nbEvents % fIndexPageSize) == 0) {
+ traces = context.cloneContexts();
+ lastTime = new TmfTimestamp(event.getTimestamp());
+ }
+
+ event = getNextEvent(context);
+ }
+
+ }
+ finally {
+ synchronized(this) {
+ fNbEvents = nbEvents;
+ fTimeRange = new TmfTimeRange(startTime, lastTime);
+ fIndexing = false;
+ fIndexed = true;
+ }
+ monitor.done();
+ }
+
+// dumpExperimentCheckpoints();
+
+ return Status.OK_STATUS;
+ }
+ }
+
+// // ------------------------------------------------------------------------
+// // Toubleshooting code
+// // ------------------------------------------------------------------------
+//
+// private void dumpExperimentCheckpoints() {
+// System.out.println("-----");
+// System.out.println("Checkpoints of " + fExperimentId);
+// for (int i = 0; i < fExperimentIndex.size(); i++) {
+// System.out.println("Entry:" + i);
+// TmfExperimentCheckpoint checkpoint = fExperimentIndex.get(i);
+// TmfTraceContext[] contexts = checkpoint.getContexts();
+// for (int j = 0; j < contexts.length; j++) {
+// ITmfTrace trace = fTraces.get(j);
+// TmfTraceContext context = trace.seekLocation(contexts[j].getLocation());
+// TmfEvent event = fTraces.get(j).getNextEvent(new TmfTraceContext(context));
+// System.out.println(" [" + trace.getName() + "] rank: " + context.getRank() + ", timestamp: " + event.getTimestamp());
+// assert (checkpoint.getTimestamp().compareTo(event.getTimestamp(), false) == 0);
+// }
+// }
+// }
+
// ------------------------------------------------------------------------
// Signal handlers
// ------------------------------------------------------------------------
@TmfSignalHandler
- public void experimentSelected(TmfExperimentSelectedSignal<T> signal) {
- TmfExperiment<?> experiment = signal.getExperiment();
- if (experiment == this) {
- setCurrentExperiment(experiment);
- indexExperiment();
- }
- else {
- dispose();
- }
+ public void experimentSelected(TmfExperimentSelectedSignal signal) {
+ fCurrentExperiment = signal.getExperiment();
+// if (signal.getExperiment() == this) {
+// indexExperiment(true);
+// }
}
@TmfSignalHandler
public void experimentUpdated(TmfExperimentUpdatedSignal signal) {
+// indexExperiment(true);
}
@TmfSignalHandler
package org.eclipse.linuxtools.tmf.experiment;
import org.eclipse.linuxtools.tmf.event.TmfTimestamp;
-import org.eclipse.linuxtools.tmf.trace.TmfContext;
+import org.eclipse.linuxtools.tmf.trace.TmfTraceContext;
/**
* <b><u>TmfExperimentCheckpoint</u></b>
// ------------------------------------------------------------------------
private final TmfTimestamp fTimestamp;
- private final TmfContext[] fContexts;
+ private final TmfTraceContext[] fContexts;
// ------------------------------------------------------------------------
// Constructors
* @param ts
* @param location
*/
- public TmfExperimentCheckpoint(TmfTimestamp ts, TmfContext[] contexts) {
+ public TmfExperimentCheckpoint(TmfTimestamp ts, TmfTraceContext[] contexts) {
fTimestamp = ts;
fContexts = contexts;
}
/**
* @return the checkpoint event stream location
*/
- public TmfContext[] getContexts() {
+ public TmfTraceContext[] getContexts() {
return fContexts;
}
- // ------------------------------------------------------------------------
- // Object
- // ------------------------------------------------------------------------
-
- @Override
- public int hashCode() {
- int result = 37;
- result = 17 * result + fTimestamp.hashCode();
- return result;
- }
-
- @Override
- public boolean equals(Object other) {
- if (!(other instanceof TmfExperimentCheckpoint)) {
- return false;
- }
- TmfExperimentCheckpoint o = (TmfExperimentCheckpoint) other;
- return fTimestamp.equals(o.fTimestamp);
- }
-
// ------------------------------------------------------------------------
// Comparable
// ------------------------------------------------------------------------
package org.eclipse.linuxtools.tmf.experiment;
+import java.util.Vector;
+
+import org.eclipse.linuxtools.tmf.component.ITmfContext;
import org.eclipse.linuxtools.tmf.event.TmfEvent;
-import org.eclipse.linuxtools.tmf.trace.ITmfLocation;
import org.eclipse.linuxtools.tmf.trace.ITmfTrace;
-import org.eclipse.linuxtools.tmf.trace.TmfContext;
+import org.eclipse.linuxtools.tmf.trace.TmfTraceContext;
/**
* <b><u>TmfExperimentContext</u></b>
* <p>
- * The experiment keeps track of the next event from each of its traces so
- * it can pick the next one in chronological order.
- * <p>
- * This implies that the "next" event from each trace has already been
- * read and that we at least know its timestamp. This doesn't imply that a
- * full parse of the event content was performed (read: LTTng works like
- * this).
- * <p>
- * The last trace refers to the trace from which the last event was
- * "consumed" at the experiment level.
+ * Implement me. Please.
*/
-public class TmfExperimentContext extends TmfContext {
-
- // ------------------------------------------------------------------------
- // Constants
- // ------------------------------------------------------------------------
-
- public static final int NO_TRACE = -1;
-
- // ------------------------------------------------------------------------
- // Attributes
- // ------------------------------------------------------------------------
-
- private ITmfTrace[] fTraces = new ITmfTrace[0];
- private TmfContext[] fContexts;
- private TmfEvent[] fEvents;
- private int lastTrace;
+public class TmfExperimentContext implements ITmfContext, Cloneable {
- // ------------------------------------------------------------------------
- // Constructors
- // ------------------------------------------------------------------------
+ private ITmfTrace[] fTraces = new ITmfTrace[0]; // The set of traces
+ private TmfTraceContext[] fContexts; // The set of trace contexts
+ private TmfEvent[] fEvents;
- public TmfExperimentContext(ITmfTrace[] traces, TmfContext[] contexts) {
- super();
- fTraces = traces;
- fContexts = contexts;
+ public TmfExperimentContext(Vector<ITmfTrace> traces) {
+ fTraces = traces.toArray(fTraces);
+ fContexts = new TmfTraceContext[fTraces.length];
fEvents = new TmfEvent[fTraces.length];
+ }
- ITmfLocation<?>[] locations = new ITmfLocation[fTraces.length];
- long[] ranks = new long[fTraces.length];
- long rank = 0;
- for (int i = 0; i < fTraces.length; i++) {
- if (contexts[i] != null) {
- locations[i] = contexts[i].getLocation();
- ranks[i] = contexts[i].getRank();
- rank += contexts[i].getRank();
- }
+ public TmfExperimentContext clone() {
+ try {
+ return (TmfExperimentContext) super.clone();
+ } catch (CloneNotSupportedException e) {
+ e.printStackTrace();
}
-
- setLocation(new TmfExperimentLocation(locations, ranks));
- setRank(rank);
- lastTrace = NO_TRACE;
+ return null;
}
- public TmfExperimentContext(ITmfTrace[] traces) {
- this(traces, new TmfContext[traces.length]);
+ public ITmfTrace[] getTraces() {
+ return fTraces;
}
- public TmfExperimentContext(TmfExperimentContext other) {
- this(other.fTraces, other.cloneContexts());
- fEvents = other.fEvents;
- setLocation(other.getLocation().clone());
- setRank(other.getRank());
- setLastTrace(other.lastTrace);
+ public TmfTraceContext[] getContexts() {
+ return fContexts;
}
- private TmfContext[] cloneContexts() {
- TmfContext[] contexts = new TmfContext[fContexts.length];
+ public TmfTraceContext[] cloneContexts() {
+ TmfTraceContext[] contexts = new TmfTraceContext[fContexts.length];
for (int i = 0; i < fContexts.length; i++)
contexts[i] = fContexts[i].clone();
return contexts;
}
- // ------------------------------------------------------------------------
- // Accessors
- // ------------------------------------------------------------------------
-
- public ITmfTrace[] getTraces() {
- return fTraces;
- }
-
- public TmfContext[] getContexts() {
- return fContexts;
- }
-
public TmfEvent[] getEvents() {
return fEvents;
}
- public int getLastTrace() {
- return lastTrace;
- }
-
- public void setLastTrace(int newIndex) {
- lastTrace = newIndex;
- }
-
}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2009 Ericsson
+ *
+ * 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Francois Chouinard - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.tmf.experiment;
+
+import org.eclipse.linuxtools.tmf.event.TmfEvent;
+import org.eclipse.linuxtools.tmf.signal.TmfSignal;
+
+/**
+ * <b><u>TmfExperimentSelectedSignal</u></b>
+ * <p>
+ * TODO: Implement me. Please.
+ */
+public class TmfExperimentSelectedSignal extends TmfSignal {
+
+ private final TmfExperiment<? extends TmfEvent> fExperiment;
+
+ public TmfExperimentSelectedSignal(Object source, TmfExperiment<? extends TmfEvent> experiment) {
+ super(source);
+ fExperiment = experiment;
+ }
+
+ public TmfExperiment<? extends TmfEvent> getExperiment() {
+ return fExperiment;
+ }
+
+ @Override
+ public String toString() {
+ return "[TmfExperimentSelectedSignal (" + fExperiment.getExperimentId() + ")]";
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2009 Ericsson
+ *
+ * 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Francois Chouinard - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.tmf.experiment;
+
+import org.eclipse.linuxtools.tmf.event.TmfEvent;
+import org.eclipse.linuxtools.tmf.signal.TmfSignal;
+import org.eclipse.linuxtools.tmf.trace.ITmfTrace;
+
+/**
+ * <b><u>TmfExperimentUpdatedSignal</u></b>
+ * <p>
+ * TODO: Implement me. Please.
+ */
+public class TmfExperimentUpdatedSignal extends TmfSignal {
+
+ private final TmfExperiment<? extends TmfEvent> fExperiment;
+ private final ITmfTrace fTrace;
+
+ public TmfExperimentUpdatedSignal(Object source, TmfExperiment<? extends TmfEvent> experiment, ITmfTrace trace) {
+ super(source);
+ fExperiment = experiment;
+ fTrace = trace;
+ }
+
+ public TmfExperiment<? extends TmfEvent> getExperiment() {
+ return fExperiment;
+ }
+
+ public ITmfTrace getTrace() {
+ return fTrace;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return "[TmfExperimentUpdatedSignal (" + fExperiment.toString() + ", " + fTrace.toString() + ")]";
+ }
+
+}
import org.eclipse.linuxtools.tmf.event.TmfEvent;
import org.eclipse.linuxtools.tmf.trace.ITmfTrace;
-import org.eclipse.linuxtools.tmf.trace.TmfContext;
+import org.eclipse.linuxtools.tmf.trace.TmfTraceContext;
/**
* <b><u>ITmfEventParser</u></b>
* @return
* @throws IOException
*/
- public TmfEvent parseNextEvent(ITmfTrace stream, TmfContext context) throws IOException;
+ public TmfEvent parseNextEvent(ITmfTrace stream, TmfTraceContext context) throws IOException;
}
\ No newline at end of file
/*******************************************************************************
- * Copyright (c) 2009 Ericsson
+ * Copyright (c) 2009, 2010 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v1.0 which
package org.eclipse.linuxtools.tmf.request;
+import org.eclipse.linuxtools.tmf.event.TmfData;
+
/**
* <b><u>ITmfRequestHandler</u></b>
* <p>
* TODO: Implement me. Please.
* @param <V>
*/
-public interface ITmfRequestHandler<T> {
+public interface ITmfRequestHandler<T extends TmfData> {
/**
* Process the request. The client thread can be suspended until the
*
* @param waitForCompletion Suspend the client thread until the request completes
*/
- public void processRequest(TmfDataRequest<T> request, boolean waitForCompletion);
-
-}
\ No newline at end of file
+ public void processRequest(TmfDataRequest<T> request, boolean waitForCompletion);
+}
/*******************************************************************************
- * Copyright (c) 2009 Ericsson
+ * Copyright (c) 2009, 2010 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v1.0 which
package org.eclipse.linuxtools.tmf.request;
-import org.eclipse.linuxtools.tmf.event.TmfTimeRange;
+import org.eclipse.linuxtools.tmf.event.TmfData;
/**
* <b><u>TmfDataRequest</u></b>
* <p>
* TmfDataRequests are used to obtain blocks of contiguous data from a data
- * provider, either all the data within a given time window or n elements
- * starting at a specific timestamp. Open ranges can be used, especially for
- * continuous streaming.
+ * provider. Open ranges can be used, especially for continuous streaming.
* <p>
- * The request is processed asynchronously by an ITmfRequestProcessor and,
- * as blocks of data become available, the callback handleData() is
- * invoked, synchronously, for each block. When returning from the callback,
- * the data instances go out of scope and become eligible for gc. It is
- * is thus the responsibility of the requester to either copy or keep a
- * reference to the data it wishes to track specifically.
+ * The request is processed asynchronously by a TmfProvider and, as blocks
+ * of data become available, handleData() is invoked synchronously for each
+ * block. Upon return, the data instances go out of scope and become eligible
+ * for gc. It is is thus the responsibility of the requester to either clone
+ * or keep a reference to the data it wishes to track specifically.
* <p>
- * This data block approach is necessary to avoid busting the heap for very
- * large trace files. The block size is configurable.
+ * This data block approach is used to avoid busting the heap for very
+ * large trace files. The block size is configurable.
* <p>
- * The ITmfRequestProcessor indicates that the request is completed by
- * calling done(). The request can be canceled at any time with cancel().
+ * The TmfProvider indicates that the request is completed by calling done().
+ * The request can be canceled at any time with cancel().
* <p>
* Typical usage:
*<pre><code><i>TmfTimeWindow range = new TmfTimewindow(...);
- *TmfDataRequest<DataType[]> request = new TmfDataRequest<DataType[]>(range, 0, NB_EVENTS, BLOCK_SIZE) {
+ *TmfDataRequest<DataType[]> request = new TmfDataRequest<DataType[]>(DataType.class, 0, NB_EVENTS, BLOCK_SIZE) {
* public void handleData() {
* DataType[] data = request.getData();
* for (DataType e : data) {
*fProcessor.process(request, true);
*</i></code></pre>
*
- * TODO: Consider extending DataRequestMonitor from DSF concurrency plugin.
- * The main issue is the slicing of the result in blocks and continuous
- * streams. This would require using a thread executor and to carefully
- * look at setData() and getData().
+ * TODO: Consider decoupling from "time range", "rank", etc and for the more
+ * generic notion of "criteria". This would allow to extend for "time range", etc
+ * instead of providing specialized constructors. This also means removing the
+ * criteria info from the data structure (with the possible exception of fNbRequested).
+ * The nice thing about it is that it would prepare us well for the coming generation
+ * of analysis tools.
*
* TODO: Implement request failures (codes, etc...)
*/
-public class TmfDataRequest<V> {
+public class TmfDataRequest<T extends TmfData> {
- // ========================================================================
+ // ------------------------------------------------------------------------
// Constants
- // ========================================================================
+ // ------------------------------------------------------------------------
// The default maximum number of events per chunk
public static final int DEFAULT_BLOCK_SIZE = 1000;
// The request count for all the events
- public static final int ALL_EVENTS = -1;
+ public static final int ALL_DATA = Integer.MAX_VALUE;
- // ========================================================================
+ // ------------------------------------------------------------------------
// Attributes
- // ========================================================================
+ // ------------------------------------------------------------------------
- private final int fIndex; // The index (order) of the requested event
- private final TmfTimeRange fRange; // The requested events time range
- private final int fNbRequestedEvents; // The number of events to read (-1 == all in the range)
- private final int fBlockSize; // The maximum number of events per chunk
- private int fNbEvents; // The number of events read so far
+ private final Class<? extends TmfData> fDataType;
+ private final int fIndex; // The index (rank) of the requested event
+ private final int fNbRequested; // The number of requested events (ALL_DATA for all)
+ private final int fBlockSize; // The maximum number of events per chunk
+ private int fNbRead; // The number of reads so far
- private Object lock = new Object();
+ private Object lock = new Object();
private boolean fRequestCompleted = false;
private boolean fRequestFailed = false;
private boolean fRequestCanceled = false;
- private V[] fData; // Data object
+ private T[] fData; // Data object
- // ========================================================================
+ // ------------------------------------------------------------------------
// Constructors
- // ========================================================================
+ // ------------------------------------------------------------------------
/**
- * @param index
- * @param nbEvents
+ * Default constructor
*/
- public TmfDataRequest(int index, int nbEvents) {
- this(null, index, nbEvents, DEFAULT_BLOCK_SIZE);
+ public TmfDataRequest(Class<? extends TmfData> dataType) {
+ this(dataType, 0, ALL_DATA, DEFAULT_BLOCK_SIZE);
}
- public TmfDataRequest(int index, int nbEvents, int blockSize) {
- this(null, index, nbEvents, blockSize);
- }
-
/**
- * @param range
+ * @param nbRequested
*/
- public TmfDataRequest(TmfTimeRange range) {
- this(range, 0, ALL_EVENTS, DEFAULT_BLOCK_SIZE);
+ public TmfDataRequest(Class<? extends TmfData> dataType, int index) {
+ this(dataType, index, ALL_DATA, DEFAULT_BLOCK_SIZE);
}
/**
- * @param range
- * @param nbEvents
- */
- public TmfDataRequest(TmfTimeRange range, int nbEvents) {
- this(range, 0, nbEvents, DEFAULT_BLOCK_SIZE);
- }
- /**
- * @param range
- * @param nbEvents
- * @param blockSize Size of the largest blocks expected
+ * @param index
+ * @param nbRequested
*/
- public TmfDataRequest(TmfTimeRange range, int nbEvents, int blockSize) {
- this(range, 0, nbEvents, blockSize);
+ public TmfDataRequest(Class<? extends TmfData> dataType, int index, int nbRequested) {
+ this(dataType, index, nbRequested, DEFAULT_BLOCK_SIZE);
}
/**
- * @param range
* @param index
- * @param nbEvents
- * @param blockSize Size of the largest blocks expected
+ * @param nbRequested
+ * @param blockSize
*/
- private TmfDataRequest(TmfTimeRange range, int index, int nbEvents, int blockSize) {
- fIndex = index;
- fRange = range;
- fNbRequestedEvents = nbEvents;
- fBlockSize = blockSize;
- fNbEvents = 0;
+ public TmfDataRequest(Class<? extends TmfData> dataType, int index, int nbRequested, int blockSize) {
+ fDataType = dataType;
+ fIndex = index;
+ fNbRequested = nbRequested;
+ fBlockSize = blockSize;
+ fNbRead = 0;
}
-
- // ========================================================================
+
+ // ------------------------------------------------------------------------
// Accessors
- // ========================================================================
+ // ------------------------------------------------------------------------
/**
* @return the index
}
/**
- * @return the requested time range
+ * @return the number of requested events (ALL_DATA = all)
*/
- public TmfTimeRange getRange() {
- return fRange;
- }
-
- /**
- * @return the number of requested events (-1 = all)
- */
- public int getNbRequestedEvents() {
- return fNbRequestedEvents;
+ public int getNbRequested() {
+ return fNbRequested;
}
/**
/**
* @return the number of events read so far
*/
- public int getNbEvents() {
- return fNbEvents;
+ public int getNbRead() {
+ return fNbRead;
}
/**
return fRequestCanceled;
}
- // ========================================================================
+ /**
+ * @return the requested data type
+ */
+ public Class<?> getDataType() {
+ return fDataType;
+ }
+
+ // ------------------------------------------------------------------------
// Operators
- // ========================================================================
+ // ------------------------------------------------------------------------
/**
* Sets the data object to specified value. To be called by the
* asynchronous method implementor.
* @param data Data value to set.
*/
- public synchronized void setData(V[] data) {
- fNbEvents += data.length;
+ public synchronized void setData(T[] data) {
+ fNbRead += data.length;
fData = data;
}
/**
* Returns the data value, null if not set.
*/
- public synchronized V[] getData() {
+ public synchronized T[] getData() {
return fData;
}
* <p>
* Implement me. Please.
*/
-public abstract class TmfEventRequest<T extends TmfEvent> extends TmfDataRequest<T> implements ITmfEventRequest<T> {
+public class TmfEventRequest<T extends TmfEvent> extends TmfDataRequest<T> {
// ------------------------------------------------------------------------
// Attributes
/**
* @param range
*/
- public TmfEventRequest(Class<T> dataType) {
+ public TmfEventRequest(Class<? extends TmfEvent> dataType) {
this(dataType, TmfTimeRange.Eternity, ALL_DATA, DEFAULT_BLOCK_SIZE);
}
/**
* @param range
*/
- public TmfEventRequest(Class<T> dataType, TmfTimeRange range) {
+ public TmfEventRequest(Class<? extends TmfEvent> dataType, TmfTimeRange range) {
this(dataType, range, ALL_DATA, DEFAULT_BLOCK_SIZE);
}
* @param range
* @param nbRequested
*/
- public TmfEventRequest(Class<T> dataType, TmfTimeRange range, int nbRequested) {
+ public TmfEventRequest(Class<? extends TmfEvent> dataType, TmfTimeRange range, int nbRequested) {
this(dataType, range, nbRequested, DEFAULT_BLOCK_SIZE);
}
* @param nbRequested
* @param blockSize Size of the largest blocks expected
*/
- public TmfEventRequest(Class<T> dataType, TmfTimeRange range, int nbRequested, int blockSize) {
+ public TmfEventRequest(Class<? extends TmfEvent> dataType, TmfTimeRange range, int nbRequested, int blockSize) {
super(dataType, 0, nbRequested, blockSize);
fRange = range;
}
return fRange;
}
- // ------------------------------------------------------------------------
- // Object
- // ------------------------------------------------------------------------
-
- @Override
- // All requests have a unique id
- public int hashCode() {
- return getRequestId();
- }
-
- @Override
- public boolean equals(Object other) {
- if (other instanceof TmfEventRequest<?>) {
- TmfEventRequest<?> request = (TmfEventRequest<?>) other;
- return super.equals(other) && request.fRange.equals(fRange);
- }
- return false;
- }
-
- @Override
- public String toString() {
- return "[TmfEventRequest(" + getRequestId() + "," + getDataType().getSimpleName()
- + "," + getRange() + "," + getNbRequested() + "," + getBlockize() + ")]";
- }
-
}
/*******************************************************************************
- * Copyright (c) 2009 Ericsson
+ * Copyright (c) 2009, 2010 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v1.0 which
// The set of event listeners and their corresponding handler methods.
// Note: listeners could be restricted to ITmfComponents but there is no
- // harm in letting anyone use this
+ // harm in letting anyone use this since it is not tied to anything but
+ // the signal data type.
static private Map<Object, Method[]> fListeners = new HashMap<Object, Method[]>();
// If requested, add universal signal tracer
- // TODO: to be revisited...
+ // TODO: Temporary solution: should be enabled/disabled dynamically
private static boolean fTraceIsActive = false;
private static TmfSignalTracer fSignalTracer;
static {
if (fTraceIsActive) {
fSignalTracer = TmfSignalTracer.getInstance();
- addListener(fSignalTracer);
+ register(fSignalTracer);
}
}
- public static synchronized void addListener(Object listener) {
+ public static synchronized void register(Object listener) {
Method[] methods = getSignalHandlerMethods(listener);
if (methods.length > 0)
fListeners.put(listener, methods);
}
- public static synchronized void removeListener(Object listener) {
+ public static synchronized void deregister(Object listener) {
fListeners.remove(listener);
}
}
}
- // Call the signal handlers
+ // Call the signal handlers
for (Map.Entry<Object, List<Method>> entry : listeners.entrySet()) {
for (Method method : entry.getValue()) {
try {
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2009 Ericsson
- *
- * 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Francois Chouinard - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.tmf.trace;
-
-import java.io.IOException;
-
-import org.eclipse.linuxtools.tmf.event.TmfEvent;
-
-/**
- * <b><u>ITmfEventParser</u></b>
- * <p>
- * TODO: Implement me. Please.
- */
-public interface ITmfEventParser {
-
- /**
- * @return
- * @throws IOException
- */
- public TmfEvent parseNextEvent(ITmfTrace stream, TmfTraceContext context) throws IOException;
-}
*/
public TmfEvent getNextEvent(TmfTraceContext context);
+ /**
+ * Return the event pointed by the supplied context (or null if
+ * no event left) and *does not* update the context.
+ *
+ * @return the next event in the stream
+ */
+ public TmfEvent parseEvent(TmfTraceContext context);
+
}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2009 Ericsson
- *
- * 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Francois Chouinard - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.tmf.trace;
-
-import java.util.Vector;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.linuxtools.tmf.component.TmfComponent;
-import org.eclipse.linuxtools.tmf.event.TmfEvent;
-import org.eclipse.linuxtools.tmf.event.TmfTimeRange;
-import org.eclipse.linuxtools.tmf.event.TmfTimestamp;
-import org.eclipse.linuxtools.tmf.request.ITmfRequestHandler;
-import org.eclipse.linuxtools.tmf.request.TmfDataRequest;
-import org.eclipse.linuxtools.tmf.signal.TmfSignalHandler;
-
-/**
- * <b><u>TmfExperiment</u></b>
- * <p>
- * TmfExperiment presents a time-ordered, unified view of a set of TmfTraces
- * that are part of a tracing experiment.
- * <p>
- */
-public class TmfExperiment extends TmfComponent implements ITmfRequestHandler<TmfEvent> {
-
-// TODO: Complete multi-trace experiment
-// TODO: Add support for dynamic addition/removal of traces
-// TODO: Add support for live streaming (notifications, incremental indexing, ...)
-
- // ========================================================================
- // Attributes
- // ========================================================================
-
- // The currently selected experiment
- private static TmfExperiment fCurrentExperiment;
-
- // The experiment ID
- private String fExperimentId;
-
- // The set of trace sthat constitute the experiment
- private Vector<ITmfTrace> fTraces;
-
- // The total number of events
- private int fNbEvents;
-
- // The experiment time range
- private TmfTimeRange fTimeRange;
-
- // The experiment reference timestamp (default: BigBang)
- private TmfTimestamp fEpoch;
-
-// // Indicates if the stream should be indexed synchronously (default: false)
-// private final boolean fWaitForIndexCompletion;
-
- // ========================================================================
- // Constructors/Destructor
- // ========================================================================
-
- /**
- * @param id
- * @param traces
- */
- public TmfExperiment(String id, ITmfTrace[] traces) {
- this(id, traces, TmfTimestamp.BigBang, DEFAULT_INDEX_PAGE_SIZE, false);
- }
-
- /**
- * @param id
- * @param traces
- * @param waitForIndexCompletion
- */
- public TmfExperiment(String id, ITmfTrace[] traces, boolean waitForIndexCompletion) {
- this(id, traces, TmfTimestamp.BigBang, DEFAULT_INDEX_PAGE_SIZE, waitForIndexCompletion);
- }
-
- /**
- * @param id
- * @param traces
- * @param epoch
- * @param waitForIndexCompletion
- */
- public TmfExperiment(String id, ITmfTrace[] traces, TmfTimestamp epoch, int indexPageSize, boolean waitForIndexCompletion) {
- super();
-
- fExperimentId = id;
- fTraces = new Vector<ITmfTrace>();
- for (ITmfTrace trace : traces) {
- fTraces.add(trace);
- }
- fEpoch = epoch;
- fIndexPageSize = indexPageSize;
-// fWaitForIndexCompletion = waitForIndexCompletion;
-
- updateNbEvents();
- updateTimeRange();
-// indexExperiment();
- }
-
- /**
- *
- */
- @Override
- public void dispose() {
- super.dispose();
- fTraces.clear();
- fCurrentExperiment= null;
- }
-
- // ========================================================================
- // Accessors
- // ========================================================================
-
- public static TmfExperiment getCurrentExperiment() {
- return fCurrentExperiment;
- }
-
- public String getExperimentId() {
- return fExperimentId;
- }
-
- public ITmfTrace[] getTraces() {
- ITmfTrace[] result = new ITmfTrace[fTraces.size()];
- return fTraces.toArray(result);
- }
-
- public TmfTimestamp getEpoch() {
- return fEpoch;
- }
-
- public TmfTimeRange getTimeRange() {
- return fTimeRange;
- }
-
- public int getNbEvents() {
- return fNbEvents;
- }
-
- /**
- * Returns the index of the first event with the requested timestamp.
- * If none, returns the index of the next event (if any).
- *
- * @param ts
- * @return
- */
- public long getIndex(TmfTimestamp ts) {
- // TODO: Go over all the traces
- ITmfTrace trace = fTraces.firstElement();
- TmfTraceContext context = trace.seekEvent(ts);
- return context.getIndex();
- }
-
- /**
- * Returns the timestamp of the event at the requested index.
- * If none, returns null.
- *
- * @param index
- * @return
- */
- public TmfTimestamp getTimestamp(int index) {
- // TODO: Go over all the traces
- ITmfTrace trace = fTraces.firstElement();
- TmfTraceContext context = trace.seekEvent(index);
- return context.getTimestamp();
- }
-
- // ========================================================================
- // Operators
- // ========================================================================
-
- /**
- * Add a trace to the experiment trace set
- *
- * @param trace
- */
- public void addTrace(ITmfTrace trace) {
- fTraces.add(trace);
- synchronized(this) {
- updateNbEvents();
- updateTimeRange();
- }
- }
-
- /**
- * Update the total number of events
- */
- private void updateNbEvents() {
- int nbEvents = 0;
- for (ITmfTrace trace : fTraces) {
- nbEvents += trace.getNbEvents();
- }
- fNbEvents = nbEvents;
- }
-
- /**
- * Update the global time range
- */
- private void updateTimeRange() {
- TmfTimestamp startTime = fTimeRange != null ? fTimeRange.getStartTime() : TmfTimestamp.BigCrunch;
- TmfTimestamp endTime = fTimeRange != null ? fTimeRange.getEndTime() : TmfTimestamp.BigBang;
-
- for (ITmfTrace trace : fTraces) {
- TmfTimestamp traceStartTime = trace.getTimeRange().getStartTime();
- if (traceStartTime.compareTo(startTime, true) < 0)
- startTime = traceStartTime;
-
- TmfTimestamp traceEndTime = trace.getTimeRange().getEndTime();
- if (traceEndTime.compareTo(endTime, true) > 0)
- endTime = traceEndTime;
- }
- fTimeRange = new TmfTimeRange(startTime, endTime);
- }
-
- // ========================================================================
- // ITmfRequestHandler
- // ========================================================================
-
- /* (non-Javadoc)
- * @see org.eclipse.linuxtools.tmf.request.ITmfRequestHandler#processRequest(org.eclipse.linuxtools.tmf.request.TmfDataRequest, boolean)
- */
- public void processRequest(TmfDataRequest<TmfEvent> request, boolean waitForCompletion) {
-
- // Process the request
- processDataRequest(request);
-
- // Wait for completion if needed
- if (waitForCompletion) {
- request.waitForCompletion();
- }
- }
-
- /**
- * Process a data request
- *
- * @param request
- */
- private void processDataRequest(final TmfDataRequest<TmfEvent> request) {
-
- // General request parameters
- final TmfTimestamp endTime;
- final long index;
-
- // Initialize request params depending on request type
- if (request.getRange() != null) {
- index = getIndex(request.getRange().getStartTime());
- endTime = request.getRange().getEndTime();
- } else {
- index = request.getIndex();
- endTime = TmfTimestamp.BigCrunch;
- }
-
- // Process the request
- Thread thread = new Thread() {
-
- @Override
- public void run() {
-
- // Key variables
- ITmfTrace[] traces = new ITmfTrace[0]; // The set of traces
- TmfTraceContext[] contexts; // The set of trace contexts
-
- // Extract the general request information
- int blockSize = request.getBlockize();
- int nbRequestedEvents = request.getNbRequestedEvents();
- if (nbRequestedEvents == -1) {
- nbRequestedEvents = Integer.MAX_VALUE;
- }
-
- // Create the result buffer
- Vector<TmfEvent> events = new Vector<TmfEvent>();
- int nbEvents = 0;
-
- // Initialize the traces array and position the traces
- // at the first requested event
- traces = fTraces.toArray(traces);
- contexts = new TmfTraceContext[traces.length];
- positionTraces(index, traces, contexts);
-
- // Get the ordered events
- TmfEvent event = getNextEvent(traces, contexts);
- while (!request.isCancelled() && nbEvents < nbRequestedEvents && event != null
- && event.getTimestamp().compareTo(endTime, false) < 0)
- {
- events.add(event);
- if (++nbEvents % blockSize == 0) {
- pushData(request, events);
- }
- // Avoid an unnecessary read passed the last event requested
- if (nbEvents < nbRequestedEvents)
- event = getNextEvent(traces, contexts);
- }
-
- if (!request.isCancelled() && !request.isFailed()) {
- pushData(request, events);
- request.done();
- }
- }
- };
- thread.start();
- }
-
- /**
- * Given an experiment event index, position the set of traces so a call
- * to getNextEvent() will retrieve the corresponding event.
- *
- * @param index
- * @param traces
- * @param contexts
- * @param nextEvents
- */
- private synchronized void positionTraces(long index, ITmfTrace[] traces, TmfTraceContext[] contexts) {
-
- // Compute the index page and corresponding index
- int page = (int) index / fIndexPageSize;
- int current = page * fIndexPageSize;
-
- // Retrieve the checkpoint and set the contexts (make copies)
- TmfTraceContext[] saveContexts = new TmfTraceContext[contexts.length];
- if (page < fExperimentIndex.size()) {
- saveContexts = fExperimentIndex.elementAt(page);
- for (int i = 0; i < contexts.length; i++) {
- contexts[i] = new TmfTraceContext(saveContexts[i]);
- }
- } else {
- // If the page entry doesn't exist (e.g. indexing not completed),
- // set contexts at the the last entry (if it exists)
- page = fExperimentIndex.size() - 1;
- if (page >= 0) {
- saveContexts = fExperimentIndex.elementAt(page);
- for (int i = 0; i < contexts.length; i++) {
- contexts[i] = new TmfTraceContext(saveContexts[i]);
- }
- current = page * fIndexPageSize;
- }
- // Index is empty... position traces at their beginning
- else {
- for (int i = 0; i < contexts.length; i++) {
- contexts[i] = new TmfTraceContext(traces[i].seekLocation(null));
- }
- current = 0;
- }
- }
-
- // Position the traces at the requested index
- while (current++ < index) {
- getNextEvent(traces, contexts);
- }
- }
-
- /**
- * Scan the next events from all traces and return the next one
- * in chronological order.
- *
- * @param traces
- * @param contexts
- * @param nextEvents
- * @return
- */
- private TmfEvent getNextEvent(ITmfTrace[] traces, TmfTraceContext[] contexts) {
- // TODO: Consider the time adjustment
- int trace = 0;
- TmfTimestamp timestamp = contexts[trace].getTimestamp();
- if (timestamp == null) {
- timestamp = TmfTimestamp.BigCrunch;
- }
- for (int i = 1; i < traces.length; i++) {
- if (contexts[i].getTimestamp() != null) {
- TmfTimestamp otherTS = contexts[i].getTimestamp();
- if (otherTS.compareTo(timestamp, true) < 0) {
- trace = i;
- timestamp = otherTS;
- }
- }
- }
- TmfEvent event = traces[trace].getNextEvent(contexts[trace]);
- return event;
- }
-
- /**
- * Format the result data and notify the requester.
- * Note: after handling, the data is *removed*.
- *
- * @param request
- * @param events
- */
- private void pushData(TmfDataRequest<TmfEvent> request, Vector<TmfEvent> events) {
- TmfEvent[] result = new TmfEvent[events.size()];
- events.toArray(result);
- request.setData(result);
- request.handleData();
- events.removeAllElements();
- }
-
- /* (non-Javadoc)
- * @see java.lang.Object#toString()
- */
- @Override
- public String toString() {
- return "[TmfExperiment (" + fExperimentId + ")]";
- }
-
- // ========================================================================
- // Indexing
- // ========================================================================
-
- /*
- * The experiment holds the globally ordered events of its set of traces.
- * It is expected to provide access to each individual event by index i.e.
- * it must be possible to request the Nth event of the experiment.
- *
- * The purpose of the index is to keep the information needed to rapidly
- * restore the traces contexts at regular intervals (every INDEX_PAGE_SIZE
- * event).
- */
-
- // The index page size
- private static final int DEFAULT_INDEX_PAGE_SIZE = 1000;
- private final int fIndexPageSize;
-
- // The experiment index
- private Vector<TmfTraceContext[]> fExperimentIndex = new Vector<TmfTraceContext[]>();
-
- // Indicates that an indexing job is already running
- private Boolean fIndexing = false;
-
- // The indexing job
- private IndexingJob job;
-
- /**
- * indexExperiment
- *
- * Creates the experiment index.
- */
- private void indexExperiment() {
-
- synchronized(fIndexing) {
- if (fIndexing) {
- // An indexing job is already running but a new request came
- // in (probably due to a change in the trace set). The index
- // being currently built is therefore already invalid.
- // TODO: Cancel and restart the job
- // TODO: Add support for dynamically adding/removing traces
- return;
- }
- fIndexing = true;
- }
-
- job = new IndexingJob(fExperimentId);
- job.schedule();
- try {
- job.join();
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
-// if (fWaitForIndexCompletion) {
-// ProgressMonitorDialog dialog = new ProgressMonitorDialog(null);
-// try {
-// // TODO: Handle cancel!
-// dialog.run(true, true, new IRunnableWithProgress() {
-// public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-// monitor.beginTask("Indexing " + fExperimentId, IProgressMonitor.UNKNOWN);
-// job.join();
-// monitor.done();
-// }
-// });
-// } catch (InvocationTargetException e) {
-// e.printStackTrace();
-// } catch (InterruptedException e) {
-// e.printStackTrace();
-// }
-// }
- }
-
- private class IndexingJob extends Job {
-
- public IndexingJob(String name) {
- super(name);
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
- */
- @Override
- protected IStatus run(IProgressMonitor monitor) {
-
- Vector<TmfTraceContext[]> indices = new Vector<TmfTraceContext[]>();
-
- // Minimal check
- if (fTraces.size() == 0) {
- fIndexing = false;
- return Status.OK_STATUS;
- }
-
- monitor.beginTask("Indexing " + fExperimentId, IProgressMonitor.UNKNOWN);
-
- ITmfTrace[] traces = new ITmfTrace[0];
- TmfTraceContext[] contexts;
- int nbTraces = fTraces.size();
-
- // Initialize the traces and contexts arrays
- traces = fTraces.toArray(traces);
- contexts = new TmfTraceContext[nbTraces];
- TmfTraceContext[] savedContexts = new TmfTraceContext[nbTraces];
- int nullEvents = 0;
- for (int i = 0; i < nbTraces; i++) {
- // Context of the first event of the trace
- contexts[i] = traces[i].seekLocation(null);
- savedContexts[i] = new TmfTraceContext(contexts[i].getLocation(), contexts[i].getTimestamp(), 0);
- if (contexts[i].getTimestamp() == null)
- nullEvents++;
- }
- // Check if there is anything to index
- if (nullEvents >= nbTraces) {
- fIndexing = false;
- return Status.OK_STATUS;
- }
- // FIXME: LTTng hack - start
-// indices.add(savedContexts); // TMF
- // FIXME: LTTng hack - end
-
- // Get the ordered events and populate the indices
- // FIXME: LTTng hack - start
-// int nbEvents = 0; // TMF
- int nbEvents = -1; // LTTng
- // FIXME: LTTng hack - end
- while ((getNextEvent(traces, contexts)) != null)
- {
- if (++nbEvents % fIndexPageSize == 0) {
- // Special case: if the total number of events is a multiple of the
- // DEFAULT_PAGE_SIZE then all the pending events are null. In that
- // case, we don't store an additional entry in the index array.
- nullEvents = 0;
- savedContexts = new TmfTraceContext[nbTraces];
- for (int i = 0; i < nbTraces; i++) {
- savedContexts[i] = new TmfTraceContext(contexts[i]);
- if (contexts[i].getTimestamp() == null)
- nullEvents++;
- }
- if (nullEvents < nbTraces) {
- indices.add(savedContexts);
- }
- }
-
- monitor.worked(1);
- if (monitor.isCanceled()) {
- monitor.done();
- return Status.CANCEL_STATUS;
- }
- }
-
- monitor.done();
- fExperimentIndex = indices;
-
-// dumpIndex();
-
- fIndexing = false;
- return Status.OK_STATUS;
- }
- }
-
-// /**
-// * Dump the experiment index
-// */
-// private void dumpIndex() {
-// System.out.println("-----");
-// System.out.println("Index of " + fExperimentId);
-// for (int i = 0; i < fExperimentIndex.size(); i++) {
-// System.out.println("Entry:" + i);
-// TmfTraceContext[] contexts = fExperimentIndex.get(i);
-// int nbEvents = 0;
-// for (int j = 0; j < contexts.length; j++) {
-// ITmfTrace trace = fTraces.get(j);
-// TmfTraceContext context = trace.seekLocation(contexts[j].getLocation());
-// TmfEvent event = fTraces.get(j).getNextEvent(new TmfTraceContext(context));
-// nbEvents += contexts[j].getIndex();
-// System.out.println(" [" + trace.getName() + "]"
-// + " index: " + contexts[j].getIndex()
-// + ", timestamp: " + contexts[j].getTimestamp()
-// + ", event: " + event.getTimestamp());
-// assert (contexts[j].getTimestamp().compareTo(event.getTimestamp(), false) == 0);
-// }
-// assert ((i+1) * fIndexPageSize == nbEvents);
-//
-// }
-// }
-
- // ========================================================================
- // Signal handlers
- // ========================================================================
-
- @TmfSignalHandler
- public void experimentSelected(TmfExperimentSelectedSignal signal) {
- fCurrentExperiment = this;
- indexExperiment();
- }
-
- @TmfSignalHandler
- public void experimentUpdated(TmfExperimentUpdatedSignal signal) {
-// indexExperiment();
- }
-
- @TmfSignalHandler
- public void traceUpdated(TmfTraceUpdatedSignal signal) {
- // TODO: Incremental index update
- synchronized(this) {
- updateNbEvents();
- updateTimeRange();
- }
- broadcastSignal(new TmfExperimentUpdatedSignal(this, this, signal.getTrace()));
- }
-}
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2009 Ericsson
- *
- * 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Francois Chouinard - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.tmf.trace;
-
-import org.eclipse.linuxtools.tmf.signal.TmfSignal;
-
-/**
- * <b><u>TmfExperimentSelectedSignal</u></b>
- * <p>
- * TODO: Implement me. Please.
- */
-public class TmfExperimentSelectedSignal extends TmfSignal {
-
- private final TmfExperiment fExperiment;
-
- public TmfExperimentSelectedSignal(Object source, TmfExperiment experiment) {
- super(source);
- fExperiment = experiment;
- }
-
- public TmfExperiment getExperiment() {
- return fExperiment;
- }
-
- @Override
- public String toString() {
- return "[TmfExperimentSelectedSignal (" + fExperiment.getExperimentId() + ")]";
- }
-}
+++ /dev/null
-/*******************************************************************************
- * Copyright (c) 2009 Ericsson
- *
- * 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Francois Chouinard - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.linuxtools.tmf.trace;
-
-import org.eclipse.linuxtools.tmf.signal.TmfSignal;
-
-/**
- * <b><u>TmfExperimentUpdatedSignal</u></b>
- * <p>
- * TODO: Implement me. Please.
- */
-public class TmfExperimentUpdatedSignal extends TmfSignal {
-
- private final TmfExperiment fExperiment;
- private final ITmfTrace fTrace;
-
- public TmfExperimentUpdatedSignal(Object source, TmfExperiment experiment, ITmfTrace trace) {
- super(source);
- fExperiment = experiment;
- fTrace = trace;
- }
-
- public TmfExperiment getExperiment() {
- return fExperiment;
- }
-
- public ITmfTrace getTrace() {
- return fTrace;
- }
-
- /* (non-Javadoc)
- * @see java.lang.Object#toString()
- */
- @Override
- public String toString() {
- return "[TmfExperimentUpdatedSignal (" + fExperiment.toString() + ", " + fTrace.toString() + ")]";
- }
-
-}
/*******************************************************************************
- * Copyright (c) 2009 Ericsson
+ * Copyright (c) 2009, 2010 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v1.0 which
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.linuxtools.tmf.component.TmfComponent;
+import org.eclipse.linuxtools.tmf.component.ITmfContext;
+import org.eclipse.linuxtools.tmf.component.TmfProvider;
import org.eclipse.linuxtools.tmf.event.TmfEvent;
import org.eclipse.linuxtools.tmf.event.TmfTimeRange;
import org.eclipse.linuxtools.tmf.event.TmfTimestamp;
-import org.eclipse.linuxtools.tmf.request.ITmfRequestHandler;
import org.eclipse.linuxtools.tmf.request.TmfDataRequest;
+import org.eclipse.linuxtools.tmf.request.TmfEventRequest;
/**
* <b><u>TmfTrace</u></b>
*
* TODO: Add support for live streaming (notifications, incremental indexing, ...)
*/
-public abstract class TmfTrace extends TmfComponent implements ITmfTrace, ITmfRequestHandler<TmfEvent> {
+public abstract class TmfTrace<T extends TmfEvent> extends TmfProvider<T> implements ITmfTrace {
- // ========================================================================
+ // ------------------------------------------------------------------------
// Constants
- // ========================================================================
+ // ------------------------------------------------------------------------
// The default number of events to cache
+ // TODO: Make the DEFAULT_CACHE_SIZE a preference
public static final int DEFAULT_CACHE_SIZE = 1000;
- // ========================================================================
+ // ------------------------------------------------------------------------
// Attributes
- // ========================================================================
+ // ------------------------------------------------------------------------
// The trace path
private final String fPath;
// The cache page size AND checkpoints interval
protected int fCacheSize;
- // Indicate if the stream should be pre-indexed
- private final boolean fWaitForIndexCompletion;
-
// The set of event stream checkpoints (for random access)
protected Vector<TmfTraceCheckpoint> fCheckpoints = new Vector<TmfTraceCheckpoint>();
// The time span of the event stream
private TmfTimeRange fTimeRange = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigBang);
- // ========================================================================
+ // ------------------------------------------------------------------------
// Constructors
- // ========================================================================
+ // ------------------------------------------------------------------------
/**
- * @param name
- * @param pageSize
- * @param data.index
+ * @param path
+ * @param cacheSize
* @throws FileNotFoundException
*/
- protected TmfTrace(String path, int pageSize, boolean waitForIndexCompletion) throws FileNotFoundException {
- super();
+ protected TmfTrace(Class<T> type, String path, int cacheSize) throws FileNotFoundException {
+ super(type);
int sep = path.lastIndexOf(File.separator);
fName = (sep >= 0) ? path.substring(sep + 1) : path;
fPath = path;
- fCacheSize = (pageSize > 0) ? pageSize : DEFAULT_CACHE_SIZE;
- fWaitForIndexCompletion = waitForIndexCompletion;
- }
-
- /**
- * @param name
- * @param cacheSize
- * @throws FileNotFoundException
- */
- protected TmfTrace(String name, boolean waitForIndexCompletion) throws FileNotFoundException {
- this(name, DEFAULT_CACHE_SIZE, waitForIndexCompletion);
- }
-
- /**
- * @param name
- * @param cacheSize
- * @throws FileNotFoundException
- */
- protected TmfTrace(String name, int pageSize) throws FileNotFoundException {
- this(name, pageSize, false);
+ fCacheSize = (cacheSize > 0) ? cacheSize : DEFAULT_CACHE_SIZE;
}
/**
- * @param name
+ * @param path
* @throws FileNotFoundException
*/
- protected TmfTrace(String name) throws FileNotFoundException {
- this(name, DEFAULT_CACHE_SIZE, false);
+ protected TmfTrace(Class<T> type, String path) throws FileNotFoundException {
+ this(type, path, DEFAULT_CACHE_SIZE);
}
- // ========================================================================
+ // ------------------------------------------------------------------------
// Accessors
- // ========================================================================
+ // ------------------------------------------------------------------------
/**
* @return the trace path
return fTimeRange;
}
+ /* (non-Javadoc)
+ * @see org.eclipse.linuxtools.tmf.trace.ITmfTrace#getStartTime()
+ */
public TmfTimestamp getStartTime() {
return fTimeRange.getStartTime();
}
+ /* (non-Javadoc)
+ * @see org.eclipse.linuxtools.tmf.trace.ITmfTrace#getEndTime()
+ */
public TmfTimestamp getEndTime() {
return fTimeRange.getEndTime();
}
- protected long getIndex(TmfTimestamp timestamp) {
- TmfTraceContext context = seekEvent(timestamp);
- return context.getIndex();
- }
-
- protected TmfTimestamp getTimestamp(int index) {
- TmfTraceContext context = seekEvent(index);
- return context.getTimestamp();
- }
-
- // ========================================================================
+// /**
+// * Return the event rank based on its timestamp
+// *
+// * @param timestamp
+// * @return
+// */
+// protected long getIndex(TmfTimestamp timestamp) {
+// TmfTraceContext context = seekEvent(timestamp);
+// return context.getIndex();
+// }
+
+// /**
+// * Return the event timestamp based on its rank
+// * @param index
+// * @return
+// */
+// protected TmfTimestamp getTimestamp(int index) {
+// TmfTraceContext context = seekEvent(index);
+// return context.getTimestamp();
+// }
+
+ // ------------------------------------------------------------------------
// Operators
- // ========================================================================
+ // ------------------------------------------------------------------------
protected void setTimeRange(TmfTimeRange range) {
fTimeRange = range;
fTimeRange = new TmfTimeRange(fTimeRange.getStartTime(), endTime);
}
+ // ------------------------------------------------------------------------
+ // TmfProvider
+ // ------------------------------------------------------------------------
+
+ @Override
+ public ITmfContext setContext(TmfDataRequest<T> request) {
+ if (request instanceof TmfEventRequest<?>) {
+ return seekEvent(((TmfEventRequest<T>) request).getRange().getStartTime());
+ }
+ return null;
+ }
+
+ /**
+ * Return the next piece of data based on the context supplied. The context
+ * would typically be updated for the subsequent read.
+ *
+ * @param context
+ * @return
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public T getNext(ITmfContext context) {
+ if (context instanceof TmfTraceContext) {
+ return (T) getNextEvent((TmfTraceContext) context);
+ }
+ return null;
+ }
+
+ @Override
+ public boolean isCompleted(TmfDataRequest<T> request, T data) {
+ if (request instanceof TmfEventRequest<?> && data != null) {
+ return data.getTimestamp().compareTo(((TmfEventRequest<T>) request).getRange().getEndTime(), false) > 0;
+ }
+ return true;
+ }
+
+
+ // ------------------------------------------------------------------------
+ // ITmfTrace
+ // ------------------------------------------------------------------------
+
/* (non-Javadoc)
* @see org.eclipse.linuxtools.tmf.trace.ITmfTrace#seekEvent(org.eclipse.linuxtools.tmf.event.TmfTimestamp)
*/
// Position the stream at the checkpoint
Object location;
- synchronized (fCheckpoints) { //Just in case we are re-indexing
- location = (index < fCheckpoints.size()) ? fCheckpoints.elementAt(index).getLocation() : null;
+ synchronized (fCheckpoints) {
+ if (fCheckpoints.size() > 0) {
+ if (index >= fCheckpoints.size()) {
+ index = fCheckpoints.size() - 1;
+ }
+ location = fCheckpoints.elementAt(index).getLocation();
+ }
+ else {
+ location = null;
+ }
}
TmfTraceContext nextEventContext = seekLocation(location);
- nextEventContext.setIndex(index * fCacheSize);
+ nextEventContext.setRank(index * fCacheSize);
TmfTraceContext currentEventContext = new TmfTraceContext(nextEventContext);
// And get the event
TmfEvent event = getNextEvent(nextEventContext);
while (event != null && event.getTimestamp().compareTo(timestamp, false) < 0) {
currentEventContext.setLocation(nextEventContext.getLocation());
- currentEventContext.incrIndex();
+ currentEventContext.incrRank();
event = getNextEvent(nextEventContext);
}
- currentEventContext.setTimestamp((event != null) ? event.getTimestamp() : null);
return currentEventContext;
}
// Position the stream at the previous checkpoint
int index = (int) position / fCacheSize;
Object location;
- synchronized (fCheckpoints) { //Just in case we are re-indexing
- location = (index < fCheckpoints.size()) ? fCheckpoints.elementAt(index).getLocation() : null;
+ synchronized (fCheckpoints) {
+ if (fCheckpoints.size() > 0) {
+ if (index >= fCheckpoints.size()) {
+ index = fCheckpoints.size() - 1;
+ }
+ location = fCheckpoints.elementAt(index).getLocation();
+ }
+ else {
+ location = null;
+ }
}
- TmfTraceContext nextEventContext = seekLocation(location);
- nextEventContext.setIndex(index * fCacheSize);
- TmfTraceContext currentEventContext = new TmfTraceContext(nextEventContext);
-
- // And locate the event (if it exists)
- TmfEvent event = getNextEvent(nextEventContext);
- while (event != null && currentEventContext.getIndex() < position) {
- currentEventContext.setLocation(nextEventContext.getLocation());
- currentEventContext.setTimestamp(event.getTimestamp());
- currentEventContext.incrIndex();
- event = getNextEvent(nextEventContext);
+ TmfTraceContext context = seekLocation(location);
+ long rank = index * fCacheSize;
+ context.setRank(rank);
+
+ if (rank < position) {
+ TmfEvent event = getNextEvent(context);
+ while (event != null && ++rank < position) {
+ event = getNextEvent(context);
+ }
}
- return currentEventContext;
+ return new TmfTraceContext(context.getLocation(), context.getRank());
}
/* (non-Javadoc)
* @see org.eclipse.linuxtools.tmf.trace.ITmfTrace#getNextEvent(org.eclipse.linuxtools.tmf.trace.ITmfTrace.TraceContext)
*/
- public TmfEvent getNextEvent(TmfTraceContext context) {
- // parseEvent updates the context
+ public synchronized TmfEvent getNextEvent(TmfTraceContext context) {
+ // parseEvent() does not update the context
TmfEvent event = parseEvent(context);
+ context.setLocation(getCurrentLocation());
if (event != null) {
+ context.incrRank();
processEvent(event);
}
return event;
}
/**
- * To be implemented by the subclass.
- */
- public abstract Object getCurrentLocation();
- public abstract TmfEvent parseEvent(TmfTraceContext context);
-
- /**
- * Hook for "special" processing by the extending class
+ * Hook for "special" processing by the concrete class
+ * (called by getNextEvent())
+ *
* @param event
*/
public void processEvent(TmfEvent event) {
// Do nothing by default
}
-
- // ========================================================================
- // ITmfRequestHandler
- // ========================================================================
- /* (non-Javadoc)
- * @see org.eclipse.linuxtools.tmf.eventlog.ITmfRequestHandler#processRequest(org.eclipse.linuxtools.tmf.eventlog.TmfDataRequest, boolean)
+ /**
+ * To be implemented by the concrete class
*/
- public void processRequest(TmfDataRequest<TmfEvent> request, boolean waitForCompletion) {
-
- // Process the request
- processDataRequest(request);
-
- // Wait for completion if needed
- if (waitForCompletion) {
- request.waitForCompletion();
- }
- }
-
- /**
- * Process a data request
- *
- * @param request
- */
- private void processDataRequest(final TmfDataRequest<TmfEvent> request) {
-
- // Initialize the trace context
- final TmfTraceContext context = (request.getRange() != null) ?
- seekEvent(request.getRange().getStartTime()) :
- seekEvent(request.getIndex());
-
- final TmfTimestamp endTime = (request.getRange() != null) ?
- request.getRange().getEndTime() :
- TmfTimestamp.BigCrunch;
-
- // Process the request
- Thread thread = new Thread() {
-
- @Override
- public void run() {
- // Extract the general request information
- int blockSize = request.getBlockize();
- int nbRequestedEvents = request.getNbRequestedEvents();
- if (nbRequestedEvents == -1) {
- nbRequestedEvents = Integer.MAX_VALUE;
- }
-
- // Create the result buffer
- Vector<TmfEvent> events = new Vector<TmfEvent>();
- int nbEvents = 0;
-
- // Get the ordered events
- TmfEvent event = getNextEvent(context);
- while (!request.isCancelled() && nbEvents < nbRequestedEvents && event != null
- && event.getTimestamp().compareTo(endTime, false) <= 0)
- {
- events.add(event);
- if (++nbEvents % blockSize == 0) {
- pushData(request, events);
- }
- // To avoid an unnecessary read passed the last event requested
- if (nbEvents < nbRequestedEvents)
- event = getNextEvent(context);
- }
- pushData(request, events);
- request.done();
- }
- };
- thread.start();
- }
+ public abstract Object getCurrentLocation();
+ public abstract TmfEvent parseEvent(TmfTraceContext context);
- /**
- * Format the result data and notify the requester.
- * Note: after handling, the data is *removed*.
- *
- * @param request
- * @param events
- */
- private void pushData(TmfDataRequest<TmfEvent> request, Vector<TmfEvent> events) {
- TmfEvent[] result = new TmfEvent[events.size()];
- events.toArray(result);
- request.setData(result);
- request.handleData();
- events.removeAllElements();
- }
+ // ------------------------------------------------------------------------
+ // toString
+ // ------------------------------------------------------------------------
/* (non-Javadoc)
* @see java.lang.Object#toString()
return "[TmfTrace (" + fName + "]";
}
- // ========================================================================
- // Trace indexing. Essentially, parse the stream asynchronously and build
- // the checkpoints index. This index is used to quickly find an event based
- // on a timestamp or an index.
- // ========================================================================
+ // ------------------------------------------------------------------------
+ // Indexing
+ // ------------------------------------------------------------------------
+ /*
+ * The purpose of the index is to keep the information needed to rapidly
+ * access a trace event based on its timestamp or rank.
+ *
+ * NOTE: As it is, doesn't work for streaming traces.
+ */
+
+ private IndexingJob job;
private Boolean fIndexing = false;
- public void indexStream() {
+
+ public void indexTrace(boolean waitForCompletion) {
synchronized (fIndexing) {
if (fIndexing) {
return;
fIndexing = true;
}
- final IndexingJob job = new IndexingJob("Indexing " + fName);
+ job = new IndexingJob("Indexing " + fName);
job.schedule();
- if (fWaitForIndexCompletion) {
+ if (waitForCompletion) {
try {
job.join();
} catch (InterruptedException e) {
- // TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
protected IStatus run(IProgressMonitor monitor) {
- int nbEvents = 0;
- TmfTimestamp startTime = new TmfTimestamp();
- TmfTimestamp lastTime = new TmfTimestamp();
-
monitor.beginTask("Indexing " + fName, IProgressMonitor.UNKNOWN);
+ int nbEvents = 0;
+ TmfTimestamp startTime = null;
+ TmfTimestamp lastTime = null;
+
+ fCheckpoints = new Vector<TmfTraceCheckpoint>();
+
try {
// Position the trace at the beginning
TmfTraceContext context = seekLocation(null);
- if (context.getTimestamp() == null) {
- return Status.OK_STATUS;
- }
- // FIXME: LTTng hack - start
-// fCheckpoints.add(new TmfTraceCheckpoint(context.getTimestamp(), context.getLocation())); // TMF
- // FIXME: LTTng hack - end
-
- TmfEvent event;
- startTime = context.getTimestamp();
- lastTime = context.getTimestamp();
- while ((event = getNextEvent(context)) != null) {
- TmfTimestamp timestamp = context.getTimestamp();
- if (timestamp != null) {
- lastTime = timestamp;
- }
- // FIXME: LTTng hack - start
-// if (((++nbEvents % fCacheSize) == 0) && (timestamp != null)) { // TMF
- if (((nbEvents++ % fCacheSize) == 0) && (timestamp != null)) { // LTTng
- // FIXME: LTTng hack - end
- fCheckpoints.add(new TmfTraceCheckpoint(timestamp, context.getLocation()));
- fNbEvents = nbEvents - 1;
- lastTime = context.getTimestamp();
+ Object location = context.getLocation();
+
+ TmfEvent event = getNextEvent(context);
+ startTime = new TmfTimestamp(event.getTimestamp());
+ lastTime = new TmfTimestamp(startTime);
+ while (event != null) {
+ lastTime = event.getTimestamp();
+ if ((nbEvents++ % fCacheSize) == 0) {
+ lastTime = new TmfTimestamp(event.getTimestamp());
+ fCheckpoints.add(new TmfTraceCheckpoint(lastTime, location));
+ fNbEvents = nbEvents;
fTimeRange = new TmfTimeRange(startTime, lastTime);
notifyListeners(new TmfTimeRange(startTime, lastTime));
}
}
- // Do whatever
- processEvent(event);
+ // We will need this location at the next iteration
+ if ((nbEvents % fCacheSize) == 0) {
+ location = context.getLocation();
+ }
+
+ event = getNextEvent(context);
}
}
finally {
}
notifyListeners(new TmfTimeRange(startTime, lastTime));
monitor.done();
-
}
// createOffsetsFile();
-// dumpCheckpoints();
+// dumpTraceCheckpoints();
return Status.OK_STATUS;
}
}
protected void notifyListeners(TmfTimeRange range) {
- broadcastSignal(new TmfTraceUpdatedSignal( (TmfTrace)this, (TmfTrace)this, range));
+ broadcast(new TmfTraceUpdatedSignal(this, this, range));
}
-// /**
-// * Dump the trace checkpoints
-// */
-// private void dumpCheckpoints() {
+// // ------------------------------------------------------------------------
+// // Toubleshooting code
+// // ------------------------------------------------------------------------
+//
+// private void dumpTraceCheckpoints() {
// System.out.println("-----");
// System.out.println("Checkpoints of " + fName);
// for (int i = 0; i < fCheckpoints.size(); i++) {
// TmfTraceCheckpoint checkpoint = fCheckpoints.get(i);
// TmfTraceContext context = new TmfTraceContext(checkpoint.getLocation());
-// TmfEvent event = getNextEvent(context);
+// TmfEvent event = getNext(context);
// System.out.println(" Entry: " + i + " timestamp: " + checkpoint.getTimestamp() + ", event: " + event.getTimestamp());
// assert((checkpoint.getTimestamp().compareTo(event.getTimestamp(), false) == 0));
// }
// private void createOffsetsFile() {
//
// try {
-// ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("LTTngOffsets.dat")));
+// // The trace context validation file is read by TmfTraceContext
+// ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("TmfTraceContext.dat")));
//
// TmfTraceContext context = null;
// context = seekLocation(null);
// e.printStackTrace();
// }
// }
-
+//
// private void createOffsetsFile() {
//
// try {
*/
public class TmfTraceCheckpoint implements Comparable<TmfTraceCheckpoint> {
- // ========================================================================
+ // ------------------------------------------------------------------------
// Attributes
- // ========================================================================
+ // ------------------------------------------------------------------------
private final TmfTimestamp fTimestamp;
private final Object fLocation;
- // ========================================================================
+ // ------------------------------------------------------------------------
// Constructors
- // ========================================================================
+ // ------------------------------------------------------------------------
/**
* @param ts
fLocation = location;
}
- // ========================================================================
+ // ------------------------------------------------------------------------
// Accessors
- // ========================================================================
+ // ------------------------------------------------------------------------
/**
* @return the checkpoint event timestamp
return fLocation;
}
- // ========================================================================
- // Operators
- // ========================================================================
+ // ------------------------------------------------------------------------
+ // Comparable
+ // ------------------------------------------------------------------------
public int compareTo(TmfTraceCheckpoint other) {
return fTimestamp.compareTo(other.fTimestamp, false);
/*******************************************************************************
- * Copyright (c) 2009 Ericsson
+ * Copyright (c) 2009, 2010 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v1.0 which
package org.eclipse.linuxtools.tmf.trace;
-import org.eclipse.linuxtools.tmf.event.TmfTimestamp;
+import org.eclipse.linuxtools.tmf.component.ITmfContext;
/**
* <b><u>TmfTraceContext</u></b>
* <p>
- * Trace context keeper. It ties a trace location to an event index and
- * timestamp. The context should be enough to restore the trace state
- * so the corresponding event can be read.
- *
+ * Trace context structure. It ties a trace location to an event index and
+ * timestamp. The context should be enough to restore the trace state so the
+ * corresponding event can be read.
+ * <p>
* Used to handle conflicting, concurrent accesses to the trace.
*/
-public class TmfTraceContext {
+public class TmfTraceContext implements ITmfContext, Cloneable {
private Object location;
- private TmfTimestamp timestamp;
- private long index;
+// private TmfTimestamp timestamp;
+ private long rank;
- public TmfTraceContext(Object loc, TmfTimestamp ts, long ind) {
+// public TmfTraceContext(Object loc, TmfTimestamp ts, long ind) {
+// location = loc;
+// timestamp = ts;
+// index = ind;
+// }
+
+ public TmfTraceContext(Object loc, long ind) {
+// this(loc, null, 0);
location = loc;
- timestamp = ts;
- index = ind;
+ rank = ind;
}
public TmfTraceContext(Object loc) {
- this(loc, null, 0);
+ this(loc, 0);
}
public TmfTraceContext(TmfTraceContext other) {
- this(other.location, other.timestamp, other.index);
+// this(other.location, other.timestamp, other.index);
+ this(other.location, other.rank);
+ }
+
+ public TmfTraceContext clone() {
+ try {
+ return (TmfTraceContext) super.clone();
+ } catch (CloneNotSupportedException e) {
+ e.printStackTrace();
+ }
+ return null;
}
public Object getLocation() {
-// validateLocation(location);
return location;
}
-// The FW expects the trace events to be ordered in time.
-// If this is not the case, this invalidates the Trace index (at least)
-// TODO: Throw an exception
-// private TmfTimestamp previous = TmfTimestamp.BigBang;
public void setLocation(Object loc) {
-// if (loc instanceof TmfTimestamp) {
-// TmfTimestamp ts = (TmfTimestamp) loc;
-// if (ts.compareTo(previous, false) < 0) {
-// System.out.println("Going back in time from " + previous + " to " + ts);
-// }
-// previous = ts;
-// }
-// validateLocation(loc);
location = loc;
}
- public TmfTimestamp getTimestamp() {
- return timestamp;
- }
+// public TmfTimestamp getTimestamp() {
+// return timestamp;
+// }
- public void setTimestamp(TmfTimestamp ts) {
- timestamp = ts;
- }
+// public void setTimestamp(TmfTimestamp ts) {
+// timestamp = ts;
+// }
- public void setIndex(long value) {
- index = value;
+ public void setRank(long value) {
+ rank = value;
}
- public long getIndex() {
- return index;
+ public long getRank() {
+ return rank;
}
- public void incrIndex() {
- index++;
+ public void incrRank() {
+ rank++;
}
// // ========================================================================
// // Toubleshooting code
// // ========================================================================
//
+// public Object getLocation() {
+// validateLocation(location);
+// return location;
+// }
+//
+// // The FW expects the trace events to be ordered in time.
+// // If this is not the case, this invalidates the Trace index (at least)
+// private TmfTimestamp previous = TmfTimestamp.BigBang;
+// public void setLocation(Object loc) {
+// if (loc instanceof TmfTimestamp) {
+// TmfTimestamp ts = (TmfTimestamp) loc;
+// if (ts.compareTo(previous, false) < 0) {
+// System.out.println("Going back in time from " + previous + " to " + ts);
+// }
+// previous = ts;
+// }
+// validateLocation(loc);
+// }
+//
// static private DataInputStream in;
// static private int size = 100000;
// static private String locations[] = new String[size];
// static public void init() {
// System.out.println("TmfTraceContext: Loading valid locations...");
// try {
-// in = new DataInputStream(new BufferedInputStream(new FileInputStream("LTTngOffsets.dat")));
+// // The trace context validation file is created by TmfTrace
+// in = new DataInputStream(new BufferedInputStream(new FileInputStream("TmfTraceContext.dat")));
// int i = 0;
// while (i < size) {
// locations[i] = in.readUTF();
// }
// System.out.println("TmfTraceContext: Done.");
// }
-
+//
// private boolean bsearch(long key) {
// int first = 0;
// int last = size;