Merge branch 'master' into lttng-kepler
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.core / src / org / eclipse / linuxtools / tmf / core / component / TmfEventProvider.java
1 /*******************************************************************************
2 * Copyright (c) 2009, 2010 Ericsson
3 *
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
8 *
9 * Contributors:
10 * Francois Chouinard - Initial API and implementation
11 *******************************************************************************/
12
13 package org.eclipse.linuxtools.tmf.core.component;
14
15 import org.eclipse.linuxtools.internal.tmf.core.TmfCoreTracer;
16 import org.eclipse.linuxtools.internal.tmf.core.request.TmfCoalescedEventRequest;
17 import org.eclipse.linuxtools.tmf.core.event.ITmfEvent;
18 import org.eclipse.linuxtools.tmf.core.event.ITmfTimestamp;
19 import org.eclipse.linuxtools.tmf.core.request.ITmfDataRequest;
20 import org.eclipse.linuxtools.tmf.core.request.ITmfDataRequest.ExecutionType;
21 import org.eclipse.linuxtools.tmf.core.request.ITmfEventRequest;
22 import org.eclipse.linuxtools.tmf.core.request.TmfEventRequest;
23
24 /**
25 * An extension of TmfDataProvider timestamped events providers.
26 *
27 * @version 1.0
28 * @author Francois Chouinard
29 */
30 public abstract class TmfEventProvider extends TmfDataProvider {
31
32 // ------------------------------------------------------------------------
33 // Constructors
34 // ------------------------------------------------------------------------
35
36 /**
37 * Default constructor
38 */
39 public TmfEventProvider() {
40 super();
41 }
42
43 @Override
44 public void init(String name, Class<? extends ITmfEvent> type) {
45 super.init(name, type);
46 }
47
48 /**
49 * Standard constructor
50 *
51 * @param name
52 * The name of the provider
53 * @param type
54 * The type of handled events
55 */
56 public TmfEventProvider(String name, Class<? extends ITmfEvent> type) {
57 super(name, type);
58 }
59
60 /**
61 * Standard constructor which also sets the queue size
62 *
63 * @param name
64 * The name of the provider
65 * @param type
66 * The type of handled events
67 * @param queueSize
68 * The size of the queue
69 */
70 public TmfEventProvider(String name, Class<? extends ITmfEvent> type, int queueSize) {
71 super(name, type, queueSize);
72 }
73
74 /**
75 * Copy constructor
76 *
77 * @param other
78 * The other TmfEventProvider to copy
79 */
80 public TmfEventProvider(TmfEventProvider other) {
81 super(other);
82 }
83
84 // ------------------------------------------------------------------------
85 // TmfDataProvider
86 // ------------------------------------------------------------------------
87
88 @Override
89 public boolean isCompleted(ITmfDataRequest request, ITmfEvent data, int nbRead) {
90 boolean requestCompleted = super.isCompleted(request, data, nbRead);
91 if (!requestCompleted && request instanceof ITmfEventRequest) {
92 ITmfTimestamp endTime = ((ITmfEventRequest) request).getRange().getEndTime();
93 return data.getTimestamp().compareTo(endTime, false) > 0;
94 }
95 return requestCompleted;
96 }
97
98 @Override
99 protected synchronized void newCoalescedDataRequest(ITmfDataRequest request) {
100 if (request instanceof ITmfEventRequest) {
101 ITmfEventRequest eventRequest = (ITmfEventRequest) request;
102 TmfCoalescedEventRequest coalescedRequest = new TmfCoalescedEventRequest(eventRequest.getDataType(), eventRequest.getRange(),
103 eventRequest.getIndex(), eventRequest.getNbRequested(), eventRequest.getBlockSize(), eventRequest.getExecType());
104 coalescedRequest.addRequest(eventRequest);
105 if (TmfCoreTracer.isRequestTraced()) {
106 TmfCoreTracer.traceRequest(request, "COALESCED with " + coalescedRequest.getRequestId()); //$NON-NLS-1$
107 TmfCoreTracer.traceRequest(coalescedRequest, "now contains " + coalescedRequest.getSubRequestIds()); //$NON-NLS-1$
108 }
109 fPendingCoalescedRequests.add(coalescedRequest);
110 } else {
111 super.newCoalescedDataRequest(request);
112 }
113 }
114
115 @Override
116 protected void queueBackgroundRequest(final ITmfDataRequest request, final int blockSize, final boolean indexing) {
117
118 if (! (request instanceof ITmfEventRequest)) {
119 super.queueBackgroundRequest(request, blockSize, indexing);
120 return;
121 }
122
123 final TmfDataProvider provider = this;
124
125 Thread thread = new Thread() {
126 @Override
127 public void run() {
128
129 if (TmfCoreTracer.isRequestTraced()) {
130 TmfCoreTracer.traceRequest(request, "is being serviced by " + provider.getName()); //$NON-NLS-1$
131 }
132
133 request.start();
134
135 final Integer[] CHUNK_SIZE = new Integer[1];
136 CHUNK_SIZE[0] = Math.min(request.getNbRequested(), blockSize + ((indexing) ? 1 : 0));
137
138 final Integer[] nbRead = new Integer[1];
139 nbRead[0] = 0;
140
141 final Boolean[] isFinished = new Boolean[1];
142 isFinished[0] = Boolean.FALSE;
143
144 long startIndex = request.getIndex();
145
146 while (!isFinished[0]) {
147
148 TmfEventRequest subRequest= new TmfEventRequest(request.getDataType(), ((ITmfEventRequest) request).getRange(), startIndex + nbRead[0], CHUNK_SIZE[0], blockSize, ExecutionType.BACKGROUND) {
149
150 @Override
151 public synchronized boolean isCompleted() {
152 return super.isCompleted() || request.isCompleted();
153 }
154
155 @Override
156 public void handleData(ITmfEvent data) {
157 super.handleData(data);
158 if (request.getDataType().isInstance(data)) {
159 request.handleData(data);
160 }
161 if (this.getNbRead() > CHUNK_SIZE[0]) {
162 System.out.println("ERROR - Read too many events"); //$NON-NLS-1$
163 }
164 }
165
166 @Override
167 public void handleCompleted() {
168 nbRead[0] += this.getNbRead();
169 if (nbRead[0] >= request.getNbRequested() || (this.getNbRead() < CHUNK_SIZE[0])) {
170 if (this.isCancelled()) {
171 request.cancel();
172 } else if (this.isFailed()) {
173 request.fail();
174 } else {
175 request.done();
176 }
177 isFinished[0] = Boolean.TRUE;
178 }
179 super.handleCompleted();
180 }
181 };
182
183 if (!isFinished[0]) {
184 queueRequest(subRequest);
185
186 try {
187 subRequest.waitForCompletion();
188 if (request.isCompleted()) {
189 isFinished[0] = Boolean.TRUE;
190 }
191 } catch (InterruptedException e) {
192 e.printStackTrace();
193 }
194
195 if (startIndex == 0 && nbRead[0].equals(CHUNK_SIZE[0])) { // do this only once if the event request index is unknown
196 startIndex = subRequest.getIndex(); // update the start index with the index of the first subrequest's
197 } // start time event which was set during the arm request
198 CHUNK_SIZE[0] = Math.min(request.getNbRequested() - nbRead[0], blockSize);
199 }
200 }
201 }
202 };
203
204 thread.start();
205 }
206 }
This page took 0.034792 seconds and 5 git commands to generate.