Use project-specific Save Actions settings
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.core / src / org / eclipse / linuxtools / tmf / core / component / TmfEventProvider.java
CommitLineData
8c8bf09f
ASL
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
6c13869b 13package org.eclipse.linuxtools.tmf.core.component;
8c8bf09f 14
4918b8f2 15import org.eclipse.linuxtools.internal.tmf.core.Tracer;
8fd82db5 16import org.eclipse.linuxtools.internal.tmf.core.request.TmfCoalescedEventRequest;
72f1e62a 17import org.eclipse.linuxtools.tmf.core.event.ITmfEvent;
4df4581d 18import org.eclipse.linuxtools.tmf.core.event.ITmfTimestamp;
6c13869b 19import org.eclipse.linuxtools.tmf.core.request.ITmfDataRequest;
4df4581d 20import org.eclipse.linuxtools.tmf.core.request.ITmfDataRequest.ExecutionType;
6c13869b 21import org.eclipse.linuxtools.tmf.core.request.ITmfEventRequest;
6c13869b 22import org.eclipse.linuxtools.tmf.core.request.TmfEventRequest;
8c8bf09f
ASL
23
24/**
8fd82db5
FC
25 * An extension of TmfDataProvider timestamped events providers.
26 *
27 * @version 1.0
28 * @author Francois Chouinard
8c8bf09f 29 */
72f1e62a 30public abstract class TmfEventProvider<T extends ITmfEvent> extends TmfDataProvider<T> {
8c8bf09f 31
00641a97
FC
32 // ------------------------------------------------------------------------
33 // Constructors
34 // ------------------------------------------------------------------------
35
063f0d27
AM
36 /**
37 * Default constructor
38 */
12c155f5 39 public TmfEventProvider() {
00641a97 40 super();
12c155f5 41 }
8c8bf09f 42
9c272afc 43 @Override
3791b5df
FC
44 public void init(String name, Class<T> type) {
45 super.init(name, type);
12c155f5 46 }
8c8bf09f 47
063f0d27
AM
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<T> type) {
12c155f5
FC
57 super(name, type);
58 }
59
063f0d27
AM
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 */
12c155f5
FC
70 public TmfEventProvider(String name, Class<T> type, int queueSize) {
71 super(name, type, queueSize);
72 }
73
063f0d27
AM
74 /**
75 * Copy constructor
76 *
77 * @param other
78 * The other TmfEventProvider to copy
79 */
00641a97
FC
80 public TmfEventProvider(TmfEventProvider<T> other) {
81 super(other);
12c155f5
FC
82 }
83
00641a97
FC
84 // ------------------------------------------------------------------------
85 // TmfDataProvider
86 // ------------------------------------------------------------------------
87
12c155f5
FC
88 @Override
89 public boolean isCompleted(ITmfDataRequest<T> request, T data, int nbRead) {
90 boolean requestCompleted = super.isCompleted(request, data, nbRead);
b6be1c3e 91 if (!requestCompleted && request instanceof ITmfEventRequest<?>) {
4df4581d 92 ITmfTimestamp endTime = ((ITmfEventRequest<?>) request).getRange().getEndTime();
12c155f5
FC
93 return data.getTimestamp().compareTo(endTime, false) > 0;
94 }
95 return requestCompleted;
96 }
97
98 @Override
99 protected synchronized void newCoalescedDataRequest(ITmfDataRequest<T> request) {
100 if (request instanceof ITmfEventRequest<?>) {
101 ITmfEventRequest<T> eventRequest = (ITmfEventRequest<T>) request;
01ffecb8 102 TmfCoalescedEventRequest<T> coalescedRequest = new TmfCoalescedEventRequest<T>(eventRequest.getDataType(), eventRequest.getRange(),
8edafa7f 103 eventRequest.getIndex(), eventRequest.getNbRequested(), eventRequest.getBlockSize(), eventRequest.getExecType());
12c155f5
FC
104 coalescedRequest.addRequest(eventRequest);
105 if (Tracer.isRequestTraced()) {
90891c08
FC
106 Tracer.traceRequest(request, "COALESCED with " + coalescedRequest.getRequestId()); //$NON-NLS-1$
107 Tracer.traceRequest(coalescedRequest, "now contains " + coalescedRequest.getSubRequestIds()); //$NON-NLS-1$
12c155f5
FC
108 }
109 fPendingCoalescedRequests.add(coalescedRequest);
110 } else {
111 super.newCoalescedDataRequest(request);
112 }
113 }
951d134a 114
11a2fdf0
PT
115 @Override
116 protected void queueBackgroundRequest(final ITmfDataRequest<T> request, final int blockSize, final boolean indexing) {
a79913eb 117
11a2fdf0
PT
118 if (! (request instanceof ITmfEventRequest)) {
119 super.queueBackgroundRequest(request, blockSize, indexing);
120 return;
121 }
a79913eb 122
4cf201de
FC
123 final TmfDataProvider<T> provider = this;
124
11a2fdf0
PT
125 Thread thread = new Thread() {
126 @Override
127 public void run() {
4cf201de
FC
128
129 if (Tracer.isRequestTraced()) {
130 Tracer.traceRequest(request, "is being serviced by " + provider.getName()); //$NON-NLS-1$
131 }
132
11a2fdf0
PT
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<T> subRequest= new TmfEventRequest<T>(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(T 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 }
8c8bf09f 206}
This page took 0.046548 seconds and 5 git commands to generate.