ss: Improve getQuarks() functionality
[deliverable/tracecompass.git] / statesystem / org.eclipse.tracecompass.statesystem.core / src / org / eclipse / tracecompass / internal / statesystem / core / StateSystem.java
CommitLineData
a52fde77 1/*******************************************************************************
c44f0a0c 2 * Copyright (c) 2012, 2016 Ericsson
a52fde77
AM
3 * Copyright (c) 2010, 2011 École Polytechnique de Montréal
4 * Copyright (c) 2010, 2011 Alexandre Montplaisir <alexandre.montplaisir@gmail.com>
5df842b3 5 *
a52fde77
AM
6 * All rights reserved. This program and the accompanying materials are
7 * made available under the terms of the Eclipse Public License v1.0 which
8 * accompanies this distribution, and is available at
9 * http://www.eclipse.org/legal/epl-v10.html
5df842b3 10 *
e13bd4cd
PT
11 * Contributors:
12 * Alexandre Montplaisir - Initial API and implementation
13 * Patrick Tasse - Add message to exceptions
a52fde77
AM
14 *******************************************************************************/
15
e894a508 16package org.eclipse.tracecompass.internal.statesystem.core;
a52fde77 17
8d1346f0
AM
18import java.io.File;
19import java.io.IOException;
a52fde77 20import java.io.PrintWriter;
8d1346f0 21import java.util.ArrayList;
c44f0a0c 22import java.util.Arrays;
f94a0bac 23import java.util.LinkedList;
a52fde77 24import java.util.List;
16576a7e 25import java.util.concurrent.CountDownLatch;
9287b6a2 26import java.util.concurrent.TimeUnit;
a52fde77 27
2e21b6d8 28import org.eclipse.jdt.annotation.NonNull;
df2597e0 29import org.eclipse.jdt.annotation.Nullable;
e894a508
AM
30import org.eclipse.tracecompass.statesystem.core.ITmfStateSystemBuilder;
31import org.eclipse.tracecompass.statesystem.core.backend.IStateHistoryBackend;
32import org.eclipse.tracecompass.statesystem.core.exceptions.AttributeNotFoundException;
33import org.eclipse.tracecompass.statesystem.core.exceptions.StateSystemDisposedException;
34import org.eclipse.tracecompass.statesystem.core.exceptions.StateValueTypeException;
35import org.eclipse.tracecompass.statesystem.core.exceptions.TimeRangeException;
36import org.eclipse.tracecompass.statesystem.core.interval.ITmfStateInterval;
e894a508 37import org.eclipse.tracecompass.statesystem.core.statevalue.ITmfStateValue;
e894a508 38import org.eclipse.tracecompass.statesystem.core.statevalue.ITmfStateValue.Type;
1dd75589 39import org.eclipse.tracecompass.statesystem.core.statevalue.TmfStateValue;
a52fde77 40
aa315d8b
PT
41import com.google.common.collect.ImmutableCollection.Builder;
42import com.google.common.collect.ImmutableSet;
43
a52fde77 44/**
8d1346f0
AM
45 * This is the core class of the Generic State System. It contains all the
46 * methods to build and query a state history. It's exposed externally through
47 * the IStateSystemQuerier and IStateSystemBuilder interfaces, depending if the
48 * user needs read-only access or read-write access.
5df842b3 49 *
8d1346f0
AM
50 * When building, DON'T FORGET to call .closeHistory() when you are done
51 * inserting intervals, or the storage backend will have no way of knowing it
52 * can close and write itself to disk, and its thread will keep running.
5df842b3 53 *
a52fde77 54 * @author alexmont
5df842b3 55 *
a52fde77 56 */
f1f86dfb 57public class StateSystem implements ITmfStateSystemBuilder {
a52fde77 58
aa315d8b
PT
59 private static final String PARENT = ".."; //$NON-NLS-1$
60 private static final String WILDCARD = "*"; //$NON-NLS-1$
61
a52fde77 62 /* References to the inner structures */
8d1346f0
AM
63 private final AttributeTree attributeTree;
64 private final TransientState transState;
65 private final IStateHistoryBackend backend;
a52fde77 66
16576a7e
AM
67 /* Latch tracking if the state history is done building or not */
68 private final CountDownLatch finishedLatch = new CountDownLatch(1);
69
1a4205d9 70 private boolean buildCancelled = false;
96345c5a 71 private boolean isDisposed = false;
1a4205d9 72
f9a76cac
AM
73 /**
74 * New-file constructor. For when you build a state system with a new file,
75 * or if the back-end does not require a file on disk.
76 *
77 * @param backend
78 * Back-end plugin to use
79 */
b2f62cb5 80 public StateSystem(@NonNull IStateHistoryBackend backend) {
f9a76cac
AM
81 this.backend = backend;
82 this.transState = new TransientState(backend);
83 this.attributeTree = new AttributeTree(this);
84 }
85
a52fde77 86 /**
8d1346f0
AM
87 * General constructor
88 *
89 * @param backend
f9a76cac 90 * The "state history storage" back-end to use.
8d1346f0
AM
91 * @param newFile
92 * Put true if this is a new history started from scratch. It is
93 * used to tell the state system where to get its attribute tree.
94 * @throws IOException
95 * If there was a problem creating the new history file
a52fde77 96 */
b2f62cb5 97 public StateSystem(@NonNull IStateHistoryBackend backend, boolean newFile)
8d1346f0
AM
98 throws IOException {
99 this.backend = backend;
100 this.transState = new TransientState(backend);
a52fde77 101
8d1346f0
AM
102 if (newFile) {
103 attributeTree = new AttributeTree(this);
104 } else {
105 /* We're opening an existing file */
106 this.attributeTree = new AttributeTree(this, backend.supplyAttributeTreeReader());
107 transState.setInactive();
16576a7e
AM
108 finishedLatch.countDown(); /* The history is already built */
109 }
110 }
111
84a9548a
AM
112 @Override
113 public String getSSID() {
b2f62cb5 114 return backend.getSSID();
84a9548a
AM
115 }
116
16576a7e 117 @Override
2002c638
AM
118 public boolean isCancelled() {
119 return buildCancelled;
120 }
121
122 @Override
123 public void waitUntilBuilt() {
16576a7e
AM
124 try {
125 finishedLatch.await();
126 } catch (InterruptedException e) {
127 e.printStackTrace();
8d1346f0 128 }
1a4205d9
AM
129 }
130
9287b6a2
AM
131 @Override
132 public boolean waitUntilBuilt(long timeout) {
133 boolean ret = false;
134 try {
135 ret = finishedLatch.await(timeout, TimeUnit.MILLISECONDS);
136 } catch (InterruptedException e) {
137 e.printStackTrace();
138 }
139 return ret;
140 }
141
1a4205d9
AM
142 @Override
143 public synchronized void dispose() {
96345c5a 144 isDisposed = true;
1a4205d9
AM
145 if (transState.isActive()) {
146 transState.setInactive();
147 buildCancelled = true;
148 }
149 backend.dispose();
a52fde77
AM
150 }
151
8d1346f0
AM
152 //--------------------------------------------------------------------------
153 // General methods related to the attribute tree
154 //--------------------------------------------------------------------------
155
339d27b4
AM
156 /**
157 * Get the attribute tree associated with this state system. This should be
158 * the only way of accessing it (and if subclasses want to point to a
159 * different attribute tree than their own, they should only need to
160 * override this).
161 *
162 * @return The attribute tree
163 */
164 public AttributeTree getAttributeTree() {
165 return attributeTree;
166 }
167
8d1346f0
AM
168 /**
169 * Method used by the attribute tree when creating new attributes, to keep
170 * the attribute count in the transient state in sync.
171 */
bcec0116 172 public void addEmptyAttribute() {
8d1346f0
AM
173 transState.addEmptyEntry();
174 }
175
176 @Override
4623f57f 177 public int getNbAttributes() {
339d27b4 178 return getAttributeTree().getNbAttributes();
4623f57f
AM
179 }
180
8d1346f0
AM
181 @Override
182 public String getAttributeName(int attributeQuark) {
339d27b4 183 return getAttributeTree().getAttributeName(attributeQuark);
8d1346f0
AM
184 }
185
186 @Override
187 public String getFullAttributePath(int attributeQuark) {
339d27b4 188 return getAttributeTree().getFullAttributeName(attributeQuark);
8d1346f0
AM
189 }
190
34638411
AM
191 @Override
192 public String[] getFullAttributePathArray(int attributeQuark) {
193 return getAttributeTree().getFullAttributePathArray(attributeQuark);
194 }
195
8d1346f0
AM
196 //--------------------------------------------------------------------------
197 // Methods related to the storage backend
198 //--------------------------------------------------------------------------
a52fde77 199
8d1346f0
AM
200 @Override
201 public long getStartTime() {
202 return backend.getStartTime();
203 }
204
205 @Override
206 public long getCurrentEndTime() {
207 return backend.getEndTime();
208 }
209
210 @Override
211 public void closeHistory(long endTime) throws TimeRangeException {
212 File attributeTreeFile;
213 long attributeTreeFilePos;
214 long realEndTime = endTime;
215
216 if (realEndTime < backend.getEndTime()) {
217 /*
218 * This can happen (empty nodes pushing the border further, etc.)
219 * but shouldn't be too big of a deal.
220 */
221 realEndTime = backend.getEndTime();
222 }
223 transState.closeTransientState(realEndTime);
224 backend.finishedBuilding(realEndTime);
225
226 attributeTreeFile = backend.supplyAttributeTreeWriterFile();
227 attributeTreeFilePos = backend.supplyAttributeTreeWriterFilePosition();
228 if (attributeTreeFile != null) {
229 /*
230 * If null was returned, we simply won't save the attribute tree,
231 * too bad!
232 */
339d27b4 233 getAttributeTree().writeSelf(attributeTreeFile, attributeTreeFilePos);
8d1346f0 234 }
16576a7e 235 finishedLatch.countDown(); /* Mark the history as finished building */
8d1346f0
AM
236 }
237
238 //--------------------------------------------------------------------------
239 // Quark-retrieving methods
240 //--------------------------------------------------------------------------
241
242 @Override
a52fde77
AM
243 public int getQuarkAbsolute(String... attribute)
244 throws AttributeNotFoundException {
c44f0a0c
PT
245 int quark = getAttributeTree().getQuarkDontAdd(ROOT_ATTRIBUTE, attribute);
246 if (quark == INVALID_ATTRIBUTE) {
247 throw new AttributeNotFoundException(getSSID() + " Path:" + Arrays.toString(attribute)); //$NON-NLS-1$
248 }
249 return quark;
250 }
251
252 @Override
253 public int optQuarkAbsolute(String... attribute) {
254 return getAttributeTree().getQuarkDontAdd(ROOT_ATTRIBUTE, attribute);
a52fde77
AM
255 }
256
8d1346f0 257 @Override
a52fde77 258 public int getQuarkAbsoluteAndAdd(String... attribute) {
c44f0a0c 259 return getAttributeTree().getQuarkAndAdd(ROOT_ATTRIBUTE, attribute);
a52fde77
AM
260 }
261
8d1346f0 262 @Override
a52fde77
AM
263 public int getQuarkRelative(int startingNodeQuark, String... subPath)
264 throws AttributeNotFoundException {
c44f0a0c
PT
265 int quark = getAttributeTree().getQuarkDontAdd(startingNodeQuark, subPath);
266 if (quark == INVALID_ATTRIBUTE) {
267 throw new AttributeNotFoundException(getSSID() + " Quark:" + startingNodeQuark + ", SubPath:" + Arrays.toString(subPath)); //$NON-NLS-1$ //$NON-NLS-2$
268 }
269 return quark;
270 }
271
272 @Override
273 public int optQuarkRelative(int startingNodeQuark, String... subPath) {
339d27b4 274 return getAttributeTree().getQuarkDontAdd(startingNodeQuark, subPath);
a52fde77
AM
275 }
276
8d1346f0 277 @Override
a52fde77 278 public int getQuarkRelativeAndAdd(int startingNodeQuark, String... subPath) {
339d27b4 279 return getAttributeTree().getQuarkAndAdd(startingNodeQuark, subPath);
a52fde77
AM
280 }
281
8d1346f0 282 @Override
aa315d8b 283 public List<@NonNull Integer> getSubAttributes(int quark, boolean recursive)
0a9de3d2 284 throws AttributeNotFoundException {
339d27b4 285 return getAttributeTree().getSubAttributes(quark, recursive);
0a9de3d2
AM
286 }
287
5206c858 288 @Override
aa315d8b 289 public List<@NonNull Integer> getSubAttributes(int quark, boolean recursive, String pattern)
5206c858
AM
290 throws AttributeNotFoundException {
291 List<Integer> all = getSubAttributes(quark, recursive);
aa315d8b 292 List<@NonNull Integer> ret = new LinkedList<>();
5206c858
AM
293 for (Integer attQuark : all) {
294 String name = getAttributeName(attQuark.intValue());
295 if (name.matches(pattern)) {
296 ret.add(attQuark);
297 }
298 }
299 return ret;
300 }
301
0fdd2c45
FG
302 @Override
303 public int getParentAttributeQuark(int quark) {
304 return getAttributeTree().getParentAttributeQuark(quark);
305 }
306
8d1346f0 307 @Override
df2597e0 308 public List<@NonNull Integer> getQuarks(String... pattern) {
aa315d8b
PT
309 return getQuarks(ROOT_ATTRIBUTE, pattern);
310 }
f94a0bac 311
aa315d8b
PT
312 @Override
313 public List<@NonNull Integer> getQuarks(int startingNodeQuark, String... pattern) {
314 Builder<@NonNull Integer> builder = ImmutableSet.builder();
315 if (pattern.length > 0) {
316 getQuarks(builder, startingNodeQuark, Arrays.asList(pattern));
c44f0a0c 317 } else {
aa315d8b 318 builder.add(startingNodeQuark);
f94a0bac 319 }
aa315d8b
PT
320 return builder.build().asList();
321 }
f94a0bac 322
aa315d8b
PT
323 private void getQuarks(Builder<@NonNull Integer> builder, int quark, List<String> pattern) {
324 try {
325 String element = pattern.get(0);
326 if (element == null) {
327 return;
f94a0bac 328 }
aa315d8b
PT
329 List<String> remainder = pattern.subList(1, pattern.size());
330 if (remainder.isEmpty()) {
331 if (element.equals(WILDCARD)) {
332 builder.addAll(getSubAttributes(quark, false));
333 } else if (element.equals(PARENT)){
334 builder.add(getParentAttributeQuark(quark));
335 } else {
336 int subQuark = optQuarkRelative(quark, element);
337 if (subQuark != INVALID_ATTRIBUTE) {
338 builder.add(subQuark);
339 }
340 }
341 } else {
342 if (element.equals(WILDCARD)) {
343 for (@NonNull Integer subquark : getSubAttributes(quark, false)) {
344 getQuarks(builder, subquark, remainder);
345 }
346 } else if (element.equals(PARENT)){
347 getQuarks(builder, getParentAttributeQuark(quark), remainder);
348 } else {
349 int subQuark = optQuarkRelative(quark, element);
350 if (subQuark != INVALID_ATTRIBUTE) {
351 getQuarks(builder, subQuark, remainder);
352 }
353 }
354 }
355 } catch (AttributeNotFoundException e) {
356 /* The starting node quark is out of range */
357 throw new IndexOutOfBoundsException(String.format("Index: %d, Size: %d", quark, getNbAttributes())); //$NON-NLS-1$
f94a0bac 358 }
f94a0bac
AM
359 }
360
8d1346f0
AM
361 //--------------------------------------------------------------------------
362 // Methods related to insertions in the history
363 //--------------------------------------------------------------------------
a52fde77 364
8d1346f0 365 @Override
a52fde77 366 public void modifyAttribute(long t, ITmfStateValue value, int attributeQuark)
7e0b2b56
AM
367 throws TimeRangeException, AttributeNotFoundException,
368 StateValueTypeException {
feea3b3c
AM
369 if (value == null) {
370 /*
371 * TODO Replace with @NonNull parameter (will require fixing all the
372 * state providers!)
373 */
374 throw new IllegalArgumentException();
375 }
a52fde77
AM
376 transState.processStateChange(t, value, attributeQuark);
377 }
378
acec47ce 379 @Deprecated
8d1346f0 380 @Override
a52fde77
AM
381 public void incrementAttribute(long t, int attributeQuark)
382 throws StateValueTypeException, TimeRangeException,
383 AttributeNotFoundException {
359eeba0
PT
384 ITmfStateValue stateValue = queryOngoingState(attributeQuark);
385 int prevValue = 0;
386 /* if the attribute was previously null, start counting at 0 */
387 if (!stateValue.isNull()) {
388 prevValue = stateValue.unboxInt();
280bbdbb 389 }
a52fde77
AM
390 modifyAttribute(t, TmfStateValue.newValueInt(prevValue + 1),
391 attributeQuark);
392 }
393
8d1346f0 394 @Override
a52fde77
AM
395 public void pushAttribute(long t, ITmfStateValue value, int attributeQuark)
396 throws TimeRangeException, AttributeNotFoundException,
397 StateValueTypeException {
0126a8ca 398 int stackDepth;
a52fde77
AM
399 int subAttributeQuark;
400 ITmfStateValue previousSV = transState.getOngoingStateValue(attributeQuark);
401
402 if (previousSV.isNull()) {
403 /*
404 * If the StateValue was null, this means this is the first time we
405 * use this attribute. Leave stackDepth at 0.
406 */
cb42195c 407 stackDepth = 0;
b67a2540 408 } else if (previousSV.getType() == Type.INTEGER) {
a52fde77
AM
409 /* Previous value was an integer, all is good, use it */
410 stackDepth = previousSV.unboxInt();
a52fde77
AM
411 } else {
412 /* Previous state of this attribute was another type? Not good! */
e13bd4cd 413 throw new StateValueTypeException(getSSID() + " Quark:" + attributeQuark + ", Type:" + previousSV.getType() + ", Expected:" + Type.INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
90a25ebe
AM
414 }
415
e8251298 416 if (stackDepth >= 100000) {
90a25ebe 417 /*
a0f8fb9b
FW
418 * Limit stackDepth to 100000, to avoid having Attribute Trees grow
419 * out of control due to buggy insertions
90a25ebe 420 */
e13bd4cd
PT
421 String message = " Stack limit reached, not pushing"; //$NON-NLS-1$
422 throw new AttributeNotFoundException(getSSID() + " Quark:" + attributeQuark + message); //$NON-NLS-1$
a52fde77
AM
423 }
424
425 stackDepth++;
0126a8ca 426 subAttributeQuark = getQuarkRelativeAndAdd(attributeQuark, String.valueOf(stackDepth));
a52fde77 427
5896eb76 428 modifyAttribute(t, TmfStateValue.newValueInt(stackDepth), attributeQuark);
90a25ebe 429 modifyAttribute(t, value, subAttributeQuark);
a52fde77
AM
430 }
431
8d1346f0 432 @Override
5896eb76 433 public ITmfStateValue popAttribute(long t, int attributeQuark)
a52fde77
AM
434 throws AttributeNotFoundException, TimeRangeException,
435 StateValueTypeException {
e2eac108 436 /* These are the state values of the stack-attribute itself */
e13bd4cd 437 ITmfStateValue previousSV = transState.getOngoingStateValue(attributeQuark);
a52fde77
AM
438
439 if (previousSV.isNull()) {
e2eac108
AM
440 /*
441 * Trying to pop an empty stack. This often happens at the start of
442 * traces, for example when we see a syscall_exit, without having
443 * the corresponding syscall_entry in the trace. Just ignore
444 * silently.
445 */
5896eb76 446 return null;
90a25ebe 447 }
b67a2540 448 if (previousSV.getType() != Type.INTEGER) {
a52fde77 449 /*
b67a2540
AM
450 * The existing value was not an integer (which is expected for
451 * stack tops), this doesn't look like a valid stack attribute.
a52fde77 452 */
e13bd4cd 453 throw new StateValueTypeException(getSSID() + " Quark:" + attributeQuark + ", Type:" + previousSV.getType() + ", Expected:" + Type.INTEGER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
a52fde77
AM
454 }
455
0126a8ca 456 int stackDepth = previousSV.unboxInt();
90a25ebe 457
e2eac108 458 if (stackDepth <= 0) {
a52fde77 459 /* This on the other hand should not happen... */
e13bd4cd 460 throw new StateValueTypeException(getSSID() + " Quark:" + attributeQuark + ", Stack depth:" + stackDepth); //$NON-NLS-1$//$NON-NLS-2$
a52fde77
AM
461 }
462
e2eac108 463 /* The attribute should already exist at this point */
0126a8ca 464 int subAttributeQuark = getQuarkRelative(attributeQuark, String.valueOf(stackDepth));
5896eb76 465 ITmfStateValue poppedValue = queryOngoingState(subAttributeQuark);
a52fde77 466
e2eac108
AM
467 /* Update the state value of the stack-attribute */
468 ITmfStateValue nextSV;
a0f8fb9b 469 if (--stackDepth == 0) {
359eeba0 470 /* Store a null state value */
e2eac108
AM
471 nextSV = TmfStateValue.nullValue();
472 } else {
473 nextSV = TmfStateValue.newValueInt(stackDepth);
474 }
475 modifyAttribute(t, nextSV, attributeQuark);
476
477 /* Delete the sub-attribute that contained the user's state value */
a52fde77 478 removeAttribute(t, subAttributeQuark);
e2eac108 479
5896eb76 480 return poppedValue;
a52fde77
AM
481 }
482
8d1346f0 483 @Override
a52fde77
AM
484 public void removeAttribute(long t, int attributeQuark)
485 throws TimeRangeException, AttributeNotFoundException {
feea3b3c
AM
486 if (attributeQuark < 0) {
487 throw new IllegalArgumentException();
488 }
c66426fd
AM
489
490 /*
feea3b3c 491 * Nullify our children first, recursively. We pass 'false' because we
c66426fd
AM
492 * handle the recursion ourselves.
493 */
feea3b3c 494 List<Integer> childAttributes = getSubAttributes(attributeQuark, false);
0126a8ca 495 for (int childNodeQuark : childAttributes) {
feea3b3c
AM
496 if (attributeQuark == childNodeQuark) {
497 /* Something went very wrong when building out attribute tree */
498 throw new IllegalStateException();
499 }
a52fde77
AM
500 removeAttribute(t, childNodeQuark);
501 }
502 /* Nullify ourselves */
7e0b2b56 503 try {
feea3b3c 504 transState.processStateChange(t, TmfStateValue.nullValue(), attributeQuark);
7e0b2b56 505 } catch (StateValueTypeException e) {
50678114
AM
506 /*
507 * Will not happen since we're inserting null values only, but poor
508 * compiler has no way of knowing this...
7e0b2b56 509 */
cb42195c 510 throw new IllegalStateException(e);
7e0b2b56 511 }
a52fde77
AM
512 }
513
8d1346f0
AM
514 //--------------------------------------------------------------------------
515 // "Current" query/update methods
516 //--------------------------------------------------------------------------
a52fde77 517
8d1346f0 518 @Override
a52fde77
AM
519 public ITmfStateValue queryOngoingState(int attributeQuark)
520 throws AttributeNotFoundException {
521 return transState.getOngoingStateValue(attributeQuark);
522 }
523
602c0697
AM
524 @Override
525 public long getOngoingStartTime(int attribute)
526 throws AttributeNotFoundException {
527 return transState.getOngoingStartTime(attribute);
528 }
529
8d1346f0 530 @Override
a52fde77
AM
531 public void updateOngoingState(ITmfStateValue newValue, int attributeQuark)
532 throws AttributeNotFoundException {
533 transState.changeOngoingStateValue(attributeQuark, newValue);
534 }
535
66866869
AM
536 /**
537 * Modify the whole "ongoing state" (state values + start times). This can
538 * be used when "seeking" a state system to a different point in the trace
539 * (and restoring the known stateInfo at this location). Use with care!
540 *
541 * @param newStateIntervals
542 * The new List of state values to use as ongoing state info
543 */
df2597e0 544 protected void replaceOngoingState(@NonNull List<@NonNull ITmfStateInterval> newStateIntervals) {
66866869 545 transState.replaceOngoingState(newStateIntervals);
a0f8fb9b 546 }
66866869 547
8d1346f0
AM
548 //--------------------------------------------------------------------------
549 // Regular query methods (sent to the back-end)
550 //--------------------------------------------------------------------------
551
552 @Override
553 public synchronized List<ITmfStateInterval> queryFullState(long t)
96345c5a
AM
554 throws TimeRangeException, StateSystemDisposedException {
555 if (isDisposed) {
556 throw new StateSystemDisposedException();
557 }
558
e62a23a9 559 final int nbAttr = getNbAttributes();
df2597e0 560 List<@Nullable ITmfStateInterval> stateInfo = new ArrayList<>(nbAttr);
8d1346f0
AM
561
562 /* Bring the size of the array to the current number of attributes */
e62a23a9 563 for (int i = 0; i < nbAttr; i++) {
8d1346f0
AM
564 stateInfo.add(null);
565 }
566
8d1346f0
AM
567 /*
568 * If we are currently building the history, also query the "ongoing"
569 * states for stuff that might not yet be written to the history.
570 */
571 if (transState.isActive()) {
572 transState.doQuery(stateInfo, t);
573 }
574
e62a23a9
AM
575 /* Query the storage backend */
576 backend.doQuery(stateInfo, t);
577
8d1346f0
AM
578 /*
579 * We should have previously inserted an interval for every attribute.
8d1346f0 580 */
e62a23a9
AM
581 for (ITmfStateInterval interval : stateInfo) {
582 if (interval == null) {
583 throw new IllegalStateException("Incoherent interval storage"); //$NON-NLS-1$
8d1346f0
AM
584 }
585 }
586 return stateInfo;
50678114
AM
587 }
588
8d1346f0
AM
589 @Override
590 public ITmfStateInterval querySingleState(long t, int attributeQuark)
96345c5a
AM
591 throws AttributeNotFoundException, TimeRangeException,
592 StateSystemDisposedException {
593 if (isDisposed) {
594 throw new StateSystemDisposedException();
595 }
8d1346f0 596
09e6fd9b
AM
597 ITmfStateInterval ret = transState.getIntervalAt(t, attributeQuark);
598 if (ret == null) {
599 /*
600 * The transient state did not have the information, let's look into
601 * the backend next.
602 */
8d1346f0
AM
603 ret = backend.doSingularQuery(t, attributeQuark);
604 }
605
8d1346f0 606 if (ret == null) {
e62a23a9
AM
607 /*
608 * If we did our job correctly, there should be intervals for every
609 * possible attribute, over all the valid time range.
610 */
611 throw new IllegalStateException("Incoherent interval storage"); //$NON-NLS-1$
8d1346f0
AM
612 }
613 return ret;
614 }
615
8d1346f0
AM
616 //--------------------------------------------------------------------------
617 // Debug methods
618 //--------------------------------------------------------------------------
619
620 static void logMissingInterval(int attribute, long timestamp) {
bcec0116 621 Activator.getDefault().logInfo("No data found in history for attribute " + //$NON-NLS-1$
8d1346f0
AM
622 attribute + " at time " + timestamp + //$NON-NLS-1$
623 ", returning dummy interval"); //$NON-NLS-1$
a52fde77
AM
624 }
625
626 /**
627 * Print out the contents of the inner structures.
5df842b3 628 *
a52fde77
AM
629 * @param writer
630 * The PrintWriter in which to print the output
631 */
feea3b3c 632 public void debugPrint(@NonNull PrintWriter writer) {
339d27b4 633 getAttributeTree().debugPrint(writer);
a52fde77 634 transState.debugPrint(writer);
8d1346f0 635 backend.debugPrint(writer);
a52fde77
AM
636 }
637
8d1346f0 638}
This page took 0.143007 seconds and 5 git commands to generate.