source: Sophya/trunk/ArchTOIPipe/Kernel/toi.cc@ 1410

Last change on this file since 1410 was 1370, checked in by aubourg, 25 years ago

flag handling

File size: 6.2 KB
Line 
1#include "toiprocessor.h"
2#include "toi.h"
3#include <pthread.h>
4
5#ifdef WITH_SOPHYA
6#include "pexceptions.h"
7#else
8#include "apexceptions.h"
9#endif
10
11#define CHKSYNC(ctx)
12// if (((TOIRegularWindow*)this)->data.size() != ((TOIRegularWindow*)this)->flags.size()) \
13// cout << ctx << ((TOIRegularWindow*)this)->data.size() << " " << \
14// ((TOIRegularWindow*)this)->flags.size() << endl; \
15
16TOI::TOI() {
17 TOIInit();
18}
19
20TOI::TOI(string n) {
21 name = n;
22 TOIInit();
23}
24
25void TOI::TOIInit() {
26 pthread_mutex_init(&mutex, NULL);
27// pthread_mutex_setname_np(&mutex, (name + "_toi_mutex").c_str(), 0);
28 defaultValue = 0;
29 producer = NULL;
30 dbg = false;
31}
32
33TOI::~TOI() {
34 pthread_mutex_destroy(&mutex);
35}
36
37void TOI::setProducer(TOIProcessor* p) {
38 if (producer)
39 throw DuplicateIdExc("TOI::setProducer : producer already defined");
40 producer = p;
41}
42
43void TOI::addConsumer(TOIProcessor* p) {
44 consumers.push_back(p);
45}
46
47int TOI::getMinSn(){
48 return producer->getMinOut();
49}
50
51int TOI::getMaxSn(){
52 return producer->getMaxOut();
53}
54
55#ifndef NO_SOPHYA
56Array TOI::getError(int iStart, int iEnd) {
57 if (errorTOI == NULL) throw NotFoundExc("TOI::getDataError : no Error TOI");
58 return errorTOI->getData(iStart, iEnd);
59}
60#endif
61
62double TOI::getError(int i) {
63 if (errorTOI == NULL) throw NotFoundExc("TOI::getDataError : no Error TOI");
64 return errorTOI->getData(i);
65}
66
67void TOI::putDataError(int i, double value, double error, int_4 flag) {
68 if (errorTOI == NULL) throw NotFoundExc("TOI::getDataError : no Error TOI");
69 putData(i, value, flag);
70 errorTOI->putData(i, value, flag);
71}
72
73#ifndef NO_SOPHYA
74Array TOI::getData(int iStart, int iEnd) {
75 lock();
76 Array a = doGetData(iStart, iEnd);
77 unlock();
78 return a;
79}
80#endif
81
82double TOI::getData(int i) {
83 lock();
84 double dat = doGetData(i);
85 unlock();
86 return dat;
87}
88
89
90#ifndef NO_SOPHYA
91TArray<int_4> TOI::getFlag(int iStart, int iEnd) {
92 lock();
93 TArray<int_4> a = doGetFlag(iStart, iEnd);
94 unlock();
95 return a;
96}
97#endif
98
99int_4 TOI::getFlag(int i) {
100 lock();
101 int_4 f = doGetFlag(i);
102 unlock();
103 return f;
104}
105
106
107
108void TOI::putData(int i, double value, int_4 flag) {
109 lock();
110 doPutData(i, value, flag);
111 unlock();
112}
113
114void TOI::waitForData(int iStart, int iEnd) {
115 if (producer == NULL) throw NotFoundExc("TOI has no producer !");
116
117 DataStatus s = isDataAvail(iStart, iEnd);
118 if (s == DATA_OK) {
119 return;
120 }
121 if (s == DATA_DELETED) {
122 throw NotFoundExc("Data has been purged !");
123 }
124
125 producer->lock();
126 while (isDataAvailNL(iStart, iEnd) == DATA_NOT_YET) {
127 producer->wait();
128 }
129 producer->unlock();
130 return;
131}
132
133void TOI::waitForData(int i) {
134 waitForData(i,i);
135}
136
137void TOI::waitForAnyData() {
138 if (! hasSomeData()) {
139 producer->lock();
140 producer->wait();
141 producer->unlock();
142 }
143}
144
145TOI::DataStatus TOI::isDataAvail(int i) {
146 lock();
147 DataStatus stat = isDataAvailNL(i);
148 unlock();
149 return stat;
150}
151
152TOI::DataStatus TOI::isDataAvail(int i, int j) {
153 lock();
154 DataStatus stat = isDataAvailNL(i,j);
155 unlock();
156 return stat;
157}
158
159TOI::DataStatus TOI::isDataAvailNL(int i) {
160 return isDataAvailNL(i,i);
161}
162
163void TOI::wontNeedBefore(int i) {
164 int j=i;
165 for (vector<TOIProcessor*>::iterator k = consumers.begin();
166 k != consumers.end(); k++) {
167 if ((*k)->wontNeedValue < j) j = (*k)->wontNeedValue;
168 }
169 lock();
170 doWontNeedBefore(j);
171 unlock();
172}
173
174void TOI::doWontNeedBefore(int i) {
175}
176
177
178TOIRegularWindow::TOIRegularWindow() {
179 i0 = -1;
180}
181
182TOIRegularWindow::TOIRegularWindow(string nm) {
183 i0 = -1;
184 setName(nm);
185}
186
187TOIRegularWindow::~TOIRegularWindow() {
188}
189
190TOI::DataStatus TOIRegularWindow::isDataAvailNL(int iStart, int iEnd) {
191 if (iEnd >= i0 + (long)data.size()) return DATA_NOT_YET;
192 if (iStart < i0) return DATA_DELETED;
193 return DATA_OK;
194}
195
196TOI::DataStatus TOIRegularWindow::isDataAvailNL(int i) {
197 return TOI::isDataAvailNL(i);
198}
199
200void TOIRegularWindow::doWontNeedBefore(int i) {
201 if (i>= i0 + (long)data.size())
202 i = i0 + (long)data.size() - 1;
203 if (i>i0) { // don't empty list
204 int osz = data.size();
205 data.erase(data.begin(), data.begin()+(i-i0));
206 flags.erase(flags.begin(), flags.begin()+(i-i0));
207 i0 = i;
208 }
209}
210
211
212#ifndef NO_SOPHYA
213Array TOIRegularWindow::doGetData(int iStart, int iEnd) {
214 if (!isDataAvailNL(iStart, iEnd)) {
215 throw RangeCheckError("TOI::getData : data not available");
216 }
217 Array dat(iEnd - iStart + 1);
218 long j0 = iStart - i0;
219 for (int i=0; i<iEnd-iStart+1; i++) {
220 dat[i] = data[i+j0];
221 }
222 return dat;
223}
224#endif
225
226double TOIRegularWindow::doGetData(int i) {
227 if (isDataAvailNL(i) != DATA_OK) {
228 cerr << "TOI::getData : data not available " << i << endl;
229 throw RangeCheckError("TOI::getData : data not available");
230 }
231 double dat = data[i - i0];
232 return dat;
233}
234
235
236#ifndef NO_SOPHYA
237TArray<int_4> TOIRegularWindow::doGetFlag(int iStart, int iEnd) {
238 if (isDataAvailNL(iStart, iEnd) != DATA_OK) throw RangeCheckError("TOI::getData : data not available");
239 TArray<int_4> dat(iEnd - iStart + 1);
240 long j0 = iStart - i0;
241 for (int i=0; i<iEnd-iStart+1; i++) {
242 dat[i] = flags[i+j0];
243 }
244 return dat;
245}
246#endif
247
248int_4 TOIRegularWindow::doGetFlag(int i) {
249 if (isDataAvailNL(i) != DATA_OK) {
250 cerr << "TOI::getFlag : data not available " << i << endl;
251 throw RangeCheckError("TOI::getFlag : data not available");
252 }
253 return flags[i - i0];
254}
255
256
257void TOIRegularWindow::doPutData(int i, double value, int_4 flag) {
258 if (i0 == -1) {
259 data.insert(data.begin(), 1, defaultValue);
260 flags.insert(flags.begin(), 1, 0);
261 i0 = i;
262 } else if (i<i0) {
263 data.insert(data.begin(), i0-i, defaultValue);
264 flags.insert(flags.begin(), i0-i, 0);
265 i0 = i;
266 } else if (i>=i0+(int)data.size()) {
267 data.insert(data.end(), (long) (i-(i0+data.size())+1), defaultValue);
268 flags.insert(flags.end(), (long) (i-(i0+flags.size())+1), 0);
269 }
270 data[i-i0] = value;
271 flags[i-i0] = flag;
272}
273
274bool TOIRegularWindow::hasSomeData() {
275 lock();
276 bool x = !data.empty();
277 unlock();
278 return x;
279}
280
281int TOIRegularWindow::nextDataAvail(int iAfter) {
282 lock();
283 if (iAfter >= i0 + (long)data.size()) {unlock(); return -1;}
284 if (iAfter < i0) {unlock(); return i0;}
285 unlock();
286 return iAfter+1;
287}
288
289/* A faire, le nettoyage (heuristique selon demandes ?, guide ? ) */
290
291
Note: See TracBrowser for help on using the repository browser.