import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimeRange;
import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
import org.eclipse.tracecompass.tmf.core.trace.TmfTraceContext;
+import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager;
/**
* A Linux trace context is a context that stores OS related actions as well as
/** An invalid thread id */
public static final int INVALID_THREAD_ID = -1;
- private int fCpu = INVALID_CPU;
- private int fTid = INVALID_THREAD_ID;
+ private final int fCpu;
+ private final int fTid;
private final ITmfTrace fTrace;
/**
*/
public LinuxTraceContext(TmfTimeRange selection, TmfTimeRange windowRange, @Nullable IFile editorFile, @Nullable ITmfFilter filter, ITmfTrace trace) {
super(selection, windowRange, editorFile, filter);
+ fCpu = INVALID_CPU;
+ fTid = INVALID_THREAD_ID;
fTrace = trace;
}
@Override
public void receive(@NonNull TmfTraceModelSignal signal) {
if (signal.getHostId().equals(fTrace.getHostId())) {
- if (signal instanceof TmfThreadSelectedSignal) {
- fTid = ((TmfThreadSelectedSignal) signal).getThreadId();
- } else if (signal instanceof TmfCpuSelectedSignal) {
- fCpu = ((TmfCpuSelectedSignal) signal).getCore();
- }
+ TmfTraceManager.getInstance().updateTraceContext(fTrace, builder -> {
+ if (builder instanceof LinuxBuilder) {
+ if (signal instanceof TmfThreadSelectedSignal) {
+ ((LinuxBuilder) builder).setTid(((TmfThreadSelectedSignal) signal).getThreadId());
+ } else if (signal instanceof TmfCpuSelectedSignal) {
+ ((LinuxBuilder) builder).setCpu(((TmfCpuSelectedSignal) signal).getCore());
+ }
+ }
+ return builder;
+ });
}
}
public TmfTraceContext build() {
return new LinuxTraceContext(this);
}
+
+ /**
+ * Sets the current CPU.
+ *
+ * @param cpu
+ * the current CPU
+ * @return this {@code Builder} object
+ */
+ public Builder setCpu(int cpu) {
+ this.cpu = cpu;
+ return this;
+ }
+
+ /**
+ * Sets the current TID.
+ *
+ * @param tid
+ * the current TID
+ * @return this {@code Builder} object
+ */
+ public Builder setTid(int tid) {
+ this.tid = tid;
+ return this;
+ }
}
}
/*******************************************************************************
- * Copyright (c) 2014, 2016 École Polytechnique de Montréal and others
+ * Copyright (c) 2014, 2017 École Polytechnique de Montréal and others
*
* 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.tracecompass.internal.analysis.os.linux.ui.views.cpuusage;
-import static org.eclipse.tracecompass.common.core.NonNullUtils.checkNotNull;
-
import java.util.Set;
import java.util.TreeSet;
/**
* Save a data in the data map of {@link TmfTraceContext}
*/
- private static void saveData(@NonNull String key, Object data) {
- TmfTraceContext ctx = TmfTraceManager.getInstance().getCurrentTraceContext();
- ctx.setData(key, checkNotNull(data));
+ private static void saveData(@NonNull String key, @NonNull Object data) {
+ ITmfTrace trace = TmfTraceManager.getInstance().getActiveTrace();
+ if (trace == null) {
+ return;
+ }
+ TmfTraceManager.getInstance().updateTraceContext(trace,
+ builder -> builder.setData(key, data));
}
private static Object getData(@NonNull String key) {
/**********************************************************************
- * Copyright (c) 2016 École Polytechnique de Montréal
+ * Copyright (c) 2016, 2017 École Polytechnique de Montréal and others
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v1.0 which
KernelMemoryUsageEntry entry = (KernelMemoryUsageEntry) structSelection;
fTreeViewerReference.setSelectedThread(entry.getTid());
((KernelMemoryUsageViewer) getChartViewer()).setSelectedThread(entry.getTid());
- TmfTraceContext ctx = TmfTraceManager.getInstance().getCurrentTraceContext();
- ctx.setData(KERNEL_MEMORY, checkNotNull(entry.getTid()));
+ ITmfTrace trace = TmfTraceManager.getInstance().getActiveTrace();
+ if (trace == null) {
+ return;
+ }
+ TmfTraceManager.getInstance().updateTraceContext(trace,
+ builder -> builder.setData(KERNEL_MEMORY, checkNotNull(entry.getTid())));
}
}
}
/*******************************************************************************
- * Copyright (c) 2012, 2016 Ericsson, École Polytechnique de Montréal
+ * Copyright (c) 2012, 2017 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
@TmfSignalHandler
public void listenToCpu(TmfCpuSelectedSignal signal) {
int data = signal.getCore() >= 0 ? signal.getCore() : -1;
- TmfTraceContext ctx = TmfTraceManager.getInstance().getCurrentTraceContext();
- ctx.setData(RESOURCES_FOLLOW_CPU, data);
+ ITmfTrace trace = getTrace();
+ if (trace == null) {
+ return;
+ }
+ TmfTraceManager.getInstance().updateTraceContext(trace,
+ builder -> builder.setData(RESOURCES_FOLLOW_CPU, data));
}
}
* @param value
* The value of the data
* @since 2.1
+ * @deprecated Use
+ * {@link TmfTraceManager#updateTraceContext(ITmfTrace, java.util.function.UnaryOperator)}
+ * and apply {@link Builder#setData(String, Object)} instead.
*/
+ @Deprecated
public synchronized void setData(String key, Object value) {
fData.put(key, value);
}
* @param data
* The map of data to copy
* @since 2.1
+ * @deprecated Use
+ * {@link TmfTraceManager#updateTraceContext(ITmfTrace, java.util.function.UnaryOperator)}
+ * and apply {@link Builder#setData(Map)} instead.
*/
+ @Deprecated
public synchronized void setData(Map<String, Object> data) {
fData.putAll(data);
}
this.filter = filter;
return this;
}
+
+ /**
+ * Sets a data mapping.
+ *
+ * @param key
+ * The key of the data
+ * @param value
+ * The value of the data
+ * @return this {@code Builder} object
+ */
+ public Builder setData(String key, Object value) {
+ this.data.put(key, value);
+ return this;
+ }
+
+ /**
+ * Sets data mappings.
+ *
+ * @param data
+ * The map of data
+ * @return this {@code Builder} object
+ */
+ public Builder setData(Map<String, Object> data) {
+ this.data.putAll(data);
+ return this;
+ }
}
@Override
/*******************************************************************************
- * Copyright (c) 2013, 2016 Ericsson
+ * Copyright (c) 2013, 2017 Ericsson and others
*
* 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.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.function.UnaryOperator;
import org.apache.commons.io.FileUtils;
import org.eclipse.core.resources.IFile;
return curCtx;
}
+ /**
+ * Get the {@link TmfTraceContext} of the given trace.
+ *
+ * @param trace
+ * The trace or experiment.
+ * @return The trace's context.
+ * @since 2.3
+ */
+ public synchronized TmfTraceContext getTraceContext(ITmfTrace trace) {
+ TmfTraceContext curCtx = fTraces.get(trace);
+ if (curCtx == null) {
+ /* The trace is not opened. */
+ return TmfTraceContext.NULL_CONTEXT;
+ }
+ return curCtx;
+ }
+
// ------------------------------------------------------------------------
// Public utility methods
// ------------------------------------------------------------------------
refreshSupplementaryFiles(trace);
}
+ /**
+ * Update the trace context of a given trace.
+ *
+ * @param trace
+ * The trace
+ * @param updater
+ * the function to apply to the trace context's builder
+ * @since 2.3
+ */
+ public synchronized void updateTraceContext(ITmfTrace trace, UnaryOperator<TmfTraceContext.Builder> updater) {
+ TmfTraceContext ctx = getTraceContext(trace);
+ if (!ctx.equals(TmfTraceContext.NULL_CONTEXT)) {
+ fTraces.put(trace, checkNotNull(updater.apply(ctx.builder())).build());
+ }
+ }
+
// ------------------------------------------------------------------------
// Signal handlers
// ------------------------------------------------------------------------
*/
@TmfSignalHandler
public synchronized void filterApplied(TmfEventFilterAppliedSignal signal) {
- final ITmfTrace trace = signal.getTrace();
- TmfTraceContext context = fTraces.get(trace);
- if (context == null) {
- throw new RuntimeException();
+ ITmfTrace trace = signal.getTrace();
+ if (trace == null) {
+ return;
}
- final TmfTraceContext newContext = context.builder()
- .setFilter(signal.getEventFilter())
- .build();
- fTraces.put(trace, newContext);
+ updateTraceContext(trace, builder ->
+ builder.setFilter(signal.getEventFilter()));
}
/**
final ITmfTimestamp beginTs = signal.getBeginTime();
final ITmfTimestamp endTs = signal.getEndTime();
- for (Map.Entry<ITmfTrace, TmfTraceContext> entry : fTraces.entrySet()) {
- final ITmfTrace trace = entry.getKey();
+ for (ITmfTrace trace : fTraces.keySet()) {
if (beginTs.intersects(getValidTimeRange(trace)) || endTs.intersects(getValidTimeRange(trace))) {
- TmfTraceContext prevCtx = checkNotNull(entry.getValue());
-
- /*
- * We want to update the selection range, but keep everything
- * else the same as the previous trace context.
- */
- TmfTimeRange newSelectionRange = new TmfTimeRange(beginTs, endTs);
- TmfTraceContext newCtx = prevCtx.builder()
- .setSelection(newSelectionRange)
- .build();
- entry.setValue(newCtx);
+ updateTraceContext(trace, builder ->
+ builder.setSelection(new TmfTimeRange(beginTs, endTs)));
}
}
}
*/
@TmfSignalHandler
public synchronized void windowRangeUpdated(final TmfWindowRangeUpdatedSignal signal) {
- for (Map.Entry<ITmfTrace, TmfTraceContext> entry : fTraces.entrySet()) {
- final ITmfTrace trace = entry.getKey();
- final TmfTraceContext prevCtx = checkNotNull(entry.getValue());
-
+ for (ITmfTrace trace : fTraces.keySet()) {
final TmfTimeRange validTr = getValidTimeRange(trace);
if (validTr == null) {
return;
/* Determine the new time range */
TmfTimeRange targetTr = signal.getCurrentRange().getIntersection(validTr);
- TmfTimeRange newWindowTr = (targetTr == null ? prevCtx.getWindowRange() : targetTr);
-
- /* Keep the values from the old context, except for the window range */
- TmfTraceContext newCtx = prevCtx.builder()
- .setWindowRange(newWindowTr)
- .build();
- entry.setValue(newCtx);
+ if (targetTr != null) {
+ updateTraceContext(trace, builder ->
+ builder.setWindowRange(targetTr));
+ }
}
}