Commit | Line | Data |
---|---|---|
788ddcbc | 1 | /******************************************************************************* |
ed902a2b | 2 | * Copyright (c) 2012, 2014 Ericsson |
788ddcbc MK |
3 | * |
4 | * All rights reserved. This program and the accompanying materials are made | |
5 | * available under the terms of the Eclipse Public License v1.0 which | |
6 | * accompanies this distribution, and is available at | |
7 | * http://www.eclipse.org/legal/epl-v10.html | |
8 | * | |
f0414df8 SD |
9 | * Contributors: |
10 | * Matthew Khouzam - Initial API and implementation | |
11 | * Simon Delisle - Remove the iterator in dispose() | |
788ddcbc MK |
12 | *******************************************************************************/ |
13 | ||
9722e5d7 | 14 | package org.eclipse.tracecompass.tmf.ctf.core.context; |
788ddcbc | 15 | |
fe71057b | 16 | import org.eclipse.tracecompass.internal.tmf.ctf.core.trace.iterator.CtfIterator; |
2bdf0193 AM |
17 | import org.eclipse.tracecompass.tmf.core.trace.ITmfContext; |
18 | import org.eclipse.tracecompass.tmf.core.trace.location.ITmfLocation; | |
9722e5d7 AM |
19 | import org.eclipse.tracecompass.tmf.ctf.core.event.CtfTmfEvent; |
20 | import org.eclipse.tracecompass.tmf.ctf.core.trace.CtfTmfTrace; | |
788ddcbc MK |
21 | |
22 | /** | |
23 | * Lightweight Context for CtfTmf traces. Should only use 3 references, 1 ref to | |
24 | * a boxed Long, a long and an int. | |
25 | * | |
26 | * @author Matthew Khouzam | |
788ddcbc | 27 | */ |
81a2d02e | 28 | public class CtfTmfContext implements ITmfContext { |
788ddcbc | 29 | |
788ddcbc MK |
30 | // ------------------------------------------- |
31 | // Fields | |
32 | // ------------------------------------------- | |
81a2d02e | 33 | |
b94865c3 MK |
34 | private CtfLocation fCurLocation; |
35 | private long fCurRank; | |
788ddcbc | 36 | |
53b235e1 | 37 | private final CtfTmfTrace fTrace; |
788ddcbc MK |
38 | |
39 | // ------------------------------------------- | |
40 | // Constructor | |
41 | // ------------------------------------------- | |
53b235e1 MK |
42 | |
43 | /** | |
81a2d02e | 44 | * Constructor |
53b235e1 MK |
45 | * |
46 | * @param ctfTmfTrace | |
47 | * the parent trace | |
53b235e1 | 48 | */ |
81a2d02e | 49 | public CtfTmfContext(CtfTmfTrace ctfTmfTrace) { |
53b235e1 | 50 | fTrace = ctfTmfTrace; |
b94865c3 | 51 | fCurLocation = new CtfLocation(new CtfLocationInfo(0, 0)); |
788ddcbc MK |
52 | } |
53 | ||
54 | // ------------------------------------------- | |
55 | // TmfContext Overrides | |
56 | // ------------------------------------------- | |
57 | ||
58 | @Override | |
59 | public long getRank() { | |
b94865c3 | 60 | return fCurRank; |
788ddcbc MK |
61 | } |
62 | ||
63 | @Override | |
51a7e2f6 | 64 | public synchronized ITmfLocation getLocation() { |
b94865c3 | 65 | return fCurLocation; |
788ddcbc MK |
66 | } |
67 | ||
68 | @Override | |
69 | public boolean hasValidRank() { | |
b94865c3 | 70 | return fCurRank != CtfLocation.INVALID_LOCATION.getTimestamp(); |
788ddcbc MK |
71 | } |
72 | ||
73 | @Override | |
51a7e2f6 | 74 | public synchronized void setLocation(ITmfLocation location) { |
b94865c3 MK |
75 | fCurLocation = (CtfLocation) location; |
76 | if (fCurLocation != null) { | |
77 | getIterator().seek(fCurLocation.getLocationInfo()); | |
575beffc | 78 | } |
788ddcbc MK |
79 | } |
80 | ||
81 | @Override | |
82 | public void setRank(long rank) { | |
b94865c3 | 83 | fCurRank = rank; |
788ddcbc MK |
84 | |
85 | } | |
86 | ||
87 | @Override | |
88 | public void increaseRank() { | |
89 | if (hasValidRank()) { | |
b94865c3 | 90 | fCurRank++; |
788ddcbc MK |
91 | } |
92 | } | |
93 | ||
94 | // ------------------------------------------- | |
95 | // CtfTmfTrace Helpers | |
96 | // ------------------------------------------- | |
97 | ||
81a2d02e AM |
98 | /** |
99 | * Gets the trace of this context. | |
100 | * | |
101 | * @return The trace of this context | |
102 | */ | |
103 | public CtfTmfTrace getTrace() { | |
104 | return fTrace; | |
105 | } | |
106 | ||
788ddcbc MK |
107 | /** |
108 | * Gets the current event. Wrapper to help CtfTmfTrace | |
53b235e1 | 109 | * |
788ddcbc MK |
110 | * @return The event or null |
111 | */ | |
112 | public synchronized CtfTmfEvent getCurrentEvent() { | |
53b235e1 | 113 | return getIterator().getCurrentEvent(); |
788ddcbc MK |
114 | } |
115 | ||
116 | /** | |
117 | * Advances to a the next event. Wrapper to help CtfTmfTrace | |
53b235e1 | 118 | * |
788ddcbc MK |
119 | * @return success or not |
120 | */ | |
121 | public synchronized boolean advance() { | |
b94865c3 | 122 | final CtfLocationInfo curLocationData = fCurLocation.getLocationInfo(); |
962fb72f PT |
123 | CtfIterator iterator = getIterator(); |
124 | boolean retVal = iterator.advance(); | |
125 | CtfTmfEvent currentEvent = iterator.getCurrentEvent(); | |
132a02b0 | 126 | |
788ddcbc | 127 | if (currentEvent != null) { |
962fb72f | 128 | final long timestampValue = iterator.getCurrentTimestamp(); |
132a02b0 | 129 | if (curLocationData.getTimestamp() == timestampValue) { |
b94865c3 | 130 | fCurLocation = new CtfLocation(timestampValue, curLocationData.getIndex() + 1); |
132a02b0 | 131 | } else { |
b94865c3 | 132 | fCurLocation = new CtfLocation(timestampValue, 0L); |
132a02b0 | 133 | } |
788ddcbc | 134 | } else { |
b94865c3 | 135 | fCurLocation = new CtfLocation(CtfLocation.INVALID_LOCATION); |
788ddcbc MK |
136 | } |
137 | ||
138 | return retVal; | |
139 | } | |
140 | ||
141 | @Override | |
142 | public void dispose() { | |
6a0ec7bc | 143 | fTrace.getIteratorManager().removeIterator(this); |
788ddcbc MK |
144 | } |
145 | ||
146 | /** | |
147 | * Seeks to a given timestamp. Wrapper to help CtfTmfTrace | |
53b235e1 MK |
148 | * |
149 | * @param timestamp | |
150 | * desired timestamp | |
788ddcbc MK |
151 | * @return success or not |
152 | */ | |
153 | public synchronized boolean seek(final long timestamp) { | |
b94865c3 | 154 | fCurLocation = new CtfLocation(timestamp, 0); |
53b235e1 | 155 | return getIterator().seek(timestamp); |
788ddcbc MK |
156 | } |
157 | ||
132a02b0 MK |
158 | /** |
159 | * Seeks to a given location. Wrapper to help CtfTmfTrace | |
160 | * @param location | |
161 | * unique location to find the event. | |
162 | * | |
163 | * @return success or not | |
132a02b0 | 164 | */ |
f5df94f8 | 165 | public synchronized boolean seek(final CtfLocationInfo location) { |
b94865c3 | 166 | fCurLocation = new CtfLocation(location); |
132a02b0 MK |
167 | return getIterator().seek(location); |
168 | } | |
169 | ||
788ddcbc MK |
170 | // ------------------------------------------- |
171 | // Private helpers | |
172 | // ------------------------------------------- | |
81a2d02e | 173 | |
788ddcbc | 174 | /** |
53b235e1 MK |
175 | * Get iterator, called every time to get an iterator, no local copy is |
176 | * stored so that there is no need to "update" | |
788ddcbc | 177 | * |
53b235e1 | 178 | * @return an iterator |
788ddcbc MK |
179 | */ |
180 | private CtfIterator getIterator() { | |
6a0ec7bc | 181 | return fTrace.getIteratorManager().getIterator(this); |
788ddcbc | 182 | } |
788ddcbc | 183 | } |