tmf: Move plugins to their own sub-directory
[deliverable/tracecompass.git] / tmf / org.eclipse.tracecompass.tmf.core / src / org / eclipse / tracecompass / internal / tmf / core / statesystem / backends / partial / PartialStateSystem.java
CommitLineData
1b9d3765 1/*******************************************************************************
60ae41e1 2 * Copyright (c) 2013, 2014 Ericsson
1b9d3765
AM
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
7 *
8 * Contributors:
9 * Alexandre Montplaisir - Initial API and implementation
10 *******************************************************************************/
11
2bdf0193 12package org.eclipse.tracecompass.internal.tmf.core.statesystem.backends.partial;
1b9d3765
AM
13
14import java.util.List;
15import java.util.concurrent.CountDownLatch;
16import java.util.concurrent.locks.Lock;
17import java.util.concurrent.locks.ReentrantLock;
18
e894a508
AM
19import org.eclipse.tracecompass.internal.statesystem.core.AttributeTree;
20import org.eclipse.tracecompass.internal.statesystem.core.StateSystem;
21import org.eclipse.tracecompass.statesystem.core.ITmfStateSystem;
0306a843 22import org.eclipse.tracecompass.statesystem.core.backend.StateHistoryBackendFactory;
e894a508
AM
23import org.eclipse.tracecompass.statesystem.core.exceptions.AttributeNotFoundException;
24import org.eclipse.tracecompass.statesystem.core.interval.ITmfStateInterval;
1b9d3765
AM
25
26/**
27 * State system interface-like extension to use with partial state histories.
28 *
29 * It mainly exposes the {@link #replaceOngoingState} method, which allows
30 * seeking the state system to a different point by updating its "ongoing" state
31 * values.
32 *
33 * @author Alexandre Montplaisir
34 */
bcec0116 35@SuppressWarnings("restriction") /* We're using AttributeTree directly */
1b9d3765
AM
36public class PartialStateSystem extends StateSystem {
37
cb42195c 38 private static final String ERR_MSG = "Partial state system should not modify the attribute tree!"; //$NON-NLS-1$
1b9d3765
AM
39
40 private final CountDownLatch ssAssignedLatch = new CountDownLatch(1);
41 private final Lock queryLock = new ReentrantLock();
42
43 /**
44 * Reference to the real upstream state system. This is used so we can read
45 * its attribute tree.
46 */
47 private StateSystem realStateSystem = null;
48
49 /**
50 * Constructor
51 */
52 public PartialStateSystem() {
53 /*
54 * We use a Null back end here : we only use this state system for its
55 * "ongoing" values, so no need to save the changes that are inserted.
56 */
0306a843 57 super(StateHistoryBackendFactory.createNullBackend("partial")); //$NON-NLS-1$
1b9d3765
AM
58 }
59
60 /**
61 * Assign the upstream state system to this one.
62 *
63 * @param ss
64 * The real state system
65 */
66 public void assignUpstream(StateSystem ss) {
67 realStateSystem = ss;
68 ssAssignedLatch.countDown();
69 }
70
71 ITmfStateSystem getUpstreamSS() {
72 return realStateSystem;
73 }
74
3a755f44
AM
75 // ------------------------------------------------------------------------
76 // Publicized non-API methods
77 // ------------------------------------------------------------------------
78
1b9d3765
AM
79 @Override
80 public void replaceOngoingState(List<ITmfStateInterval> ongoingIntervals) {
1b9d3765
AM
81 super.replaceOngoingState(ongoingIntervals);
82 }
83
3a755f44
AM
84 @Override
85 public synchronized void dispose() {
86 super.dispose();
87 }
88
1b9d3765
AM
89 // ------------------------------------------------------------------------
90 // Methods regarding the query lock
91 // ------------------------------------------------------------------------
92
93 /**
94 * Take this inner state system's lock before doing a query.
95 *
96 * When doing queries, you should take the lock, then run
97 * {@link #replaceOngoingState}, then send events to its state provider
98 * input to cause state changes, and then call {@link #queryOngoingState} to
99 * get the states at the new "current time".
100 *
101 * Only after all that it would be safe to release the lock.
102 */
103 public void takeQueryLock() {
104 try {
105 queryLock.lockInterruptibly();
106 } catch (InterruptedException e) {
107 e.printStackTrace();
108 }
109 }
110
111 /**
112 * Release the query lock, when you are done with your query.
113 */
114 public void releaseQueryLock() {
115 queryLock.unlock();
116 }
117
118 @Override
119 public AttributeTree getAttributeTree() {
120 waitUntilReady();
121 return realStateSystem.getAttributeTree();
122 }
123
124 /*
125 * Override these methods to make sure we don't try to overwrite the
126 * "real" upstream attribute tree.
127 */
128
129 @Override
bcec0116 130 public void addEmptyAttribute() {
cb42195c 131 throw new RuntimeException(ERR_MSG);
1b9d3765
AM
132 }
133
134 @Override
135 public int getQuarkAbsoluteAndAdd(String... attribute) {
136 waitUntilReady();
137 try {
138 return realStateSystem.getQuarkAbsolute(attribute);
139 } catch (AttributeNotFoundException e) {
cb42195c 140 throw new RuntimeException(ERR_MSG);
1b9d3765
AM
141 }
142 }
143
144 @Override
145 public int getQuarkRelativeAndAdd(int startingNodeQuark, String... subPath) {
146 waitUntilReady();
147 try {
148 return realStateSystem.getQuarkRelative(startingNodeQuark, subPath);
149 } catch (AttributeNotFoundException e) {
cb42195c 150 throw new RuntimeException(ERR_MSG);
1b9d3765
AM
151 }
152 }
153
154 private void waitUntilReady() {
155 try {
156 ssAssignedLatch.await();
157 } catch (InterruptedException e) {
158 e.printStackTrace();
159 }
160 }
161
162}
This page took 0.143203 seconds and 5 git commands to generate.