tmf: Add a method to query an ongoing state's start time
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.core / src / org / eclipse / linuxtools / internal / tmf / core / statesystem / StateSystem.java
CommitLineData
a52fde77 1/*******************************************************************************
61759503 2 * Copyright (c) 2012, 2013 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 *
a52fde77
AM
11 *******************************************************************************/
12
18ab1d18 13package org.eclipse.linuxtools.internal.tmf.core.statesystem;
a52fde77 14
8d1346f0
AM
15import java.io.File;
16import java.io.IOException;
a52fde77 17import java.io.PrintWriter;
8d1346f0 18import java.util.ArrayList;
f94a0bac 19import java.util.LinkedList;
a52fde77 20import java.util.List;
16576a7e 21import java.util.concurrent.CountDownLatch;
a52fde77 22
8d1346f0
AM
23import org.eclipse.core.runtime.IProgressMonitor;
24import org.eclipse.core.runtime.NullProgressMonitor;
5500a7f0 25import org.eclipse.linuxtools.internal.tmf.core.Activator;
f9a76cac 26import org.eclipse.linuxtools.internal.tmf.core.statesystem.backends.IStateHistoryBackend;
6d08acca 27import org.eclipse.linuxtools.tmf.core.exceptions.AttributeNotFoundException;
96345c5a 28import org.eclipse.linuxtools.tmf.core.exceptions.StateSystemDisposedException;
6d08acca
AM
29import org.eclipse.linuxtools.tmf.core.exceptions.StateValueTypeException;
30import org.eclipse.linuxtools.tmf.core.exceptions.TimeRangeException;
8d1346f0
AM
31import org.eclipse.linuxtools.tmf.core.interval.ITmfStateInterval;
32import org.eclipse.linuxtools.tmf.core.interval.TmfStateInterval;
f1f86dfb 33import org.eclipse.linuxtools.tmf.core.statesystem.ITmfStateSystemBuilder;
a52fde77 34import org.eclipse.linuxtools.tmf.core.statevalue.ITmfStateValue;
a52fde77
AM
35import org.eclipse.linuxtools.tmf.core.statevalue.TmfStateValue;
36
37/**
8d1346f0
AM
38 * This is the core class of the Generic State System. It contains all the
39 * methods to build and query a state history. It's exposed externally through
40 * the IStateSystemQuerier and IStateSystemBuilder interfaces, depending if the
41 * user needs read-only access or read-write access.
5df842b3 42 *
8d1346f0
AM
43 * When building, DON'T FORGET to call .closeHistory() when you are done
44 * inserting intervals, or the storage backend will have no way of knowing it
45 * can close and write itself to disk, and its thread will keep running.
5df842b3 46 *
a52fde77 47 * @author alexmont
5df842b3 48 *
a52fde77 49 */
f1f86dfb 50public class StateSystem implements ITmfStateSystemBuilder {
a52fde77
AM
51
52 /* References to the inner structures */
8d1346f0
AM
53 private final AttributeTree attributeTree;
54 private final TransientState transState;
55 private final IStateHistoryBackend backend;
a52fde77 56
16576a7e
AM
57 /* Latch tracking if the state history is done building or not */
58 private final CountDownLatch finishedLatch = new CountDownLatch(1);
59
1a4205d9 60 private boolean buildCancelled = false;
96345c5a 61 private boolean isDisposed = false;
1a4205d9 62
f9a76cac
AM
63 /**
64 * New-file constructor. For when you build a state system with a new file,
65 * or if the back-end does not require a file on disk.
66 *
67 * @param backend
68 * Back-end plugin to use
69 */
70 public StateSystem(IStateHistoryBackend backend) {
71 this.backend = backend;
72 this.transState = new TransientState(backend);
73 this.attributeTree = new AttributeTree(this);
74 }
75
a52fde77 76 /**
8d1346f0
AM
77 * General constructor
78 *
79 * @param backend
f9a76cac 80 * The "state history storage" back-end to use.
8d1346f0
AM
81 * @param newFile
82 * Put true if this is a new history started from scratch. It is
83 * used to tell the state system where to get its attribute tree.
84 * @throws IOException
85 * If there was a problem creating the new history file
a52fde77 86 */
8d1346f0
AM
87 public StateSystem(IStateHistoryBackend backend, boolean newFile)
88 throws IOException {
89 this.backend = backend;
90 this.transState = new TransientState(backend);
a52fde77 91
8d1346f0
AM
92 if (newFile) {
93 attributeTree = new AttributeTree(this);
94 } else {
95 /* We're opening an existing file */
96 this.attributeTree = new AttributeTree(this, backend.supplyAttributeTreeReader());
97 transState.setInactive();
16576a7e
AM
98 finishedLatch.countDown(); /* The history is already built */
99 }
100 }
101
102 @Override
1a4205d9 103 public boolean waitUntilBuilt() {
16576a7e
AM
104 try {
105 finishedLatch.await();
106 } catch (InterruptedException e) {
107 e.printStackTrace();
8d1346f0 108 }
1a4205d9
AM
109 return !buildCancelled;
110 }
111
112 @Override
113 public synchronized void dispose() {
96345c5a 114 isDisposed = true;
1a4205d9
AM
115 if (transState.isActive()) {
116 transState.setInactive();
117 buildCancelled = true;
118 }
119 backend.dispose();
a52fde77
AM
120 }
121
8d1346f0
AM
122 //--------------------------------------------------------------------------
123 // General methods related to the attribute tree
124 //--------------------------------------------------------------------------
125
126 /**
127 * Method used by the attribute tree when creating new attributes, to keep
128 * the attribute count in the transient state in sync.
129 */
130 void addEmptyAttribute() {
131 transState.addEmptyEntry();
132 }
133
134 @Override
4623f57f
AM
135 public int getNbAttributes() {
136 return attributeTree.getNbAttributes();
137 }
138
f5295294
AM
139 @Override
140 public boolean isLastAttribute(int quark) {
141 return (quark == getNbAttributes() - 1) ? true : false;
142 }
143
8d1346f0
AM
144 @Override
145 public String getAttributeName(int attributeQuark) {
146 return attributeTree.getAttributeName(attributeQuark);
147 }
148
149 @Override
150 public String getFullAttributePath(int attributeQuark) {
151 return attributeTree.getFullAttributeName(attributeQuark);
152 }
153
154 //--------------------------------------------------------------------------
155 // Methods related to the storage backend
156 //--------------------------------------------------------------------------
a52fde77 157
8d1346f0
AM
158 @Override
159 public long getStartTime() {
160 return backend.getStartTime();
161 }
162
163 @Override
164 public long getCurrentEndTime() {
165 return backend.getEndTime();
166 }
167
168 @Override
169 public void closeHistory(long endTime) throws TimeRangeException {
170 File attributeTreeFile;
171 long attributeTreeFilePos;
172 long realEndTime = endTime;
173
174 if (realEndTime < backend.getEndTime()) {
175 /*
176 * This can happen (empty nodes pushing the border further, etc.)
177 * but shouldn't be too big of a deal.
178 */
179 realEndTime = backend.getEndTime();
180 }
181 transState.closeTransientState(realEndTime);
182 backend.finishedBuilding(realEndTime);
183
184 attributeTreeFile = backend.supplyAttributeTreeWriterFile();
185 attributeTreeFilePos = backend.supplyAttributeTreeWriterFilePosition();
186 if (attributeTreeFile != null) {
187 /*
188 * If null was returned, we simply won't save the attribute tree,
189 * too bad!
190 */
191 attributeTree.writeSelf(attributeTreeFile, attributeTreeFilePos);
192 }
16576a7e 193 finishedLatch.countDown(); /* Mark the history as finished building */
8d1346f0
AM
194 }
195
196 //--------------------------------------------------------------------------
197 // Quark-retrieving methods
198 //--------------------------------------------------------------------------
199
200 @Override
a52fde77
AM
201 public int getQuarkAbsolute(String... attribute)
202 throws AttributeNotFoundException {
203 return attributeTree.getQuarkDontAdd(-1, attribute);
204 }
205
8d1346f0 206 @Override
a52fde77
AM
207 public int getQuarkAbsoluteAndAdd(String... attribute) {
208 return attributeTree.getQuarkAndAdd(-1, attribute);
209 }
210
8d1346f0 211 @Override
a52fde77
AM
212 public int getQuarkRelative(int startingNodeQuark, String... subPath)
213 throws AttributeNotFoundException {
214 return attributeTree.getQuarkDontAdd(startingNodeQuark, subPath);
215 }
216
8d1346f0 217 @Override
a52fde77
AM
218 public int getQuarkRelativeAndAdd(int startingNodeQuark, String... subPath) {
219 return attributeTree.getQuarkAndAdd(startingNodeQuark, subPath);
220 }
221
8d1346f0 222 @Override
c66426fd 223 public List<Integer> getSubAttributes(int quark, boolean recursive)
0a9de3d2 224 throws AttributeNotFoundException {
c66426fd 225 return attributeTree.getSubAttributes(quark, recursive);
0a9de3d2
AM
226 }
227
8d1346f0 228 @Override
f94a0bac
AM
229 public List<Integer> getQuarks(String... pattern) {
230 List<Integer> quarks = new LinkedList<Integer>();
231 List<String> prefix = new LinkedList<String>();
232 List<String> suffix = new LinkedList<String>();
233 boolean split = false;
234 String[] prefixStr;
235 String[] suffixStr;
236 List<Integer> directChildren;
237 int startingAttribute;
238
239 /* Fill the "prefix" and "suffix" parts of the pattern around the '*' */
240 for (String entry : pattern) {
241 if (entry.equals("*")) { //$NON-NLS-1$
242 if (split) {
243 /*
244 * Split was already true? This means there was more than
245 * one wildcard. This is not supported, return an empty
246 * list.
247 */
248 return quarks;
249 }
250 split = true;
251 continue;
252 }
253
254 if (split) {
255 suffix.add(entry);
256 } else {
257 prefix.add(entry);
258 }
259 }
260 prefixStr = prefix.toArray(new String[prefix.size()]);
261 suffixStr = suffix.toArray(new String[suffix.size()]);
262
263 /*
264 * If there was no wildcard, we'll only return the one matching
265 * attribute, if there is one.
266 */
267 if (split == false) {
268 int quark;
269 try {
270 quark = getQuarkAbsolute(prefixStr);
271 } catch (AttributeNotFoundException e) {
272 /* It's fine, we'll just return the empty List */
273 return quarks;
274 }
275 quarks.add(quark);
276 return quarks;
277 }
278
279 try {
280 if (prefix.size() == 0) {
281 /*
282 * If 'prefix' is empty, this means the wildcard was the first
283 * element. Look for the root node's sub-attributes.
284 */
285 startingAttribute = -1;
286 } else {
287 startingAttribute = getQuarkAbsolute(prefixStr);
288 }
289 directChildren = attributeTree.getSubAttributes(startingAttribute,
290 false);
291 } catch (AttributeNotFoundException e) {
292 /* That attribute path did not exist, return the empty array */
293 return quarks;
294 }
295
296 /*
297 * Iterate of all the sub-attributes, and only keep those who match the
298 * 'suffix' part of the initial pattern.
299 */
300 for (int childQuark : directChildren) {
301 int matchingQuark;
302 try {
303 matchingQuark = getQuarkRelative(childQuark, suffixStr);
304 } catch (AttributeNotFoundException e) {
305 continue;
306 }
307 quarks.add(matchingQuark);
308 }
309
310 return quarks;
311 }
312
8d1346f0
AM
313 //--------------------------------------------------------------------------
314 // Methods related to insertions in the history
315 //--------------------------------------------------------------------------
a52fde77 316
8d1346f0 317 @Override
a52fde77 318 public void modifyAttribute(long t, ITmfStateValue value, int attributeQuark)
7e0b2b56
AM
319 throws TimeRangeException, AttributeNotFoundException,
320 StateValueTypeException {
a52fde77
AM
321 transState.processStateChange(t, value, attributeQuark);
322 }
323
8d1346f0 324 @Override
a52fde77
AM
325 public void incrementAttribute(long t, int attributeQuark)
326 throws StateValueTypeException, TimeRangeException,
327 AttributeNotFoundException {
328 int prevValue = queryOngoingState(attributeQuark).unboxInt();
280bbdbb
AM
329 if (prevValue == -1) {
330 /* if the attribute was previously null, start counting at 0 */
331 prevValue = 0;
332 }
a52fde77
AM
333 modifyAttribute(t, TmfStateValue.newValueInt(prevValue + 1),
334 attributeQuark);
335 }
336
8d1346f0 337 @Override
a52fde77
AM
338 public void pushAttribute(long t, ITmfStateValue value, int attributeQuark)
339 throws TimeRangeException, AttributeNotFoundException,
340 StateValueTypeException {
a52fde77
AM
341 Integer stackDepth = 0;
342 int subAttributeQuark;
343 ITmfStateValue previousSV = transState.getOngoingStateValue(attributeQuark);
344
345 if (previousSV.isNull()) {
346 /*
347 * If the StateValue was null, this means this is the first time we
348 * use this attribute. Leave stackDepth at 0.
349 */
350 } else if (previousSV.getType() == 0) {
351 /* Previous value was an integer, all is good, use it */
352 stackDepth = previousSV.unboxInt();
a52fde77
AM
353 } else {
354 /* Previous state of this attribute was another type? Not good! */
90a25ebe
AM
355 throw new StateValueTypeException();
356 }
357
358 if (stackDepth >= 10) {
359 /*
360 * Limit stackDepth to 10, to avoid having Attribute Trees grow out
361 * of control due to buggy insertions
362 */
363 String message = "Stack limit reached, not pushing"; //$NON-NLS-1$
364 throw new AttributeNotFoundException(message);
a52fde77
AM
365 }
366
367 stackDepth++;
5896eb76 368 subAttributeQuark = getQuarkRelativeAndAdd(attributeQuark, stackDepth.toString());
a52fde77 369
5896eb76 370 modifyAttribute(t, TmfStateValue.newValueInt(stackDepth), attributeQuark);
90a25ebe 371 modifyAttribute(t, value, subAttributeQuark);
a52fde77
AM
372 }
373
8d1346f0 374 @Override
5896eb76 375 public ITmfStateValue popAttribute(long t, int attributeQuark)
a52fde77
AM
376 throws AttributeNotFoundException, TimeRangeException,
377 StateValueTypeException {
e2eac108 378 /* These are the state values of the stack-attribute itself */
5896eb76 379 ITmfStateValue previousSV = queryOngoingState(attributeQuark);
a52fde77
AM
380
381 if (previousSV.isNull()) {
e2eac108
AM
382 /*
383 * Trying to pop an empty stack. This often happens at the start of
384 * traces, for example when we see a syscall_exit, without having
385 * the corresponding syscall_entry in the trace. Just ignore
386 * silently.
387 */
5896eb76 388 return null;
90a25ebe 389 }
e2eac108 390 if (previousSV.getType() != ITmfStateValue.TYPE_INTEGER) {
a52fde77 391 /*
90a25ebe
AM
392 * The existing value was a string, this doesn't look like a valid
393 * stack attribute.
a52fde77 394 */
90a25ebe 395 throw new StateValueTypeException();
a52fde77
AM
396 }
397
5896eb76 398 Integer stackDepth = previousSV.unboxInt();
90a25ebe 399
e2eac108 400 if (stackDepth <= 0) {
a52fde77 401 /* This on the other hand should not happen... */
e2eac108
AM
402 /* the case where == -1 was handled previously by .isNull() */
403 String message = "A top-level stack attribute cannot " + //$NON-NLS-1$
404 "have a value of 0 or less (except -1/null)."; //$NON-NLS-1$
90a25ebe 405 throw new StateValueTypeException(message);
a52fde77
AM
406 }
407
e2eac108 408 /* The attribute should already exist at this point */
5896eb76
AM
409 int subAttributeQuark = getQuarkRelative(attributeQuark, stackDepth.toString());
410 ITmfStateValue poppedValue = queryOngoingState(subAttributeQuark);
a52fde77 411
e2eac108
AM
412 /* Update the state value of the stack-attribute */
413 ITmfStateValue nextSV;
414 if (--stackDepth == 0 ) {
415 /* Jump over "0" and store -1 (a null state value) */
416 nextSV = TmfStateValue.nullValue();
417 } else {
418 nextSV = TmfStateValue.newValueInt(stackDepth);
419 }
420 modifyAttribute(t, nextSV, attributeQuark);
421
422 /* Delete the sub-attribute that contained the user's state value */
a52fde77 423 removeAttribute(t, subAttributeQuark);
e2eac108 424
5896eb76 425 return poppedValue;
a52fde77
AM
426 }
427
8d1346f0 428 @Override
a52fde77
AM
429 public void removeAttribute(long t, int attributeQuark)
430 throws TimeRangeException, AttributeNotFoundException {
431 assert (attributeQuark >= 0);
c66426fd
AM
432 List<Integer> childAttributes;
433
434 /*
435 * "Nullify our children first, recursively. We pass 'false' because we
436 * handle the recursion ourselves.
437 */
438 childAttributes = attributeTree.getSubAttributes(attributeQuark, false);
a52fde77
AM
439 for (Integer childNodeQuark : childAttributes) {
440 assert (attributeQuark != childNodeQuark);
441 removeAttribute(t, childNodeQuark);
442 }
443 /* Nullify ourselves */
7e0b2b56
AM
444 try {
445 transState.processStateChange(t, TmfStateValue.nullValue(),
446 attributeQuark);
447 } catch (StateValueTypeException e) {
50678114
AM
448 /*
449 * Will not happen since we're inserting null values only, but poor
450 * compiler has no way of knowing this...
7e0b2b56
AM
451 */
452 e.printStackTrace();
453 }
a52fde77
AM
454 }
455
8d1346f0
AM
456 //--------------------------------------------------------------------------
457 // "Current" query/update methods
458 //--------------------------------------------------------------------------
a52fde77 459
8d1346f0 460 @Override
a52fde77
AM
461 public ITmfStateValue queryOngoingState(int attributeQuark)
462 throws AttributeNotFoundException {
463 return transState.getOngoingStateValue(attributeQuark);
464 }
465
602c0697
AM
466 @Override
467 public long getOngoingStartTime(int attribute)
468 throws AttributeNotFoundException {
469 return transState.getOngoingStartTime(attribute);
470 }
471
8d1346f0 472 @Override
a52fde77
AM
473 public void updateOngoingState(ITmfStateValue newValue, int attributeQuark)
474 throws AttributeNotFoundException {
475 transState.changeOngoingStateValue(attributeQuark, newValue);
476 }
477
8d1346f0
AM
478 //--------------------------------------------------------------------------
479 // Regular query methods (sent to the back-end)
480 //--------------------------------------------------------------------------
481
482 @Override
483 public synchronized List<ITmfStateInterval> queryFullState(long t)
96345c5a
AM
484 throws TimeRangeException, StateSystemDisposedException {
485 if (isDisposed) {
486 throw new StateSystemDisposedException();
487 }
488
8d1346f0
AM
489 List<ITmfStateInterval> stateInfo = new ArrayList<ITmfStateInterval>(
490 attributeTree.getNbAttributes());
491
492 /* Bring the size of the array to the current number of attributes */
493 for (int i = 0; i < attributeTree.getNbAttributes(); i++) {
494 stateInfo.add(null);
495 }
496
497 /* Query the storage backend */
498 backend.doQuery(stateInfo, t);
499
500 /*
501 * If we are currently building the history, also query the "ongoing"
502 * states for stuff that might not yet be written to the history.
503 */
504 if (transState.isActive()) {
505 transState.doQuery(stateInfo, t);
506 }
507
508 /*
509 * We should have previously inserted an interval for every attribute.
510 * If we do happen do see a 'null' object here, just replace it with a a
511 * dummy internal with a null value, to avoid NPE's further up.
512 */
513 for (int i = 0; i < stateInfo.size(); i++) {
514 if (stateInfo.get(i) == null) {
515 //logMissingInterval(i, t);
516 stateInfo.set(i, new TmfStateInterval(t, t, i, TmfStateValue.nullValue()));
517 }
518 }
519 return stateInfo;
50678114
AM
520 }
521
8d1346f0
AM
522 @Override
523 public ITmfStateInterval querySingleState(long t, int attributeQuark)
96345c5a
AM
524 throws AttributeNotFoundException, TimeRangeException,
525 StateSystemDisposedException {
526 if (isDisposed) {
527 throw new StateSystemDisposedException();
528 }
8d1346f0 529
96345c5a 530 ITmfStateInterval ret;
8d1346f0
AM
531 if (transState.hasInfoAboutStateOf(t, attributeQuark)) {
532 ret = transState.getOngoingInterval(attributeQuark);
533 } else {
534 ret = backend.doSingularQuery(t, attributeQuark);
535 }
536
537 /*
538 * Return a fake interval if we could not find anything in the history.
539 * We do NOT want to return 'null' here.
540 */
541 if (ret == null) {
542 //logMissingInterval(attributeQuark, t);
543 return new TmfStateInterval(t, this.getCurrentEndTime(),
544 attributeQuark, TmfStateValue.nullValue());
545 }
546 return ret;
547 }
548
4bff6e6e
AM
549 @Override
550 public ITmfStateInterval querySingleStackTop(long t, int stackAttributeQuark)
551 throws StateValueTypeException, AttributeNotFoundException,
96345c5a 552 TimeRangeException, StateSystemDisposedException {
4bff6e6e
AM
553 Integer curStackDepth = querySingleState(t, stackAttributeQuark).getStateValue().unboxInt();
554
555 if (curStackDepth == -1) {
556 /* There is nothing stored in this stack at this moment */
557 return null;
558 } else if (curStackDepth < -1 || curStackDepth == 0) {
559 /*
560 * This attribute is an integer attribute, but it doesn't seem like
561 * it's used as a stack-attribute...
562 */
563 throw new StateValueTypeException();
564 }
565
566 int subAttribQuark = getQuarkRelative(stackAttributeQuark, curStackDepth.toString());
567 ITmfStateInterval ret = querySingleState(t, subAttribQuark);
568 return ret;
569 }
570
8d1346f0
AM
571 @Override
572 public List<ITmfStateInterval> queryHistoryRange(int attributeQuark,
573 long t1, long t2) throws TimeRangeException,
96345c5a
AM
574 AttributeNotFoundException, StateSystemDisposedException {
575 if (isDisposed) {
576 throw new StateSystemDisposedException();
577 }
578
8d1346f0
AM
579 List<ITmfStateInterval> intervals;
580 ITmfStateInterval currentInterval;
581 long ts, tEnd;
582
583 /* Make sure the time range makes sense */
584 if (t2 <= t1) {
585 throw new TimeRangeException();
586 }
587
588 /* Set the actual, valid end time of the range query */
589 if (t2 > this.getCurrentEndTime()) {
590 tEnd = this.getCurrentEndTime();
591 } else {
592 tEnd = t2;
593 }
594
595 /* Get the initial state at time T1 */
596 intervals = new ArrayList<ITmfStateInterval>();
597 currentInterval = querySingleState(t1, attributeQuark);
598 intervals.add(currentInterval);
599
600 /* Get the following state changes */
601 ts = currentInterval.getEndTime();
602 while (ts != -1 && ts < tEnd) {
603 ts++; /* To "jump over" to the next state in the history */
604 currentInterval = querySingleState(ts, attributeQuark);
605 intervals.add(currentInterval);
606 ts = currentInterval.getEndTime();
607 }
608 return intervals;
609 }
610
611 @Override
612 public List<ITmfStateInterval> queryHistoryRange(int attributeQuark,
b5a8d0cc 613 long t1, long t2, long resolution, IProgressMonitor monitor)
96345c5a
AM
614 throws TimeRangeException, AttributeNotFoundException,
615 StateSystemDisposedException {
616 if (isDisposed) {
617 throw new StateSystemDisposedException();
618 }
619
8d1346f0
AM
620 List<ITmfStateInterval> intervals;
621 ITmfStateInterval currentInterval;
622 long ts, tEnd;
623
41b5c37f
AM
624 IProgressMonitor mon = monitor;
625 if (mon == null) {
626 mon = new NullProgressMonitor();
b5a8d0cc
AM
627 }
628
8d1346f0
AM
629 /* Make sure the time range makes sense */
630 if (t2 < t1 || resolution <= 0) {
631 throw new TimeRangeException();
632 }
633
634 /* Set the actual, valid end time of the range query */
635 if (t2 > this.getCurrentEndTime()) {
636 tEnd = this.getCurrentEndTime();
637 } else {
638 tEnd = t2;
639 }
640
641 /* Get the initial state at time T1 */
642 intervals = new ArrayList<ITmfStateInterval>();
643 currentInterval = querySingleState(t1, attributeQuark);
644 intervals.add(currentInterval);
645
646 /*
647 * Iterate over the "resolution points". We skip unneeded queries in the
648 * case the current interval is longer than the resolution.
649 */
650 for (ts = t1; (currentInterval.getEndTime() != -1) && (ts < tEnd);
651 ts += resolution) {
41b5c37f 652 if (mon.isCanceled()) {
8d1346f0
AM
653 return intervals;
654 }
655 if (ts <= currentInterval.getEndTime()) {
656 continue;
657 }
658 currentInterval = querySingleState(ts, attributeQuark);
659 intervals.add(currentInterval);
660 }
661
662 /* Add the interval at t2, if it wasn't included already. */
663 if (currentInterval.getEndTime() < tEnd) {
664 currentInterval = querySingleState(tEnd, attributeQuark);
665 intervals.add(currentInterval);
666 }
667 return intervals;
668 }
669
670 //--------------------------------------------------------------------------
671 // Debug methods
672 //--------------------------------------------------------------------------
673
674 static void logMissingInterval(int attribute, long timestamp) {
5500a7f0 675 Activator.logInfo("No data found in history for attribute " + //$NON-NLS-1$
8d1346f0
AM
676 attribute + " at time " + timestamp + //$NON-NLS-1$
677 ", returning dummy interval"); //$NON-NLS-1$
a52fde77
AM
678 }
679
680 /**
681 * Print out the contents of the inner structures.
5df842b3 682 *
a52fde77
AM
683 * @param writer
684 * The PrintWriter in which to print the output
685 */
686 public void debugPrint(PrintWriter writer) {
687 attributeTree.debugPrint(writer);
688 transState.debugPrint(writer);
8d1346f0 689 backend.debugPrint(writer);
a52fde77
AM
690 }
691
8d1346f0 692}
This page took 0.066449 seconds and 5 git commands to generate.