Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'lttng/org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/tmf/core/trace/TmfExperiment.java')
-rw-r--r--lttng/org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/tmf/core/trace/TmfExperiment.java117
1 files changed, 103 insertions, 14 deletions
diff --git a/lttng/org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/tmf/core/trace/TmfExperiment.java b/lttng/org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/tmf/core/trace/TmfExperiment.java
index 8ecd7ed5da..8f5d2c6181 100644
--- a/lttng/org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/tmf/core/trace/TmfExperiment.java
+++ b/lttng/org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/tmf/core/trace/TmfExperiment.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009, 2013 Ericsson
+ * Copyright (c) 2009, 2013 Ericsson, École Polytechnique de Montréal
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v1.0 which
@@ -11,18 +11,24 @@
* Francois Chouinard - Updated as per TMF Trace Model 1.0
* Patrick Tasse - Updated for removal of context clone
* Patrick Tasse - Updated for ranks in experiment location
+ * Geneviève Bastien - Added support of experiment synchronization
*******************************************************************************/
package org.eclipse.linuxtools.tmf.core.trace;
+import java.io.File;
+
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
+import org.eclipse.linuxtools.internal.tmf.core.Activator;
import org.eclipse.linuxtools.internal.tmf.core.trace.TmfExperimentContext;
import org.eclipse.linuxtools.internal.tmf.core.trace.TmfExperimentLocation;
import org.eclipse.linuxtools.internal.tmf.core.trace.TmfLocationArray;
+import org.eclipse.linuxtools.tmf.core.TmfCommonConstants;
import org.eclipse.linuxtools.tmf.core.event.ITmfEvent;
import org.eclipse.linuxtools.tmf.core.exceptions.TmfTraceException;
import org.eclipse.linuxtools.tmf.core.request.ITmfDataRequest;
@@ -30,6 +36,9 @@ import org.eclipse.linuxtools.tmf.core.request.ITmfEventRequest;
import org.eclipse.linuxtools.tmf.core.signal.TmfSignalHandler;
import org.eclipse.linuxtools.tmf.core.signal.TmfTraceOpenedSignal;
import org.eclipse.linuxtools.tmf.core.signal.TmfTraceRangeUpdatedSignal;
+import org.eclipse.linuxtools.tmf.core.signal.TmfTraceSynchronizedSignal;
+import org.eclipse.linuxtools.tmf.core.synchronization.SynchronizationAlgorithm;
+import org.eclipse.linuxtools.tmf.core.synchronization.SynchronizationManager;
import org.eclipse.linuxtools.tmf.core.timestamp.ITmfTimestamp;
import org.eclipse.linuxtools.tmf.core.timestamp.TmfTimeRange;
import org.eclipse.linuxtools.tmf.core.timestamp.TmfTimestamp;
@@ -50,6 +59,13 @@ public class TmfExperiment extends TmfTrace implements ITmfEventParser {
// ------------------------------------------------------------------------
/**
+ * The file name of the Synchronization
+ *
+ * @since 3.0
+ */
+ public final static String SYNCHRONIZATION_FILE_NAME = "synchronization.bin"; //$NON-NLS-1$
+
+ /**
* The default index page size
*/
public static final int DEFAULT_INDEX_PAGE_SIZE = 5000;
@@ -78,9 +94,12 @@ public class TmfExperiment extends TmfTrace implements ITmfEventParser {
// ------------------------------------------------------------------------
/**
- * @param type the event type
- * @param id the experiment id
- * @param traces the experiment set of traces
+ * @param type
+ * the event type
+ * @param id
+ * the experiment id
+ * @param traces
+ * the experiment set of traces
*/
public TmfExperiment(final Class<? extends ITmfEvent> type, final String id, final ITmfTrace[] traces) {
this(type, id, traces, DEFAULT_INDEX_PAGE_SIZE, null);
@@ -102,12 +121,15 @@ public class TmfExperiment extends TmfTrace implements ITmfEventParser {
this(type, id, traces, DEFAULT_INDEX_PAGE_SIZE, resource);
}
-
/**
- * @param type the event type
- * @param path the experiment path
- * @param traces the experiment set of traces
- * @param indexPageSize the experiment index page size
+ * @param type
+ * the event type
+ * @param path
+ * the experiment path
+ * @param traces
+ * the experiment set of traces
+ * @param indexPageSize
+ * the experiment index page size
*/
public TmfExperiment(final Class<? extends ITmfEvent> type, final String path, final ITmfTrace[] traces, final int indexPageSize) {
this(type, path, traces, indexPageSize, null);
@@ -140,6 +162,14 @@ public class TmfExperiment extends TmfTrace implements ITmfEventParser {
}
fTraces = traces;
+
+ if (resource != null) {
+ try {
+ this.synchronizeTraces();
+ } catch (TmfTraceException e) {
+ Activator.logError("Error synchronizing experiment", e); //$NON-NLS-1$
+ }
+ }
}
/**
@@ -195,7 +225,8 @@ public class TmfExperiment extends TmfTrace implements ITmfEventParser {
* Returns the timestamp of the event at the requested index. If none,
* returns null.
*
- * @param index the event index (rank)
+ * @param index
+ * the event index (rank)
* @return the corresponding event timestamp
* @since 2.0
*/
@@ -209,7 +240,8 @@ public class TmfExperiment extends TmfTrace implements ITmfEventParser {
/**
* Set the file to be used for bookmarks on this experiment
*
- * @param file the bookmarks file
+ * @param file
+ * the bookmarks file
*/
public void setBookmarksFile(final IFile file) {
fBookmarksFile = file;
@@ -240,8 +272,8 @@ public class TmfExperiment extends TmfTrace implements ITmfEventParser {
}
if (request instanceof ITmfEventRequest
- && !TmfTimestamp.BIG_BANG.equals(((ITmfEventRequest) request).getRange().getStartTime())
- && request.getIndex() == 0)
+ && !TmfTimestamp.BIG_BANG.equals(((ITmfEventRequest) request).getRange().getStartTime())
+ && request.getIndex() == 0)
{
final ITmfContext context = seekEvent(((ITmfEventRequest) request).getRange().getStartTime());
((ITmfEventRequest) request).setStartIndex((int) context.getRank());
@@ -362,7 +394,8 @@ public class TmfExperiment extends TmfTrace implements ITmfEventParser {
TmfExperimentContext expContext = (TmfExperimentContext) context;
- // If an event was consumed previously, first get the next one from that trace
+ // If an event was consumed previously, first get the next one from that
+ // trace
final int lastTrace = expContext.getLastTrace();
if (lastTrace != TmfExperimentContext.NO_TRACE) {
final ITmfContext traceContext = expContext.getContexts()[lastTrace];
@@ -425,6 +458,62 @@ public class TmfExperiment extends TmfTrace implements ITmfEventParser {
return initTs;
}
+ /**
+ * Synchronizes the traces of an experiment. By default it only tries to
+ * read a synchronization file if it exists
+ *
+ * @return The synchronization object
+ * @throws TmfTraceException
+ * propagate TmfTraceExceptions
+ * @since 3.0
+ */
+ public synchronized SynchronizationAlgorithm synchronizeTraces() throws TmfTraceException {
+ return synchronizeTraces(false);
+ }
+
+ /**
+ * Synchronizes the traces of an experiment.
+ *
+ * @param doSync
+ * Whether to actually synchronize or just try opening a sync
+ * file
+ * @return The synchronization object
+ * @throws TmfTraceException
+ * propagate TmfTraceExceptions
+ * @since 3.0
+ */
+ public synchronized SynchronizationAlgorithm synchronizeTraces(boolean doSync) throws TmfTraceException {
+
+ /* Set up the path to the synchronization file we'll use */
+ IResource resource = this.getResource();
+ String supplDirectory = null;
+
+ try {
+ /* get the directory where the file will be stored. */
+ if (resource != null) {
+ supplDirectory = resource.getPersistentProperty(TmfCommonConstants.TRACE_SUPPLEMENTARY_FOLDER);
+ }
+ } catch (CoreException e) {
+ throw new TmfTraceException(e.toString(), e);
+ }
+
+ final File syncFile = (supplDirectory != null) ? new File(supplDirectory + File.separator + SYNCHRONIZATION_FILE_NAME) : null;
+
+ final SynchronizationAlgorithm syncAlgo = SynchronizationManager.synchronizeTraces(syncFile, fTraces, doSync);
+
+ final TmfTraceSynchronizedSignal signal = new TmfTraceSynchronizedSignal(this, syncAlgo);
+
+ /* Broadcast in separate thread to prevent deadlock */
+ new Thread() {
+ @Override
+ public void run() {
+ broadcast(signal);
+ }
+ }.start();
+
+ return syncAlgo;
+ }
+
@Override
@SuppressWarnings("nls")
public synchronized String toString() {

Back to the top