X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=org.eclipse.linuxtools.tmf.core%2Fsrc%2Forg%2Feclipse%2Flinuxtools%2Finternal%2Ftmf%2Fcore%2Fstatesystem%2FStateSystem.java;h=cd82f921198913a07891bc704d6c6458d1203808;hb=602c06978f31419b646228e973021e02672fcd11;hp=c4b7029f415a10c6acc1265489df12804a10b841;hpb=f1f86dfb492c7e41eb81a62c651b26e7b4fdb406;p=deliverable%2Ftracecompass.git diff --git a/org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/internal/tmf/core/statesystem/StateSystem.java b/org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/internal/tmf/core/statesystem/StateSystem.java index c4b7029f41..cd82f92119 100644 --- a/org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/internal/tmf/core/statesystem/StateSystem.java +++ b/org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/internal/tmf/core/statesystem/StateSystem.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2012 Ericsson + * Copyright (c) 2012, 2013 Ericsson * Copyright (c) 2010, 2011 École Polytechnique de Montréal * Copyright (c) 2010, 2011 Alexandre Montplaisir * @@ -18,11 +18,14 @@ import java.io.PrintWriter; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; +import java.util.concurrent.CountDownLatch; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.linuxtools.internal.tmf.core.Activator; +import org.eclipse.linuxtools.internal.tmf.core.statesystem.backends.IStateHistoryBackend; import org.eclipse.linuxtools.tmf.core.exceptions.AttributeNotFoundException; +import org.eclipse.linuxtools.tmf.core.exceptions.StateSystemDisposedException; import org.eclipse.linuxtools.tmf.core.exceptions.StateValueTypeException; import org.eclipse.linuxtools.tmf.core.exceptions.TimeRangeException; import org.eclipse.linuxtools.tmf.core.interval.ITmfStateInterval; @@ -51,11 +54,30 @@ public class StateSystem implements ITmfStateSystemBuilder { private final TransientState transState; private final IStateHistoryBackend backend; + /* Latch tracking if the state history is done building or not */ + private final CountDownLatch finishedLatch = new CountDownLatch(1); + + private boolean buildCancelled = false; + private boolean isDisposed = false; + + /** + * New-file constructor. For when you build a state system with a new file, + * or if the back-end does not require a file on disk. + * + * @param backend + * Back-end plugin to use + */ + public StateSystem(IStateHistoryBackend backend) { + this.backend = backend; + this.transState = new TransientState(backend); + this.attributeTree = new AttributeTree(this); + } + /** * General constructor * * @param backend - * The "state history storage" backend to use. + * The "state history storage" back-end to use. * @param newFile * Put true if this is a new history started from scratch. It is * used to tell the state system where to get its attribute tree. @@ -73,9 +95,30 @@ public class StateSystem implements ITmfStateSystemBuilder { /* We're opening an existing file */ this.attributeTree = new AttributeTree(this, backend.supplyAttributeTreeReader()); transState.setInactive(); + finishedLatch.countDown(); /* The history is already built */ } } + @Override + public boolean waitUntilBuilt() { + try { + finishedLatch.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + return !buildCancelled; + } + + @Override + public synchronized void dispose() { + isDisposed = true; + if (transState.isActive()) { + transState.setInactive(); + buildCancelled = true; + } + backend.dispose(); + } + //-------------------------------------------------------------------------- // General methods related to the attribute tree //-------------------------------------------------------------------------- @@ -147,6 +190,7 @@ public class StateSystem implements ITmfStateSystemBuilder { */ attributeTree.writeSelf(attributeTreeFile, attributeTreeFilePos); } + finishedLatch.countDown(); /* Mark the history as finished building */ } //-------------------------------------------------------------------------- @@ -419,21 +463,29 @@ public class StateSystem implements ITmfStateSystemBuilder { return transState.getOngoingStateValue(attributeQuark); } + @Override + public long getOngoingStartTime(int attribute) + throws AttributeNotFoundException { + return transState.getOngoingStartTime(attribute); + } + @Override public void updateOngoingState(ITmfStateValue newValue, int attributeQuark) throws AttributeNotFoundException { transState.changeOngoingStateValue(attributeQuark, newValue); } - - //-------------------------------------------------------------------------- // Regular query methods (sent to the back-end) //-------------------------------------------------------------------------- @Override public synchronized List queryFullState(long t) - throws TimeRangeException { + throws TimeRangeException, StateSystemDisposedException { + if (isDisposed) { + throw new StateSystemDisposedException(); + } + List stateInfo = new ArrayList( attributeTree.getNbAttributes()); @@ -469,9 +521,13 @@ public class StateSystem implements ITmfStateSystemBuilder { @Override public ITmfStateInterval querySingleState(long t, int attributeQuark) - throws AttributeNotFoundException, TimeRangeException { - ITmfStateInterval ret; + throws AttributeNotFoundException, TimeRangeException, + StateSystemDisposedException { + if (isDisposed) { + throw new StateSystemDisposedException(); + } + ITmfStateInterval ret; if (transState.hasInfoAboutStateOf(t, attributeQuark)) { ret = transState.getOngoingInterval(attributeQuark); } else { @@ -493,7 +549,7 @@ public class StateSystem implements ITmfStateSystemBuilder { @Override public ITmfStateInterval querySingleStackTop(long t, int stackAttributeQuark) throws StateValueTypeException, AttributeNotFoundException, - TimeRangeException { + TimeRangeException, StateSystemDisposedException { Integer curStackDepth = querySingleState(t, stackAttributeQuark).getStateValue().unboxInt(); if (curStackDepth == -1) { @@ -515,7 +571,11 @@ public class StateSystem implements ITmfStateSystemBuilder { @Override public List queryHistoryRange(int attributeQuark, long t1, long t2) throws TimeRangeException, - AttributeNotFoundException { + AttributeNotFoundException, StateSystemDisposedException { + if (isDisposed) { + throw new StateSystemDisposedException(); + } + List intervals; ITmfStateInterval currentInterval; long ts, tEnd; @@ -551,13 +611,19 @@ public class StateSystem implements ITmfStateSystemBuilder { @Override public List queryHistoryRange(int attributeQuark, long t1, long t2, long resolution, IProgressMonitor monitor) - throws TimeRangeException, AttributeNotFoundException { + throws TimeRangeException, AttributeNotFoundException, + StateSystemDisposedException { + if (isDisposed) { + throw new StateSystemDisposedException(); + } + List intervals; ITmfStateInterval currentInterval; long ts, tEnd; - if (monitor == null) { - monitor = new NullProgressMonitor(); + IProgressMonitor mon = monitor; + if (mon == null) { + mon = new NullProgressMonitor(); } /* Make sure the time range makes sense */ @@ -583,7 +649,7 @@ public class StateSystem implements ITmfStateSystemBuilder { */ for (ts = t1; (currentInterval.getEndTime() != -1) && (ts < tEnd); ts += resolution) { - if (monitor.isCanceled()) { + if (mon.isCanceled()) { return intervals; } if (ts <= currentInterval.getEndTime()) {