Contribute CNF based TMF project handling
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf / src / org / eclipse / linuxtools / tmf / 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
13package org.eclipse.linuxtools.tmf.component;
14
9b635e61 15import org.eclipse.linuxtools.tmf.Tracer;
8c8bf09f
ASL
16import org.eclipse.linuxtools.tmf.event.TmfEvent;
17import org.eclipse.linuxtools.tmf.event.TmfTimestamp;
2fb2eb37 18import org.eclipse.linuxtools.tmf.request.ITmfDataRequest;
a79913eb 19import org.eclipse.linuxtools.tmf.request.ITmfDataRequest.ExecutionType;
2fb2eb37 20import org.eclipse.linuxtools.tmf.request.ITmfEventRequest;
951d134a 21import org.eclipse.linuxtools.tmf.request.TmfCoalescedEventRequest;
a79913eb 22import org.eclipse.linuxtools.tmf.request.TmfEventRequest;
8c8bf09f
ASL
23
24/**
25 * <b><u>TmfEventProvider</u></b>
26 * <p>
27 * Implement me. Please.
28 */
29public abstract class TmfEventProvider<T extends TmfEvent> extends TmfDataProvider<T> {
30
12c155f5
FC
31 public TmfEventProvider() {
32 }
8c8bf09f 33
12c155f5
FC
34 public void init(String name, Class<T> eventType) {
35 super.init(name, eventType);
36 }
8c8bf09f 37
12c155f5
FC
38 public TmfEventProvider(String name, Class<T> type) {
39 super(name, type);
40 }
41
42 public TmfEventProvider(String name, Class<T> type, int queueSize) {
43 super(name, type, queueSize);
44 }
45
46 public TmfEventProvider(TmfEventProvider<T> oldProvider) {
47 super(oldProvider);
48 }
49
50 @Override
51 public boolean isCompleted(ITmfDataRequest<T> request, T data, int nbRead) {
52 boolean requestCompleted = super.isCompleted(request, data, nbRead);
53 if (!requestCompleted && request instanceof ITmfEventRequest<?> && !data.isNullRef()) {
54 TmfTimestamp endTime = ((ITmfEventRequest<?>) request).getRange().getEndTime();
55 return data.getTimestamp().compareTo(endTime, false) > 0;
56 }
57 return requestCompleted;
58 }
59
60 @Override
61 protected synchronized void newCoalescedDataRequest(ITmfDataRequest<T> request) {
62 if (request instanceof ITmfEventRequest<?>) {
63 ITmfEventRequest<T> eventRequest = (ITmfEventRequest<T>) request;
64 TmfCoalescedEventRequest<T> coalescedRequest = new TmfCoalescedEventRequest<T>(fType, eventRequest.getRange(),
65 eventRequest.getNbRequested(), eventRequest.getBlockSize(), eventRequest.getExecType());
66 coalescedRequest.addRequest(eventRequest);
67 if (Tracer.isRequestTraced()) {
68 Tracer.traceRequest(request, "coalesced with " + coalescedRequest.getRequestId()); //$NON-NLS-1$
69 }
70 fPendingCoalescedRequests.add(coalescedRequest);
71 } else {
72 super.newCoalescedDataRequest(request);
73 }
74 }
951d134a 75
a79913eb
FC
76 @Override
77 protected void queueBackgroundRequest(final ITmfDataRequest<T> request, final int blockSize, final boolean indexing) {
78
79 if (! (request instanceof ITmfEventRequest)) {
80 super.queueBackgroundRequest(request, blockSize, indexing);
81 return;
82 }
83
84 Thread thread = new Thread() {
85 @Override
86 public void run() {
87 request.start();
88
89 final Integer[] CHUNK_SIZE = new Integer[1];
90 CHUNK_SIZE[0] = Math.min(request.getNbRequested(), blockSize + ((indexing) ? 1 : 0));
91
92 final Integer[] nbRead = new Integer[1];
93 nbRead[0] = 0;
94
95 final Boolean[] isFinished = new Boolean[1];
96 isFinished[0] = Boolean.FALSE;
97
98 int startIndex = request.getIndex();
99
100 while (!isFinished[0]) {
101
102 TmfEventRequest<T> subRequest= new TmfEventRequest<T>(request.getDataType(), ((ITmfEventRequest<?>) request).getRange(), startIndex + nbRead[0], CHUNK_SIZE[0], blockSize, ExecutionType.BACKGROUND)
103 {
104 @Override
105 public void handleData(T data) {
106 super.handleData(data);
107 request.handleData(data);
108 if (this.getNbRead() > CHUNK_SIZE[0]) {
109 System.out.println("ERROR - Read too many events"); //$NON-NLS-1$
110 }
111 }
112
113 @Override
114 public void handleCompleted() {
115 nbRead[0] += this.getNbRead();
116 if (nbRead[0] >= request.getNbRequested() || (this.getNbRead() < CHUNK_SIZE[0])) {
90de83da 117 if (this.isCancelled()) {
a79913eb 118 request.cancel();
90de83da
BH
119 } else if (this.isFailed()) {
120 request.fail();
121 } else {
a79913eb
FC
122 request.done();
123 }
124 isFinished[0] = Boolean.TRUE;
125 }
126 super.handleCompleted();
127 }
128 };
129
130 if (!isFinished[0]) {
131 queueRequest(subRequest);
132
133 try {
134 subRequest.waitForCompletion();
135 } catch (InterruptedException e) {
136 e.printStackTrace();
137 }
138
139 if (startIndex == 0 && nbRead[0] == CHUNK_SIZE[0]) { // do this only once if the event request index is unknown
140 startIndex = subRequest.getIndex(); // update the start index with the index of the first subrequest's
141 } // start time event which was set during the arm request
142 CHUNK_SIZE[0] = Math.min(request.getNbRequested() - nbRead[0], blockSize);
143 }
144 }
145 }
146 };
147
148 thread.start();
149 }
8c8bf09f 150}
This page took 0.05837 seconds and 5 git commands to generate.