1 /*******************************************************************************
2 * Copyright (c) 2013, 2014 Ericsson
3 * All rights reserved. This program and the accompanying materials are
4 * made available under the terms of the Eclipse Public License v1.0 which
5 * accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
9 * Alexandre Montplaisir - Initial API and implementation
10 *******************************************************************************/
12 package org
.eclipse
.linuxtools
.internal
.tmf
.core
.statesystem
.backends
.partial
;
14 import java
.util
.List
;
15 import java
.util
.concurrent
.CountDownLatch
;
16 import java
.util
.concurrent
.locks
.Lock
;
17 import java
.util
.concurrent
.locks
.ReentrantLock
;
19 import org
.eclipse
.linuxtools
.internal
.tmf
.core
.statesystem
.AttributeTree
;
20 import org
.eclipse
.linuxtools
.internal
.tmf
.core
.statesystem
.StateSystem
;
21 import org
.eclipse
.linuxtools
.internal
.tmf
.core
.statesystem
.backends
.NullBackend
;
22 import org
.eclipse
.linuxtools
.tmf
.core
.exceptions
.AttributeNotFoundException
;
23 import org
.eclipse
.linuxtools
.tmf
.core
.interval
.ITmfStateInterval
;
24 import org
.eclipse
.linuxtools
.tmf
.core
.statesystem
.ITmfStateSystem
;
27 * State system interface-like extension to use with partial state histories.
29 * It mainly exposes the {@link #replaceOngoingState} method, which allows
30 * seeking the state system to a different point by updating its "ongoing" state
33 * @author Alexandre Montplaisir
35 public class PartialStateSystem
extends StateSystem
{
37 private static final String ERR_MSG
= "Partial state system should not modify the attribute tree!"; //$NON-NLS-1$
39 private final CountDownLatch ssAssignedLatch
= new CountDownLatch(1);
40 private final Lock queryLock
= new ReentrantLock();
43 * Reference to the real upstream state system. This is used so we can read
46 private StateSystem realStateSystem
= null;
51 public PartialStateSystem() {
53 * We use a Null back end here : we only use this state system for its
54 * "ongoing" values, so no need to save the changes that are inserted.
56 super("partial", new NullBackend()); //$NON-NLS-1$
60 * Assign the upstream state system to this one.
63 * The real state system
65 public void assignUpstream(StateSystem ss
) {
67 ssAssignedLatch
.countDown();
70 ITmfStateSystem
getUpstreamSS() {
71 return realStateSystem
;
75 public void replaceOngoingState(List
<ITmfStateInterval
> ongoingIntervals
) {
76 /* We simply publicize StateSystem's method */
77 super.replaceOngoingState(ongoingIntervals
);
80 // ------------------------------------------------------------------------
81 // Methods regarding the query lock
82 // ------------------------------------------------------------------------
85 * Take this inner state system's lock before doing a query.
87 * When doing queries, you should take the lock, then run
88 * {@link #replaceOngoingState}, then send events to its state provider
89 * input to cause state changes, and then call {@link #queryOngoingState} to
90 * get the states at the new "current time".
92 * Only after all that it would be safe to release the lock.
94 public void takeQueryLock() {
96 queryLock
.lockInterruptibly();
97 } catch (InterruptedException e
) {
103 * Release the query lock, when you are done with your query.
105 public void releaseQueryLock() {
110 public AttributeTree
getAttributeTree() {
112 return realStateSystem
.getAttributeTree();
116 * Override these methods to make sure we don't try to overwrite the
117 * "real" upstream attribute tree.
121 protected void addEmptyAttribute() {
122 throw new RuntimeException(ERR_MSG
);
126 public int getQuarkAbsoluteAndAdd(String
... attribute
) {
129 return realStateSystem
.getQuarkAbsolute(attribute
);
130 } catch (AttributeNotFoundException e
) {
131 throw new RuntimeException(ERR_MSG
);
136 public int getQuarkRelativeAndAdd(int startingNodeQuark
, String
... subPath
) {
139 return realStateSystem
.getQuarkRelative(startingNodeQuark
, subPath
);
140 } catch (AttributeNotFoundException e
) {
141 throw new RuntimeException(ERR_MSG
);
145 private void waitUntilReady() {
147 ssAssignedLatch
.await();
148 } catch (InterruptedException e
) {