From 045df77d0eff60a3b14ec361e6602d13886bcd16 Mon Sep 17 00:00:00 2001 From: Francois Chouinard Date: Tue, 20 Jul 2010 14:42:38 +0000 Subject: [PATCH] 2010-07-20 Francois Chouinard * src/org/eclipse/linuxtools/tmf/component/TmfDataProvider.java: - Use a specific lock object (instead of this) for synchronization - Fix executor exception when request comes in immediately after dispose * src/org/eclipse/linuxtools/tmf/experiment/TmfExperiment.java: - Fix constructor ignoring index page size - Update saved context on parse to avoid unnecessary seeks --- org.eclipse.linuxtools.tmf/ChangeLog | 9 +++++ .../tmf/component/TmfDataProvider.java | 34 ++++++++++++------- .../tmf/experiment/TmfExperiment.java | 7 ++-- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/org.eclipse.linuxtools.tmf/ChangeLog b/org.eclipse.linuxtools.tmf/ChangeLog index c8922a5a56..3671f54943 100644 --- a/org.eclipse.linuxtools.tmf/ChangeLog +++ b/org.eclipse.linuxtools.tmf/ChangeLog @@ -1,3 +1,12 @@ +2010-07-20 Francois Chouinard + + * src/org/eclipse/linuxtools/tmf/component/TmfDataProvider.java: + - Use a specific lock object (instead of this) for synchronization + - Fix executor exception when request comes in immediately after dispose + * src/org/eclipse/linuxtools/tmf/experiment/TmfExperiment.java: + - Fix constructor ignoring index page size + - Update saved context on parse to avoid unnecessary seeks + 2010-07-19 Francois Chouinard * src/org/eclipse/linuxtools/tmf/experiment/TmfExperiment.java: Some modifications to make the experiment more generic. diff --git a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/TmfDataProvider.java b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/TmfDataProvider.java index 5aecc727f6..48423b6439 100644 --- a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/TmfDataProvider.java +++ b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/TmfDataProvider.java @@ -66,6 +66,7 @@ public abstract class TmfDataProvider extends TmfComponent im protected final TmfRequestExecutor fExecutor; private int fSignalDepth = 0; + private final Object fLock = new Object(); // ------------------------------------------------------------------------ // Constructors @@ -125,7 +126,7 @@ public abstract class TmfDataProvider extends TmfComponent im // ------------------------------------------------------------------------ public void sendRequest(final ITmfDataRequest request) { - synchronized(this) { + synchronized(fLock) { if (fSignalDepth > 0) { coalesceDataRequest(request); } else { @@ -140,7 +141,7 @@ public abstract class TmfDataProvider extends TmfComponent im * @param thread */ public void fireRequests() { - synchronized(this) { + synchronized(fLock) { for (TmfDataRequest request : fPendingCoalescedRequests) { dispatchRequest(request); } @@ -155,7 +156,7 @@ public abstract class TmfDataProvider extends TmfComponent im protected Vector> fPendingCoalescedRequests = new Vector>(); protected void newCoalescedDataRequest(ITmfDataRequest request) { - synchronized(this) { + synchronized(fLock) { TmfCoalescedDataRequest coalescedRequest = new TmfCoalescedDataRequest(fType, request.getIndex(), request.getNbRequested(), request.getBlockize(), request.getExecType()); coalescedRequest.addRequest(request); @@ -167,8 +168,8 @@ public abstract class TmfDataProvider extends TmfComponent im } } - protected synchronized void coalesceDataRequest(ITmfDataRequest request) { - synchronized(this) { + protected void coalesceDataRequest(ITmfDataRequest request) { + synchronized(fLock) { for (TmfCoalescedDataRequest req : fPendingCoalescedRequests) { if (req.isCompatible(request)) { req.addRequest(request); @@ -196,6 +197,11 @@ public abstract class TmfDataProvider extends TmfComponent im protected void queueRequest(final ITmfDataRequest request) { + if (fExecutor.isShutdown()) { + request.cancel(); + return; + } + final TmfDataProvider provider = this; // Process the request @@ -357,16 +363,20 @@ public abstract class TmfDataProvider extends TmfComponent im // ------------------------------------------------------------------------ @TmfSignalHandler - public synchronized void startSynch(TmfStartSynchSignal signal) { - fSignalDepth++; + public void startSynch(TmfStartSynchSignal signal) { + synchronized (fLock) { + fSignalDepth++; + } } @TmfSignalHandler - public synchronized void endSynch(TmfEndSynchSignal signal) { - fSignalDepth--; - if (fSignalDepth == 0) { - fireRequests(); - } + public void endSynch(TmfEndSynchSignal signal) { + synchronized (fLock) { + fSignalDepth--; + if (fSignalDepth == 0) { + fireRequests(); + } + } } } diff --git a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/experiment/TmfExperiment.java b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/experiment/TmfExperiment.java index 58aeb4e041..20c95f5c59 100644 --- a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/experiment/TmfExperiment.java +++ b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/experiment/TmfExperiment.java @@ -20,10 +20,10 @@ import org.eclipse.linuxtools.tmf.event.TmfEvent; import org.eclipse.linuxtools.tmf.event.TmfTimeRange; import org.eclipse.linuxtools.tmf.event.TmfTimestamp; import org.eclipse.linuxtools.tmf.request.ITmfDataRequest; -import org.eclipse.linuxtools.tmf.request.ITmfDataRequest.ExecutionType; import org.eclipse.linuxtools.tmf.request.ITmfEventRequest; import org.eclipse.linuxtools.tmf.request.TmfDataRequest; import org.eclipse.linuxtools.tmf.request.TmfEventRequest; +import org.eclipse.linuxtools.tmf.request.ITmfDataRequest.ExecutionType; import org.eclipse.linuxtools.tmf.signal.TmfExperimentSelectedSignal; import org.eclipse.linuxtools.tmf.signal.TmfExperimentUpdatedSignal; import org.eclipse.linuxtools.tmf.signal.TmfSignalHandler; @@ -80,7 +80,7 @@ public class TmfExperiment extends TmfEventProvider imple * @param indexPageSize */ public TmfExperiment(Class type, String id, ITmfTrace[] traces, TmfTimestamp epoch, int indexPageSize) { - this(type, id, traces, TmfTimestamp.Zero, DEFAULT_INDEX_PAGE_SIZE, false); + this(type, id, traces, TmfTimestamp.Zero, indexPageSize, false); } public TmfExperiment(Class type, String id, ITmfTrace[] traces, TmfTimestamp epoch, int indexPageSize, boolean preIndexExperiment) { @@ -537,7 +537,7 @@ public class TmfExperiment extends TmfEventProvider imple } /* (non-Javadoc) - * @see org.eclipse.linuxtools.tmf.trace.ITmfTrace#peekEvent(org.eclipse.linuxtools.tmf.trace.TmfContext) + * @see org.eclipse.linuxtools.tmf.trace.ITmfTrace#parseEvent(org.eclipse.linuxtools.tmf.trace.TmfContext) */ public TmfEvent parseEvent(TmfContext context) { @@ -559,6 +559,7 @@ public class TmfExperiment extends TmfEventProvider imple TmfContext traceContext = expContext.getContexts()[lastTrace]; expContext.getEvents()[lastTrace] = expContext.getTraces()[lastTrace].getNextEvent(traceContext); expContext.setLastTrace(TmfExperimentContext.NO_TRACE); + fSavedContext = new TmfExperimentContext(expContext); } // Scan the candidate events and identify the "next" trace to read from -- 2.34.1