From 948b0607a931a5b720174cc756ab47b621df5fb3 Mon Sep 17 00:00:00 2001 From: Francois Chouinard Date: Thu, 28 Jul 2011 16:32:37 -0400 Subject: [PATCH] Add dispose method on contexts --- .../parsers/custom/CustomTxtTraceContext.java | 13 + .../parsers/custom/CustomXmlTraceContext.java | 14 + .../tmf/ui/views/timechart/TimeChartView.java | 315 ++++----- .../tmf/component/TmfDataProvider.java | 625 +++++++++--------- .../linuxtools/tmf/trace/ITmfContext.java | 21 +- .../linuxtools/tmf/trace/TmfContext.java | 186 +++--- 6 files changed, 615 insertions(+), 559 deletions(-) diff --git a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/parsers/custom/CustomTxtTraceContext.java b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/parsers/custom/CustomTxtTraceContext.java index 38853bc08c..3fac6ae810 100644 --- a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/parsers/custom/CustomTxtTraceContext.java +++ b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/parsers/custom/CustomTxtTraceContext.java @@ -12,6 +12,7 @@ package org.eclipse.linuxtools.tmf.ui.parsers.custom; +import java.io.IOException; import java.util.regex.Matcher; import org.eclipse.linuxtools.tmf.io.BufferedRandomAccessFile; @@ -29,4 +30,16 @@ public class CustomTxtTraceContext extends TmfContext { public CustomTxtTraceContext(ITmfLocation location, long rank) { super(location, rank); } + + @Override + public void dispose() { + if (raFile != null) { + try { + raFile.close(); + } catch (IOException e) { + } + } + super.dispose(); + } + } \ No newline at end of file diff --git a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/parsers/custom/CustomXmlTraceContext.java b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/parsers/custom/CustomXmlTraceContext.java index 7bd0dfe291..f74b0687c1 100644 --- a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/parsers/custom/CustomXmlTraceContext.java +++ b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/parsers/custom/CustomXmlTraceContext.java @@ -12,6 +12,8 @@ package org.eclipse.linuxtools.tmf.ui.parsers.custom; +import java.io.IOException; + import org.eclipse.linuxtools.tmf.io.BufferedRandomAccessFile; import org.eclipse.linuxtools.tmf.trace.ITmfLocation; import org.eclipse.linuxtools.tmf.trace.TmfContext; @@ -22,4 +24,16 @@ public class CustomXmlTraceContext extends TmfContext { public CustomXmlTraceContext(ITmfLocation location, long rank) { super(location, rank); } + + @Override + public void dispose() { + if (raFile != null) { + try { + raFile.close(); + } catch (IOException e) { + } + } + super.dispose(); + } + } \ No newline at end of file diff --git a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/timechart/TimeChartView.java b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/timechart/TimeChartView.java index 72e0bf732e..bc51be409b 100644 --- a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/timechart/TimeChartView.java +++ b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/timechart/TimeChartView.java @@ -58,24 +58,24 @@ import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorReference; - -public class TimeChartView extends TmfView implements ITmfTimeScaleSelectionListener, ITmfTimeSelectionListener, IColorSettingsListener, IResourceChangeListener, ITmfEventsFilterListener { +public class TimeChartView extends TmfView implements ITmfTimeScaleSelectionListener, ITmfTimeSelectionListener, IColorSettingsListener, + IResourceChangeListener, ITmfEventsFilterListener { public static final String ID = "org.eclipse.linuxtools.tmf.ui.views.timechart"; //$NON-NLS-1$ private static final byte TIMESTAMP_SCALE = -9; - - private int fDisplayWidth; + + private final int fDisplayWidth; private Composite fComposite; private ITimeAnalysisViewer fViewer; - private ArrayList fTimeAnalysisEntries = new ArrayList(); - private Map fDecorationProviders = new HashMap(); + private final ArrayList fTimeAnalysisEntries = new ArrayList(); + private final Map fDecorationProviders = new HashMap(); private ArrayList fDecorateThreads; private long fStartTime = 0; private long fStopTime = Long.MAX_VALUE; private boolean fRefreshBusy = false; private boolean fRefreshPending = false; - private Object fSyncObj = new Object(); + private final Object fSyncObj = new Object(); public TimeChartView() { super("Time Chart"); //$NON-NLS-1$ @@ -89,7 +89,7 @@ public class TimeChartView extends TmfView implements ITmfTimeScaleSelectionList gl.marginWidth = 0; gl.marginHeight = 0; fComposite.setLayout(gl); - + fViewer = TmfViewerFactory.createViewer(fComposite, new TimeChartAnalysisProvider()); fViewer.groupTraces(false); fViewer.setTimeCalendarFormat(true); @@ -97,7 +97,7 @@ public class TimeChartView extends TmfView implements ITmfTimeScaleSelectionList fViewer.addWidgetTimeScaleSelectionListner(this); fViewer.addWidgetSelectionListner(this); fViewer.setMinimumItemWidth(1); - + IEditorReference[] editorReferences = getSite().getPage().getEditorReferences(); for (IEditorReference editorReference : editorReferences) { IEditorPart editor = editorReference.getEditor(false); @@ -114,7 +114,7 @@ public class TimeChartView extends TmfView implements ITmfTimeScaleSelectionList } } fViewer.display(fTimeAnalysisEntries.toArray(new TimeChartAnalysisEntry[0])); - + fDecorateThreads = new ArrayList(); ColorSettingsManager.addColorSettingsListener(this); ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE); @@ -122,26 +122,26 @@ public class TimeChartView extends TmfView implements ITmfTimeScaleSelectionList @Override public void dispose() { - ResourcesPlugin.getWorkspace().removeResourceChangeListener(this); - for (DecorateThread thread : fDecorateThreads) { - thread.cancel(); - } + ResourcesPlugin.getWorkspace().removeResourceChangeListener(this); + for (DecorateThread thread : fDecorateThreads) { + thread.cancel(); + } ColorSettingsManager.removeColorSettingsListener(this); - super.dispose(); + super.dispose(); } - @Override + @Override public void setFocus() { super.setFocus(); fViewer.setFocus(); } - + private class ProcessTraceThread extends Thread { - private TimeChartAnalysisEntry fTimeAnalysisEntry; + private final TimeChartAnalysisEntry fTimeAnalysisEntry; public ProcessTraceThread(TimeChartAnalysisEntry timeAnalysisEntry) { - super("ProcessTraceJob:"+timeAnalysisEntry.getName()); //$NON-NLS-1$ + super("ProcessTraceJob:" + timeAnalysisEntry.getName()); //$NON-NLS-1$ fTimeAnalysisEntry = timeAnalysisEntry; } @@ -150,15 +150,15 @@ public class TimeChartView extends TmfView implements ITmfTimeScaleSelectionList updateTraceEntry(fTimeAnalysisEntry, Long.MAX_VALUE, 0, Long.MAX_VALUE); } } - + private void updateTraceEntry(TimeChartAnalysisEntry timeAnalysisEntry, long stopRank, long startTime, long stopTime) { ITmfTrace trace = timeAnalysisEntry.getTrace(); TimeChartDecorationProvider decorationProvider = fDecorationProviders.get(trace); if (decorationProvider == null) { - return; // the trace has been closed + return; // the trace has been closed } TmfContext context = null; - //TmfTimestamp lastTimestamp = null; + // TmfTimestamp lastTimestamp = null; boolean done = false; while (!done) { synchronized (timeAnalysisEntry) { @@ -167,10 +167,13 @@ public class TimeChartView extends TmfView implements ITmfTimeScaleSelectionList break; } if (context == null || context.getRank() != timeAnalysisEntry.getLastRank()) { + if (context != null) { + context.dispose(); + } if (timeAnalysisEntry.getLastRank() != -1) { context = trace.seekEvent(timeAnalysisEntry.getLastRank()); } else { - //context = trace.seekLocation(null); + // context = trace.seekLocation(null); context = trace.seekEvent(0); } } @@ -181,27 +184,32 @@ public class TimeChartView extends TmfView implements ITmfTimeScaleSelectionList done = true; break; } - //if (!event.getTimestamp().equals(lastTimestamp)) { + // if (!event.getTimestamp().equals(lastTimestamp)) { TimeChartEvent timeEvent = new TimeChartEvent(timeAnalysisEntry, event, rank, decorationProvider); if (timeEvent.getTime() >= startTime && timeEvent.getTime() <= stopTime) { timeAnalysisEntry.addTraceEvent(timeEvent); } - //lastTimestamp = event.getTimestamp(); - //} *** commented out so that color setting priority gets set even if the event has same time + // lastTimestamp = event.getTimestamp(); + // } *** commented out so that color setting priority gets + // set even if the event has same time if (context.getRank() == trace.getNbEvents() || context.getRank() == stopRank) { done = true; break; } if (context.getRank() % trace.getCacheSize() == 1) { - // break for UI refresh + // break for UI refresh break; } } - //timeAnalysisEntry.setLastRank(Math.min(trace.getNbEvents(), stopRank)); + // timeAnalysisEntry.setLastRank(Math.min(trace.getNbEvents(), + // stopRank)); timeAnalysisEntry.setLastRank(context.getRank()); } refreshViewer(false); } + if (context != null) { + context.dispose(); + } } private void refreshViewer(boolean resetTimeIntervals) { @@ -209,56 +217,57 @@ public class TimeChartView extends TmfView implements ITmfTimeScaleSelectionList return; } synchronized (fSyncObj) { - if (fRefreshBusy) { - fRefreshPending = true; - return; - } else { - fRefreshBusy = true; - } + if (fRefreshBusy) { + fRefreshPending = true; + return; + } else { + fRefreshBusy = true; + } } final boolean reset = resetTimeIntervals; // Perform the refresh on the UI thread Display.getDefault().asyncExec(new Runnable() { @Override public void run() { - if (fComposite.isDisposed()) return; + if (fComposite.isDisposed()) + return; fViewer.display(fTimeAnalysisEntries.toArray(new TimeChartAnalysisEntry[0])); if (reset) { fViewer.resetStartFinishTime(); } synchronized (fSyncObj) { - fRefreshBusy = false; - if (fRefreshPending) { - fRefreshPending = false; - refreshViewer(reset); - } + fRefreshBusy = false; + if (fRefreshPending) { + fRefreshPending = false; + refreshViewer(reset); + } } } }); } - + private void itemize(long startTime, long stopTime) { for (int i = 0; i < fTimeAnalysisEntries.size(); i++) { Thread thread = new ItemizeThread(fTimeAnalysisEntries.get(i), startTime, stopTime); thread.start(); } } - + private class ItemizeThread extends Thread { - private TimeChartAnalysisEntry fTimeAnalysisEntry; - private long fStartTime; - private long fStopTime; - private long fMaxDuration; - + private final TimeChartAnalysisEntry fTimeAnalysisEntry; + private final long fStartTime; + private final long fStopTime; + private final long fMaxDuration; + private ItemizeThread(TimeChartAnalysisEntry timeAnalysisEntry, long startTime, long stopTime) { - super("Itemize Thread:"+timeAnalysisEntry.getName()); //$NON-NLS-1$ + super("Itemize Thread:" + timeAnalysisEntry.getName()); //$NON-NLS-1$ fTimeAnalysisEntry = timeAnalysisEntry; fStartTime = startTime; fStopTime = stopTime; - fMaxDuration = 3 * (fStopTime - fStartTime) / fDisplayWidth; + fMaxDuration = 3 * (fStopTime - fStartTime) / fDisplayWidth; } - + @Override public void run() { itemizeTraceEntry(fTimeAnalysisEntry); @@ -272,10 +281,8 @@ public class TimeChartView extends TmfView implements ITmfTimeScaleSelectionList synchronized (timeAnalysisEntry) { while (hasNext = iterator.hasNext()) { event = (TimeChartEvent) iterator.next(); - if (event.getTime() + event.getDuration() > fStartTime && - event.getTime() < fStopTime && - event.getDuration() > fMaxDuration && - event.getNbEvents() > 1) { + if (event.getTime() + event.getDuration() > fStartTime && event.getTime() < fStopTime && event.getDuration() > fMaxDuration + && event.getNbEvents() > 1) { break; } } @@ -297,13 +304,13 @@ public class TimeChartView extends TmfView implements ITmfTimeScaleSelectionList } event.setItemizing(true); } - TimeChartAnalysisEntry timeAnalysisEntry = new TimeChartAnalysisEntry(fTimeAnalysisEntry.getTrace(), - (int) Math.min(event.getNbEvents() + 1, fDisplayWidth * 2)); + TimeChartAnalysisEntry timeAnalysisEntry = new TimeChartAnalysisEntry(fTimeAnalysisEntry.getTrace(), (int) Math.min( + event.getNbEvents() + 1, fDisplayWidth * 2)); synchronized (event.getRankRangeList()) { - for (RankRange range : event.getRankRangeList()) { - timeAnalysisEntry.setLastRank(range.getFirstRank()); - updateTraceEntry(timeAnalysisEntry, range.getLastRank() + 1, event.getTime(), event.getTime() + event.getDuration()); - } + for (RankRange range : event.getRankRangeList()) { + timeAnalysisEntry.setLastRank(range.getFirstRank()); + updateTraceEntry(timeAnalysisEntry, range.getLastRank() + 1, event.getTime(), event.getTime() + event.getDuration()); + } } event.setItemizedEntry(timeAnalysisEntry); refreshViewer(false); @@ -315,41 +322,41 @@ public class TimeChartView extends TmfView implements ITmfTimeScaleSelectionList } private void redecorate() { - synchronized (fDecorateThreads) { - for (DecorateThread thread : fDecorateThreads) { - thread.cancel(); - } - fDecorateThreads.clear(); - for (int i = 0; i < fTimeAnalysisEntries.size(); i++) { - DecorateThread thread = new DecorateThread(fTimeAnalysisEntries.get(i)); - thread.start(); - fDecorateThreads.add(thread); - } + synchronized (fDecorateThreads) { + for (DecorateThread thread : fDecorateThreads) { + thread.cancel(); + } + fDecorateThreads.clear(); + for (int i = 0; i < fTimeAnalysisEntries.size(); i++) { + DecorateThread thread = new DecorateThread(fTimeAnalysisEntries.get(i)); + thread.start(); + fDecorateThreads.add(thread); + } } } - + private class DecorateThread extends Thread { - private volatile boolean interrupted = false; - private TimeChartAnalysisEntry fTimeAnalysisEntry; - private TimeChartDecorationProvider fDecorationProvider; + private volatile boolean interrupted = false; + private final TimeChartAnalysisEntry fTimeAnalysisEntry; + private final TimeChartDecorationProvider fDecorationProvider; private TmfContext fContext; private int fCount = 0; - + private DecorateThread(TimeChartAnalysisEntry timeAnalysisEntry) { - super("Decorate Thread:"+timeAnalysisEntry.getName()); //$NON-NLS-1$ + super("Decorate Thread:" + timeAnalysisEntry.getName()); //$NON-NLS-1$ fTimeAnalysisEntry = timeAnalysisEntry; fDecorationProvider = fDecorationProviders.get(timeAnalysisEntry.getTrace()); } - + @Override public void run() { - resetTraceEntry(fTimeAnalysisEntry); + resetTraceEntry(fTimeAnalysisEntry); refreshViewer(false); decorateTraceEntry(fTimeAnalysisEntry, null); refreshViewer(false); - synchronized (fDecorateThreads) { - fDecorateThreads.remove(this); - } + synchronized (fDecorateThreads) { + fDecorateThreads.remove(this); + } } public void resetTraceEntry(TimeChartAnalysisEntry timeAnalysisEntry) { @@ -364,17 +371,18 @@ public class TimeChartView extends TmfView implements ITmfTimeScaleSelectionList } } if (hasNext) { - // TODO possible concurrency problem here with ItemizeJob - event.setColorSettingPriority(ColorSettingsManager.PRIORITY_NONE); + // TODO possible concurrency problem here with ItemizeJob + event.setColorSettingPriority(ColorSettingsManager.PRIORITY_NONE); if (event.getItemizedEntry() != null) { - resetTraceEntry(event.getItemizedEntry()); + resetTraceEntry(event.getItemizedEntry()); } } } } - + public void decorateTraceEntry(TimeChartAnalysisEntry timeAnalysisEntry, TimeChartEvent parentEvent) { - // Set max duration high to ensure iterator does not consider itemized events + // Set max duration high to ensure iterator does not consider + // itemized events Iterator iterator = timeAnalysisEntry.getTraceEventsIterator(0, Long.MAX_VALUE, Long.MAX_VALUE); TimeChartEvent event = null; int entryPriority = ColorSettingsManager.PRIORITY_NONE; @@ -390,7 +398,7 @@ public class TimeChartView extends TmfView implements ITmfTimeScaleSelectionList } } if (hasNext) { - // TODO possible concurrency problem here with ItemizeJob + // TODO possible concurrency problem here with ItemizeJob if (event.getItemizedEntry() == null) { decorateEvent(event); } else { @@ -406,67 +414,69 @@ public class TimeChartView extends TmfView implements ITmfTimeScaleSelectionList } } if (parentEvent != null) { - parentEvent.setColorSettingPriority(entryPriority); - parentEvent.setIsBookmarked(entryIsBookmarked); - parentEvent.setIsVisible(entryIsVisible); - parentEvent.setIsSearchMatch(entryIsSearchMatch); + parentEvent.setColorSettingPriority(entryPriority); + parentEvent.setIsBookmarked(entryIsBookmarked); + parentEvent.setIsVisible(entryIsVisible); + parentEvent.setIsSearchMatch(entryIsSearchMatch); } } public void decorateEvent(TimeChartEvent timeChartEvent) { - // TODO possible concurrency problem here with ItemizeJob - TimeChartAnalysisEntry timeAnalysisEntry = (TimeChartAnalysisEntry) timeChartEvent.getEntry(); - ITmfTrace trace = timeAnalysisEntry.getTrace(); - int priority = ColorSettingsManager.PRIORITY_NONE; - boolean isBookmarked = false; - boolean isVisible = false; - boolean isSearchMatch = false; + // TODO possible concurrency problem here with ItemizeJob + TimeChartAnalysisEntry timeAnalysisEntry = (TimeChartAnalysisEntry) timeChartEvent.getEntry(); + ITmfTrace trace = timeAnalysisEntry.getTrace(); + int priority = ColorSettingsManager.PRIORITY_NONE; + boolean isBookmarked = false; + boolean isVisible = false; + boolean isSearchMatch = false; synchronized (timeChartEvent.getRankRangeList()) { - for (RankRange range : timeChartEvent.getRankRangeList()) { - if (interrupted) return; - if (fContext == null || fContext.getRank() != range.getFirstRank()) { - fContext = trace.seekEvent(range.getFirstRank()); - fContext.setRank(range.getFirstRank()); - } + for (RankRange range : timeChartEvent.getRankRangeList()) { + if (interrupted) + return; + if (fContext == null || fContext.getRank() != range.getFirstRank()) { + fContext = trace.seekEvent(range.getFirstRank()); + fContext.setRank(range.getFirstRank()); + } while (true) { - if (interrupted) return; - long rank = fContext.getRank(); + if (interrupted) + return; + long rank = fContext.getRank(); TmfEvent event = trace.getNextEvent(fContext); if (event == null) { break; } long eventTime = event.getTimestamp().synchronize(0, (byte) -9).getValue(); if (eventTime >= timeChartEvent.getTime() && eventTime <= timeChartEvent.getTime() + timeChartEvent.getDuration()) { - priority = Math.min(priority, ColorSettingsManager.getColorSettingPriority(event)); + priority = Math.min(priority, ColorSettingsManager.getColorSettingPriority(event)); } - isBookmarked |= fDecorationProvider.isBookmark(rank); - isVisible |= fDecorationProvider.isVisible(event); - isSearchMatch |= fDecorationProvider.isSearchMatch(event); + isBookmarked |= fDecorationProvider.isBookmark(rank); + isVisible |= fDecorationProvider.isVisible(event); + isSearchMatch |= fDecorationProvider.isSearchMatch(event); if (fContext.getRank() > range.getLastRank()) { - break; + break; } } - } + } } timeChartEvent.setColorSettingPriority(priority); timeChartEvent.setIsBookmarked(isBookmarked); timeChartEvent.setIsVisible(isVisible); timeChartEvent.setIsSearchMatch(isSearchMatch); } - - public void cancel() { - interrupted = true; - } + + public void cancel() { + interrupted = true; + } } // ------------------------------------------------------------------------ // Listeners // ------------------------------------------------------------------------ - + @Override public void tsfTmProcessTimeScaleEvent(TmfTimeScaleSelectionEvent event) { - fStartTime = event.getTime0(); - fStopTime = event.getTime1(); + fStartTime = event.getTime0(); + fStopTime = event.getTime1(); itemize(fStartTime, fStopTime); } @@ -484,48 +494,49 @@ public class TimeChartView extends TmfView implements ITmfTimeScaleSelectionList broadcast(new TmfTimeSynchSignal(this, new TmfTimestamp(event.getSelectedTime(), TIMESTAMP_SCALE))); } - @Override + @Override public void colorSettingsChanged(ColorSetting[] colorSettings) { - redecorate(); + redecorate(); } @Override public void resourceChanged(IResourceChangeEvent event) { - for (IMarkerDelta delta : event.findMarkerDeltas(IMarker.BOOKMARK, false)) { - for (TimeChartDecorationProvider provider : fDecorationProviders.values()) { - if (delta.getResource().equals(provider.getResource())) { - if (delta.getKind() == IResourceDelta.CHANGED && delta.getMarker().getAttribute(IMarker.LOCATION, -1) != -1) { - provider.refreshBookmarks(); - } else if (delta.getKind() == IResourceDelta.REMOVED) { - provider.refreshBookmarks(); - } - } - } - } - redecorate(); + for (IMarkerDelta delta : event.findMarkerDeltas(IMarker.BOOKMARK, false)) { + for (TimeChartDecorationProvider provider : fDecorationProviders.values()) { + if (delta.getResource().equals(provider.getResource())) { + if (delta.getKind() == IResourceDelta.CHANGED && delta.getMarker().getAttribute(IMarker.LOCATION, -1) != -1) { + provider.refreshBookmarks(); + } else if (delta.getKind() == IResourceDelta.REMOVED) { + provider.refreshBookmarks(); + } + } + } + } + redecorate(); } - - @Override + + @Override public void filterApplied(ITmfFilter filter, ITmfTrace trace) { - TimeChartDecorationProvider decorationProvider = fDecorationProviders.get(trace); - decorationProvider.filterApplied(filter); - redecorate(); + TimeChartDecorationProvider decorationProvider = fDecorationProviders.get(trace); + decorationProvider.filterApplied(filter); + redecorate(); } - @Override + @Override public void searchApplied(ITmfFilter filter, ITmfTrace trace) { - TimeChartDecorationProvider decorationProvider = fDecorationProviders.get(trace); - decorationProvider.searchApplied(filter); - redecorate(); + TimeChartDecorationProvider decorationProvider = fDecorationProviders.get(trace); + decorationProvider.searchApplied(filter); + redecorate(); } // ------------------------------------------------------------------------ // Signal handlers // ------------------------------------------------------------------------ - - @TmfSignalHandler + + @TmfSignalHandler public void traceOpened(TmfTraceOpenedSignal signal) { - if (fTimeAnalysisEntries == null) return; + if (fTimeAnalysisEntries == null) + return; final ITmfTrace trace = signal.getTrace(); final IResource resource = signal.getResource(); final ITmfEventsFilterProvider eventsFilterProvider = signal.getEventsFilterProvider(); @@ -537,7 +548,7 @@ public class TimeChartView extends TmfView implements ITmfTimeScaleSelectionList } } if (timeAnalysisEntry == null) { - timeAnalysisEntry = new TimeChartAnalysisEntry(trace, fDisplayWidth * 2); + timeAnalysisEntry = new TimeChartAnalysisEntry(trace, fDisplayWidth * 2); fTimeAnalysisEntries.add(timeAnalysisEntry); fDecorationProviders.put(trace, new TimeChartDecorationProvider(resource)); Thread thread = new ProcessTraceThread(timeAnalysisEntry); @@ -545,13 +556,14 @@ public class TimeChartView extends TmfView implements ITmfTimeScaleSelectionList } refreshViewer(true); if (eventsFilterProvider != null) { - eventsFilterProvider.addEventsFilterListener(this); + eventsFilterProvider.addEventsFilterListener(this); } } - + @TmfSignalHandler public void traceClosed(TmfTraceClosedSignal signal) { - if (fTimeAnalysisEntries == null) return; + if (fTimeAnalysisEntries == null) + return; final ITmfTrace trace = signal.getTrace(); for (int i = 0; i < fTimeAnalysisEntries.size(); i++) { if (fTimeAnalysisEntries.get(i).getTrace().equals(trace)) { @@ -562,7 +574,7 @@ public class TimeChartView extends TmfView implements ITmfTimeScaleSelectionList } } } - + @TmfSignalHandler public void traceSelected(TmfTraceSelectedSignal signal) { if (signal.getSource() != this && fTimeAnalysisEntries != null) { @@ -578,7 +590,8 @@ public class TimeChartView extends TmfView implements ITmfTimeScaleSelectionList @TmfSignalHandler public void traceUpdated(TmfTraceUpdatedSignal signal) { - if (fTimeAnalysisEntries == null) return; + if (fTimeAnalysisEntries == null) + return; final ITmfTrace trace = signal.getTrace(); for (int i = 0; i < fTimeAnalysisEntries.size(); i++) { TimeChartAnalysisEntry timeAnalysisEntry = fTimeAnalysisEntries.get(i); diff --git a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/TmfDataProvider.java b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/TmfDataProvider.java index a510f158e6..13e1613b2c 100644 --- a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/TmfDataProvider.java +++ b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/TmfDataProvider.java @@ -37,65 +37,65 @@ import org.eclipse.linuxtools.tmf.trace.ITmfContext; * This abstract class implements the housekeeking methods to register/ * deregister the event provider and to handle generically the event requests. *

- * The concrete class can either re-implement processRequest() entirely or - * just implement the hooks (initializeContext() and getNext()). + * The concrete class can either re-implement processRequest() entirely or just + * implement the hooks (initializeContext() and getNext()). *

* TODO: Add support for providing multiple data types. */ public abstract class TmfDataProvider extends TmfComponent implements ITmfDataProvider { - // ------------------------------------------------------------------------ - // Constants - // ------------------------------------------------------------------------ + // ------------------------------------------------------------------------ + // Constants + // ------------------------------------------------------------------------ // private static final ITmfDataRequest.ExecutionType SHORT = ITmfDataRequest.ExecutionType.SHORT; // private static final ITmfDataRequest.ExecutionType LONG = ITmfDataRequest.ExecutionType.LONG; - - // ------------------------------------------------------------------------ - // - // ------------------------------------------------------------------------ - final protected Class fType; - final protected boolean fLogData; - final protected boolean fLogError; + // ------------------------------------------------------------------------ + // + // ------------------------------------------------------------------------ - public static final int DEFAULT_BLOCK_SIZE = 50000; - public static final int DEFAULT_QUEUE_SIZE = 1000; + final protected Class fType; + final protected boolean fLogData; + final protected boolean fLogError; - protected final int fQueueSize; - protected final BlockingQueue fDataQueue; - protected final TmfRequestExecutor fExecutor; + public static final int DEFAULT_BLOCK_SIZE = 50000; + public static final int DEFAULT_QUEUE_SIZE = 1000; - private int fSignalDepth = 0; + protected final int fQueueSize; + protected final BlockingQueue fDataQueue; + protected final TmfRequestExecutor fExecutor; + + private int fSignalDepth = 0; private final Object fLock = new Object(); private int fRequestPendingCounter = 0; - // ------------------------------------------------------------------------ - // Constructors - // ------------------------------------------------------------------------ - - public TmfDataProvider(String name, Class type) { - this(name, type, DEFAULT_QUEUE_SIZE); - } - - protected TmfDataProvider(String name, Class type, int queueSize) { - super(name); - fType = type; - fQueueSize = queueSize; + // ------------------------------------------------------------------------ + // Constructors + // ------------------------------------------------------------------------ + + public TmfDataProvider(String name, Class type) { + this(name, type, DEFAULT_QUEUE_SIZE); + } + + protected TmfDataProvider(String name, Class type, int queueSize) { + super(name); + fType = type; + fQueueSize = queueSize; fDataQueue = (fQueueSize > 1) ? new LinkedBlockingQueue(fQueueSize) : new SynchronousQueue(); fExecutor = new TmfRequestExecutor(); - fSignalDepth = 0; + fSignalDepth = 0; - fLogData = Tracer.isEventTraced(); - fLogError = Tracer.isErrorTraced(); + fLogData = Tracer.isEventTraced(); + fLogError = Tracer.isErrorTraced(); - TmfProviderManager.register(fType, this); + TmfProviderManager.register(fType, this); // if (Tracer.isComponentTraced()) Tracer.traceComponent(this, "started"); -} - - public TmfDataProvider(TmfDataProvider other) { + } + + public TmfDataProvider(TmfDataProvider other) { super(other); fType = other.fType; fQueueSize = other.fQueueSize; @@ -104,71 +104,71 @@ public abstract class TmfDataProvider extends TmfComponent im fExecutor = new TmfRequestExecutor(); fSignalDepth = 0; - fLogData = Tracer.isEventTraced(); + fLogData = Tracer.isEventTraced(); fLogError = Tracer.isErrorTraced(); - } - - @Override - public void dispose() { - TmfProviderManager.deregister(fType, this); - fExecutor.stop(); - super.dispose(); + } + + @Override + public void dispose() { + TmfProviderManager.deregister(fType, this); + fExecutor.stop(); + super.dispose(); // if (Tracer.isComponentTraced()) Tracer.traceComponent(this, "stopped"); - } - - public int getQueueSize() { - return fQueueSize; - } - - public Class getType() { - return fType; - } - - // ------------------------------------------------------------------------ - // ITmfRequestHandler - // ------------------------------------------------------------------------ - - @Override - public void sendRequest(final ITmfDataRequest request) { - synchronized(fLock) { - if (fSignalDepth > 0) { - coalesceDataRequest(request); - } else { - dispatchRequest(request); - } - } - } - - /** - * This method queues the coalesced requests. - * - * @param thread - */ - @Override + } + + public int getQueueSize() { + return fQueueSize; + } + + public Class getType() { + return fType; + } + + // ------------------------------------------------------------------------ + // ITmfRequestHandler + // ------------------------------------------------------------------------ + + @Override + public void sendRequest(final ITmfDataRequest request) { + synchronized (fLock) { + if (fSignalDepth > 0) { + coalesceDataRequest(request); + } else { + dispatchRequest(request); + } + } + } + + /** + * This method queues the coalesced requests. + * + * @param thread + */ + @Override public void fireRequest() { - synchronized(fLock) { - if (fRequestPendingCounter > 0) { - return; - } - if (fPendingCoalescedRequests.size() > 0) { - for (TmfDataRequest request : fPendingCoalescedRequests) { - dispatchRequest(request); - } - fPendingCoalescedRequests.clear(); - } - } - } - - /** - * Increments/decrements the pending requests counters and fires - * the request if necessary (counter == 0). Used for coalescing - * requests accross multiple TmfDataProvider. - * - * @param isIncrement - */ + synchronized (fLock) { + if (fRequestPendingCounter > 0) { + return; + } + if (fPendingCoalescedRequests.size() > 0) { + for (TmfDataRequest request : fPendingCoalescedRequests) { + dispatchRequest(request); + } + fPendingCoalescedRequests.clear(); + } + } + } + + /** + * Increments/decrements the pending requests counters and fires the request + * if necessary (counter == 0). Used for coalescing requests accross + * multiple TmfDataProvider. + * + * @param isIncrement + */ @Override public void notifyPendingRequest(boolean isIncrement) { - synchronized(fLock) { + synchronized (fLock) { if (isIncrement) { if (fSignalDepth > 0) { fRequestPendingCounter++; @@ -177,225 +177,232 @@ public abstract class TmfDataProvider extends TmfComponent im if (fRequestPendingCounter > 0) { fRequestPendingCounter--; } - + // fire request if all pending requests are received if (fRequestPendingCounter == 0) { fireRequest(); } } } - } - - // ------------------------------------------------------------------------ - // Coalescing (primitive test...) - // ------------------------------------------------------------------------ - - protected Vector> fPendingCoalescedRequests = new Vector>(); - - protected void newCoalescedDataRequest(ITmfDataRequest request) { - synchronized(fLock) { - TmfCoalescedDataRequest coalescedRequest = new TmfCoalescedDataRequest( - fType, request.getIndex(), request.getNbRequested(), request.getBlockSize(), request.getExecType()); - coalescedRequest.addRequest(request); - if (Tracer.isRequestTraced()) { - Tracer.traceRequest(request, "coalesced with " + coalescedRequest.getRequestId()); //$NON-NLS-1$ - } - fPendingCoalescedRequests.add(coalescedRequest); - } - } - - protected void coalesceDataRequest(ITmfDataRequest request) { - synchronized(fLock) { - for (TmfCoalescedDataRequest coalescedRequest : fPendingCoalescedRequests) { - if (coalescedRequest.isCompatible(request)) { - coalescedRequest.addRequest(request); - if (Tracer.isRequestTraced()) { - Tracer.traceRequest(request, "coalesced with " + coalescedRequest.getRequestId()); //$NON-NLS-1$ - } - return; - } - } - newCoalescedDataRequest(request); - } - } - - // ------------------------------------------------------------------------ - // Request processing - // ------------------------------------------------------------------------ - - private void dispatchRequest(final ITmfDataRequest request) { - if (request.getExecType() == ExecutionType.FOREGROUND) - queueRequest(request); - else - queueBackgroundRequest(request, request.getBlockSize(), true); - } - - protected void queueRequest(final ITmfDataRequest request) { - - if (fExecutor.isShutdown()) { - request.cancel(); - return; - } - - final TmfDataProvider provider = this; - - // Process the request - TmfThread thread = new TmfThread(request.getExecType()) { - - @Override - public void run() { - - if (Tracer.isRequestTraced()) Tracer.trace("Request #" + request.getRequestId() + " is being serviced by " + provider.getName()); //$NON-NLS-1$//$NON-NLS-2$ - - // Extract the generic information - request.start(); - int nbRequested = request.getNbRequested(); - int nbRead = 0; - - // Initialize the execution - ITmfContext context = armRequest(request); - if (context == null) { - request.cancel(); - return; - } - - try { - // Get the ordered events - T data = getNext(context); - if (Tracer.isRequestTraced()) Tracer.trace("Request #" + request.getRequestId() + " read first event"); //$NON-NLS-1$ //$NON-NLS-2$ - while (data != null && !isCompleted(request, data, nbRead)) - { - if (fLogData) Tracer.traceEvent(provider, request, data); - request.handleData(data); - - // To avoid an unnecessary read passed the last data requested - if (++nbRead < nbRequested) { - data = getNext(context); - } - } - if (Tracer.isRequestTraced()) Tracer.trace("Request #" + request.getRequestId() + " finished"); //$NON-NLS-1$//$NON-NLS-2$ - - if (request.isCancelled()) { - request.cancel(); - } - else { - request.done(); - } - } - catch (Exception e) { - request.fail(); - } - } - }; - - if (Tracer.isRequestTraced()) Tracer.traceRequest(request, "queued"); //$NON-NLS-1$ - fExecutor.execute(thread); - - } - - protected void queueBackgroundRequest(final ITmfDataRequest request, final int blockSize, final boolean indexing) { - - Thread thread = new Thread() { - @Override - public void run() { - request.start(); - - final Integer[] CHUNK_SIZE = new Integer[1]; - CHUNK_SIZE[0] = Math.min(request.getNbRequested(), blockSize + ((indexing) ? 1 : 0)); - - final Integer[] nbRead = new Integer[1]; - nbRead[0] = 0; - - final Boolean[] isFinished = new Boolean[1]; - isFinished[0] = Boolean.FALSE; - - while (!isFinished[0]) { - - TmfDataRequest subRequest= new TmfDataRequest(request.getDataType(), request.getIndex() + nbRead[0], CHUNK_SIZE[0], blockSize, ExecutionType.BACKGROUND) - { - @Override - public void handleData(T data) { - super.handleData(data); - request.handleData(data); - if (getNbRead() > CHUNK_SIZE[0]) { - System.out.println("ERROR - Read too many events"); //$NON-NLS-1$ - } - } - - @Override - public void handleCompleted() { - nbRead[0] += getNbRead(); - if (nbRead[0] >= request.getNbRequested() || (getNbRead() < CHUNK_SIZE[0])) { - if (isCancelled()) { - request.cancel(); - } - else { - request.done(); - } - isFinished[0] = Boolean.TRUE; - } - super.handleCompleted(); - } - }; - - if (!isFinished[0]) { - queueRequest(subRequest); - - try { - subRequest.waitForCompletion(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - CHUNK_SIZE[0] = Math.min(request.getNbRequested() - nbRead[0], blockSize); - } - } - } - }; - - thread.start(); - } - - /** - * Initialize the provider based on the request. The context is - * provider specific and will be updated by getNext(). - * - * @param request - * @return an application specific context; null if request can't be serviced - */ - public abstract ITmfContext armRequest(ITmfDataRequest request); - public abstract T getNext(ITmfContext context); - - /** - * Checks if the data meets the request completion criteria. - * - * @param request - * @param data - * @return - */ - public boolean isCompleted(ITmfDataRequest request, T data, int nbRead) { - return request.isCompleted() || nbRead >= request.getNbRequested() || data.isNullRef(); - } - - // ------------------------------------------------------------------------ - // Signal handlers - // ------------------------------------------------------------------------ - - @TmfSignalHandler - public void startSynch(TmfStartSynchSignal signal) { - synchronized (fLock) { - fSignalDepth++; - } - } - - @TmfSignalHandler - public void endSynch(TmfEndSynchSignal signal) { + } + + // ------------------------------------------------------------------------ + // Coalescing (primitive test...) + // ------------------------------------------------------------------------ + + protected Vector> fPendingCoalescedRequests = new Vector>(); + + protected void newCoalescedDataRequest(ITmfDataRequest request) { + synchronized (fLock) { + TmfCoalescedDataRequest coalescedRequest = new TmfCoalescedDataRequest(fType, request.getIndex(), request.getNbRequested(), + request.getBlockSize(), request.getExecType()); + coalescedRequest.addRequest(request); + if (Tracer.isRequestTraced()) { + Tracer.traceRequest(request, "coalesced with " + coalescedRequest.getRequestId()); //$NON-NLS-1$ + } + fPendingCoalescedRequests.add(coalescedRequest); + } + } + + protected void coalesceDataRequest(ITmfDataRequest request) { + synchronized (fLock) { + for (TmfCoalescedDataRequest coalescedRequest : fPendingCoalescedRequests) { + if (coalescedRequest.isCompatible(request)) { + coalescedRequest.addRequest(request); + if (Tracer.isRequestTraced()) { + Tracer.traceRequest(request, "coalesced with " + coalescedRequest.getRequestId()); //$NON-NLS-1$ + } + return; + } + } + newCoalescedDataRequest(request); + } + } + + // ------------------------------------------------------------------------ + // Request processing + // ------------------------------------------------------------------------ + + private void dispatchRequest(final ITmfDataRequest request) { + if (request.getExecType() == ExecutionType.FOREGROUND) + queueRequest(request); + else + queueBackgroundRequest(request, request.getBlockSize(), true); + } + + protected void queueRequest(final ITmfDataRequest request) { + + if (fExecutor.isShutdown()) { + request.cancel(); + return; + } + + final TmfDataProvider provider = this; + + // Process the request + TmfThread thread = new TmfThread(request.getExecType()) { + + @Override + public void run() { + + if (Tracer.isRequestTraced()) + Tracer.trace("Request #" + request.getRequestId() + " is being serviced by " + provider.getName()); //$NON-NLS-1$//$NON-NLS-2$ + + // Extract the generic information + request.start(); + int nbRequested = request.getNbRequested(); + int nbRead = 0; + + // Initialize the execution + ITmfContext context = armRequest(request); + if (context == null) { + request.cancel(); + return; + } + + try { + // Get the ordered events + T data = getNext(context); + if (Tracer.isRequestTraced()) + Tracer.trace("Request #" + request.getRequestId() + " read first event"); //$NON-NLS-1$ //$NON-NLS-2$ + while (data != null && !isCompleted(request, data, nbRead)) { + if (fLogData) + Tracer.traceEvent(provider, request, data); + request.handleData(data); + + // To avoid an unnecessary read passed the last data + // requested + if (++nbRead < nbRequested) { + data = getNext(context); + } + } + if (Tracer.isRequestTraced()) + Tracer.trace("Request #" + request.getRequestId() + " finished"); //$NON-NLS-1$//$NON-NLS-2$ + + if (request.isCancelled()) { + request.cancel(); + } else { + request.done(); + } + } catch (Exception e) { + request.fail(); + } + + // Cleanup + context.dispose(); + } + }; + + if (Tracer.isRequestTraced()) + Tracer.traceRequest(request, "queued"); //$NON-NLS-1$ + fExecutor.execute(thread); + + } + + protected void queueBackgroundRequest(final ITmfDataRequest request, final int blockSize, final boolean indexing) { + + Thread thread = new Thread() { + @Override + public void run() { + request.start(); + + final Integer[] CHUNK_SIZE = new Integer[1]; + CHUNK_SIZE[0] = Math.min(request.getNbRequested(), blockSize + ((indexing) ? 1 : 0)); + + final Integer[] nbRead = new Integer[1]; + nbRead[0] = 0; + + final Boolean[] isFinished = new Boolean[1]; + isFinished[0] = Boolean.FALSE; + + while (!isFinished[0]) { + + TmfDataRequest subRequest = new TmfDataRequest(request.getDataType(), request.getIndex() + nbRead[0], CHUNK_SIZE[0], + blockSize, ExecutionType.BACKGROUND) { + @Override + public void handleData(T data) { + super.handleData(data); + request.handleData(data); + if (getNbRead() > CHUNK_SIZE[0]) { + System.out.println("ERROR - Read too many events"); //$NON-NLS-1$ + } + } + + @Override + public void handleCompleted() { + nbRead[0] += getNbRead(); + if (nbRead[0] >= request.getNbRequested() || (getNbRead() < CHUNK_SIZE[0])) { + if (isCancelled()) { + request.cancel(); + } else { + request.done(); + } + isFinished[0] = Boolean.TRUE; + } + super.handleCompleted(); + } + }; + + if (!isFinished[0]) { + queueRequest(subRequest); + + try { + subRequest.waitForCompletion(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + CHUNK_SIZE[0] = Math.min(request.getNbRequested() - nbRead[0], blockSize); + } + } + } + }; + + thread.start(); + } + + /** + * Initialize the provider based on the request. The context is provider + * specific and will be updated by getNext(). + * + * @param request + * @return an application specific context; null if request can't be + * serviced + */ + public abstract ITmfContext armRequest(ITmfDataRequest request); + + public abstract T getNext(ITmfContext context); + + /** + * Checks if the data meets the request completion criteria. + * + * @param request + * @param data + * @return + */ + public boolean isCompleted(ITmfDataRequest request, T data, int nbRead) { + return request.isCompleted() || nbRead >= request.getNbRequested() || data.isNullRef(); + } + + // ------------------------------------------------------------------------ + // Signal handlers + // ------------------------------------------------------------------------ + + @TmfSignalHandler + public void startSynch(TmfStartSynchSignal signal) { + synchronized (fLock) { + fSignalDepth++; + } + } + + @TmfSignalHandler + public void endSynch(TmfEndSynchSignal signal) { synchronized (fLock) { - fSignalDepth--; - if (fSignalDepth == 0) { - fireRequest(); - } + fSignalDepth--; + if (fSignalDepth == 0) { + fireRequest(); + } } - } + } } diff --git a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/ITmfContext.java b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/ITmfContext.java index bd6e005157..5536cf7f3a 100644 --- a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/ITmfContext.java +++ b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/ITmfContext.java @@ -19,16 +19,21 @@ package org.eclipse.linuxtools.tmf.trace; */ public interface ITmfContext { - public long UNKNOWN_RANK = -2L; + public long UNKNOWN_RANK = -2L; public long INITIAL_RANK = -1L; - public void setLocation(ITmfLocation location); - @SuppressWarnings("rawtypes") - public ITmfLocation getLocation(); + public void dispose(); - public void setRank(long rank); - public long getRank(); - public void updateRank(int rank); + public void setLocation(ITmfLocation location); - public boolean isValidRank(); + @SuppressWarnings("rawtypes") + public ITmfLocation getLocation(); + + public void setRank(long rank); + + public long getRank(); + + public void updateRank(int rank); + + public boolean isValidRank(); } diff --git a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/TmfContext.java b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/TmfContext.java index d4eadafbdb..4b93029f8a 100644 --- a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/TmfContext.java +++ b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/TmfContext.java @@ -12,7 +12,6 @@ package org.eclipse.linuxtools.tmf.trace; - /** * TmfContext *

@@ -22,105 +21,110 @@ package org.eclipse.linuxtools.tmf.trace; */ public class TmfContext implements ITmfContext, Cloneable { - private ITmfLocation> fLocation; - private long fRank; - - // ------------------------------------------------------------------------ - // Constructors - // ------------------------------------------------------------------------ - - public TmfContext(ITmfLocation> loc, long rank) { - fLocation = loc; - fRank = rank; - } - - public TmfContext(ITmfLocation> location) { - this(location, UNKNOWN_RANK); - } - - public TmfContext(TmfContext other) { - this(other.fLocation, other.fRank); - } - - public TmfContext() { - this(null, UNKNOWN_RANK); - } - - // ------------------------------------------------------------------------ - // ITmfContext - // ------------------------------------------------------------------------ - - @Override - public void setLocation(ITmfLocation> location) { - fLocation = location; - } - - @Override - public ITmfLocation> getLocation() { - return fLocation; - } - - @Override - public void setRank(long rank) { - fRank = rank; - } - - @Override - public long getRank() { - return fRank; - } - - @Override - public void updateRank(int delta) { - if (isValidRank()) - fRank += delta; - } - - @Override - public boolean isValidRank() { - return fRank != UNKNOWN_RANK; - } - - // ------------------------------------------------------------------------ - // Object - // ------------------------------------------------------------------------ + private ITmfLocation> fLocation; + private long fRank; + + // ------------------------------------------------------------------------ + // Constructors + // ------------------------------------------------------------------------ + + public TmfContext(ITmfLocation> loc, long rank) { + fLocation = loc; + fRank = rank; + } + + public TmfContext(ITmfLocation> location) { + this(location, UNKNOWN_RANK); + } + + public TmfContext(TmfContext other) { + this(other.fLocation, other.fRank); + } + + public TmfContext() { + this(null, UNKNOWN_RANK); + } + + // ------------------------------------------------------------------------ + // ITmfContext + // ------------------------------------------------------------------------ + + @Override + public void dispose() { + // override if necessary + } + + @Override + public void setLocation(ITmfLocation> location) { + fLocation = location; + } + + @Override + public ITmfLocation> getLocation() { + return fLocation; + } + + @Override + public void setRank(long rank) { + fRank = rank; + } + + @Override + public long getRank() { + return fRank; + } + + @Override + public void updateRank(int delta) { + if (isValidRank()) + fRank += delta; + } + + @Override + public boolean isValidRank() { + return fRank != UNKNOWN_RANK; + } + + // ------------------------------------------------------------------------ + // Object + // ------------------------------------------------------------------------ @Override public int hashCode() { - int result = 17; - result = 37 * result + fLocation.hashCode(); - result = 37 * result + (int) (fRank ^ (fRank >>> 32)); - return result; + int result = 17; + result = 37 * result + fLocation.hashCode(); + result = 37 * result + (int) (fRank ^ (fRank >>> 32)); + return result; } - + @Override public boolean equals(Object other) { - if (other == this) { - return true; - } - if (!(other instanceof TmfContext)) { - return false; - } - TmfContext o = (TmfContext) other; - return fLocation.equals(o.fLocation) && (fRank == o.fRank); + if (other == this) { + return true; + } + if (!(other instanceof TmfContext)) { + return false; + } + TmfContext o = (TmfContext) other; + return fLocation.equals(o.fLocation) && (fRank == o.fRank); } - - @Override + + @Override @SuppressWarnings("nls") public String toString() { - return "[TmfContext(" + fLocation.toString() + "," + fRank + ")]"; + return "[TmfContext(" + fLocation.toString() + "," + fRank + ")]"; + } + + @Override + public TmfContext clone() { + TmfContext clone = null; + try { + clone = (TmfContext) super.clone(); + clone.fLocation = fLocation.clone(); + clone.fRank = fRank; + } catch (CloneNotSupportedException e) { + } + return clone; } - - @Override - public TmfContext clone() { - TmfContext clone = null; - try { - clone = (TmfContext) super.clone(); - clone.fLocation = fLocation.clone(); - clone.fRank = fRank; - } catch (CloneNotSupportedException e) { - } - return clone; - } } -- 2.34.1