The handling of signal TmfTraceUpdated is now done in a
ProcessTraceThread. There is only one such thread per trace active at a
time. If an update is requested while a thread is active, the thread is
marked to be restarted after its current iteration completion.
The starting or restarting of a ProcessTraceThread is consolidated in a
method and synchronized.
The ProcessTraceThread now always processes the full time range of the
trace, even when the view is opened with a trace already opened.
A missing synchronization on DecorateThread concurrent access is added.
Method ITimeDataProvider.resetStartFinishTime(boolean) is added to allow
the TimeChartView to reset its window range without notifying listeners.
Change-Id: I0d49d2712af4e5c645bd61bfde46ba37fc42779c
Signed-off-by: Patrick Tasse <patrick.tasse@gmail.com>
Reviewed-on: https://git.eclipse.org/r/73996
Reviewed-by: Hudson CI
Reviewed-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
Reviewed-by: Bernd Hufmann <bernd.hufmann@ericsson.com>
Tested-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
private final List<TimeChartAnalysisEntry> fTimeAnalysisEntries = new ArrayList<>();
private final Map<ITmfTrace, TimeChartDecorationProvider> fDecorationProviders = new HashMap<>();
private final List<DecorateThread> fDecorateThreads = new ArrayList<>();
private final List<TimeChartAnalysisEntry> fTimeAnalysisEntries = new ArrayList<>();
private final Map<ITmfTrace, TimeChartDecorationProvider> fDecorationProviders = new HashMap<>();
private final List<DecorateThread> fDecorateThreads = new ArrayList<>();
+ private final Map<ITmfTrace, ProcessTraceThread> fProcessTraceThreads = new HashMap<>();
private long fStartTime = 0;
private long fStopTime = Long.MAX_VALUE;
private boolean fRefreshBusy = false;
private long fStartTime = 0;
private long fStopTime = Long.MAX_VALUE;
private boolean fRefreshBusy = false;
TimeChartAnalysisEntry timeAnalysisEntry = new TimeChartAnalysisEntry(trace, fDisplayWidth * 2);
fTimeAnalysisEntries.add(timeAnalysisEntry);
fDecorationProviders.put(trace, new TimeChartDecorationProvider(bookmarksFile));
TimeChartAnalysisEntry timeAnalysisEntry = new TimeChartAnalysisEntry(trace, fDisplayWidth * 2);
fTimeAnalysisEntries.add(timeAnalysisEntry);
fDecorationProviders.put(trace, new TimeChartDecorationProvider(bookmarksFile));
- Thread thread = new ProcessTraceThread(timeAnalysisEntry);
- thread.start();
+ startProcessTraceThread(timeAnalysisEntry);
}
fViewer.setInput(fTimeAnalysisEntries.toArray(new TimeChartAnalysisEntry[0]));
}
fViewer.setInput(fTimeAnalysisEntries.toArray(new TimeChartAnalysisEntry[0]));
@Override
public void dispose() {
ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
@Override
public void dispose() {
ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
- for (DecorateThread thread : fDecorateThreads) {
- thread.cancel();
+ synchronized (fDecorateThreads) {
+ for (DecorateThread thread : fDecorateThreads) {
+ thread.cancel();
+ }
}
ColorSettingsManager.removeColorSettingsListener(this);
super.dispose();
}
ColorSettingsManager.removeColorSettingsListener(this);
super.dispose();
+ private void startProcessTraceThread(TimeChartAnalysisEntry entry) {
+ synchronized (fProcessTraceThreads) {
+ ProcessTraceThread thread = fProcessTraceThreads.get(entry.getTrace());
+ if (thread != null) {
+ thread.restart();
+ } else {
+ thread = new ProcessTraceThread(entry);
+ fProcessTraceThreads.put(entry.getTrace(), thread);
+ thread.start();
+ }
+ }
+ }
+
private class ProcessTraceThread extends Thread {
private final TimeChartAnalysisEntry fTimeAnalysisEntry;
private class ProcessTraceThread extends Thread {
private final TimeChartAnalysisEntry fTimeAnalysisEntry;
+ private boolean fRestart;
public ProcessTraceThread(TimeChartAnalysisEntry timeAnalysisEntry) {
super("ProcessTraceJob:" + timeAnalysisEntry.getName()); //$NON-NLS-1$
fTimeAnalysisEntry = timeAnalysisEntry;
}
public ProcessTraceThread(TimeChartAnalysisEntry timeAnalysisEntry) {
super("ProcessTraceJob:" + timeAnalysisEntry.getName()); //$NON-NLS-1$
fTimeAnalysisEntry = timeAnalysisEntry;
}
+ public void restart() {
+ synchronized (fProcessTraceThreads) {
+ fRestart = true;
+ }
+ }
+
@Override
public void run() {
@Override
public void run() {
- TmfTimeRange range = TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange();
-
- updateTraceEntry(fTimeAnalysisEntry, Long.MAX_VALUE,
- range.getStartTime().toNanos(),
- range.getEndTime().toNanos());
+ while (true) {
+ updateTraceEntry(fTimeAnalysisEntry, Long.MAX_VALUE,
+ TmfTimestamp.BIG_BANG.toNanos(),
+ TmfTimestamp.BIG_CRUNCH.toNanos());
+ synchronized (fProcessTraceThreads) {
+ if (fRestart) {
+ fRestart = false;
+ } else {
+ fProcessTraceThreads.remove(fTimeAnalysisEntry.getTrace());
+ return;
+ }
+ }
+ }
return;
}
fViewer.setInput(fTimeAnalysisEntries.toArray(new TimeChartAnalysisEntry[0]));
return;
}
fViewer.setInput(fTimeAnalysisEntries.toArray(new TimeChartAnalysisEntry[0]));
- fViewer.resetStartFinishTime();
+ fViewer.resetStartFinishTime(false);
synchronized (fSyncObj) {
fRefreshBusy = false;
if (fRefreshPending) {
synchronized (fSyncObj) {
fRefreshBusy = false;
if (fRefreshPending) {
timeAnalysisEntry = new TimeChartAnalysisEntry(trace, fDisplayWidth * 2);
fTimeAnalysisEntries.add(timeAnalysisEntry);
fDecorationProviders.put(trace, new TimeChartDecorationProvider(bookmarksFile));
timeAnalysisEntry = new TimeChartAnalysisEntry(trace, fDisplayWidth * 2);
fTimeAnalysisEntries.add(timeAnalysisEntry);
fDecorationProviders.put(trace, new TimeChartDecorationProvider(bookmarksFile));
- Thread thread = new ProcessTraceThread(timeAnalysisEntry);
- thread.start();
+ startProcessTraceThread(timeAnalysisEntry);
for (int i = 0; i < fTimeAnalysisEntries.size(); i++) {
TimeChartAnalysisEntry timeAnalysisEntry = fTimeAnalysisEntries.get(i);
if (timeAnalysisEntry.getTrace().equals(trace)) {
for (int i = 0; i < fTimeAnalysisEntries.size(); i++) {
TimeChartAnalysisEntry timeAnalysisEntry = fTimeAnalysisEntries.get(i);
if (timeAnalysisEntry.getTrace().equals(trace)) {
- updateTraceEntry(timeAnalysisEntry, Long.MAX_VALUE, 0, Long.MAX_VALUE);
+ startProcessTraceThread(timeAnalysisEntry);
fTimeRangeFixed = false;
}
fTimeRangeFixed = false;
}
+ /**
+ * @since 2.0
+ */
+ @Override
+ public void resetStartFinishTime(boolean notify) {
+ if (notify) {
+ setStartFinishTimeNotify(fTime0Bound, fTime1Bound);
+ } else {
+ setStartFinishTime(fTime0Bound, fTime1Bound);
+ }
+ fTimeRangeFixed = false;
+ }
+
@Override
public void setSelectedTimeNotify(long time, boolean ensureVisible) {
setSelectedTimeInt(time, ensureVisible, true);
@Override
public void setSelectedTimeNotify(long time, boolean ensureVisible) {
setSelectedTimeInt(time, ensureVisible, true);
/*****************************************************************************
/*****************************************************************************
- * Copyright (c) 2007, 2015 Intel Corporation, Ericsson
+ * Copyright (c) 2007, 2016 Intel Corporation, Ericsson
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
*/
void resetStartFinishTime();
*/
void resetStartFinishTime();
+ /**
+ * Reset the start and end times.
+ *
+ * @param notify
+ * if true, notify the registered listeners
+ * @since 2.0
+ */
+ default void resetStartFinishTime(boolean notify) {
+ if (notify) {
+ setStartFinishTimeNotify(getMinTime(), getMaxTime());
+ } else {
+ setStartFinishTime(getMinTime(), getMaxTime());
+ }
+ }
+
/**
* @return The names' width
*/
/**
* @return The names' width
*/
/*******************************************************************************
/*******************************************************************************
- * Copyright (c) 2014, 2015 Ericsson
+ * Copyright (c) 2014, 2016 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v1.0 which
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v1.0 which
fProvider.resetStartFinishTime();
}
fProvider.resetStartFinishTime();
}
+ /**
+ * @since 2.0
+ */
+ @Override
+ public void resetStartFinishTime(boolean notify) {
+ fProvider.resetStartFinishTime(notify);
+ }
+
@Override
public int getNameSpace() {
return fProvider.getNameSpace();
@Override
public int getNameSpace() {
return fProvider.getNameSpace();