source: Sophya/trunk/AddOn/TAcq/racqumem.cc@ 4086

Last change on this file since 4086 was 4016, checked in by ansari, 14 years ago

Ajout de commentaires d'autodocumentation Doxygen, Reza 12/08/2011

File size: 13.2 KB
Line 
1#include "racqumem.h"
2
3using namespace SOPHYA;
4
5//----------------------------------------------------------------
6// ---- classes de gestion memoire pour acquisition BAORadio -----
7// LAL - R. Ansari - Juin/Juillet 2008
8//----------------------------------------------------------------
9
10/*!
11 \class RAcqMemZoneMgr
12 \ingroup TAcq
13
14 \brief Memory Manager class for multi-threaded acquisition and processing software
15
16 This class is the central memory hub through which different threads (I/O, processing, monitoring)
17 are synchronized.
18*/
19
20/* --Methode-- */
21RAcqMemZoneMgr::RAcqMemZoneMgr(uint_4 nz, uint_4 np, uint_4 psz)
22 : mex(true), nzones(nz), nfibres(1), npaq(np), paqsz(psz), procpaqsz(0),
23 fiber_id(1), stop_(false), runstate_(MemZR_Running)
24{
25 Init();
26}
27
28/* --Methode-- */
29RAcqMemZoneMgr::RAcqMemZoneMgr(uint_4 nzon, uint_4 nfib, uint_4 npaq, uint_4 paqsz, uint_4 procsz)
30 : mex(true), nzones(nzon), nfibres(nfib), npaq(npaq), paqsz(paqsz), procpaqsz(procsz),
31 fiber_id(nfib), stop_(false), runstate_(MemZR_Running)
32{
33 Init();
34}
35
36/* --Methode-- */
37void RAcqMemZoneMgr::Init()
38{
39 St_MemZ st;
40
41 st.serial = 0;
42 st.act = (uint_4)MemZA_None;
43 st.stat = (uint_4)MemZS_Free;
44 for(int k=0; k<MXNACTMZM; k++) st.nbact[k] = 0;
45 uint_8 mzsz = nfibres*npaq*paqsz;
46 uint_8 procmzsz = nfibres*npaq*procpaqsz;
47
48 for(unsigned int k=0; k<NbZones(); k++) {
49 memzones.push_back(new Byte[mzsz] );
50 states.push_back(st);
51 auxdatap.push_back( new RAcqMZAuxData((size_t)NbFibres()) );
52 if (procmzsz > 0) procmemzones.push_back(new Byte[procmzsz] );
53 }
54 for(size_t k=0; k<NbFibres(); k++) fiber_id[k]=0;
55 dummy_=0;
56 serial_ = 0;
57 SetFinalizedMask();
58 SetProcSavedReadyMask();
59}
60
61/* --Methode-- */
62RAcqMemZoneMgr::~RAcqMemZoneMgr()
63{
64 for(uint_4 k=0; k<NbZones(); k++) {
65 delete[] memzones[k];
66 delete auxdatap[k];
67 if (procpaqsz > 0) delete[] procmemzones[k];
68 }
69}
70
71/* --Methode-- */
72int RAcqMemZoneMgr::FindMemZoneId(MemZaction act)
73// Recherche et renvoie une zone memoire compatible pour effectuer l'operation act
74// Pour act = MemZA_Fill : Zone vide ou satisfaisant la condition mask_finalized_
75// On recherche a chaque fois la zone ayant le plus petit numero de serie
76// cad le numero d'ordre de remplissage
77// Pour ProcA/B/C on attend que la zone avec le plus petit numero soit disponible
78
79{
80 int rid = -1;
81 if (stop_) return rid;
82 if ((act != MemZA_Fill) && (act != MemZA_Save) && (act != MemZA_Proc) &&
83 (act != MemZA_ProcA) && (act != MemZA_ProcB) && (act != MemZA_ProcC) &&
84 (act != MemZA_ProcD) && (act != MemZA_ProcE) && (act != MemZA_ProcF) &&
85 (act != MemZA_ProcG) && (act != MemZA_ProcH) && (act != MemZA_ProcI) &&
86 (act != MemZA_ProcJ) &&
87 (act != MemZA_SaveProc) ) return rid;
88
89 mex.lock();
90 uint_8 bestserial = serial_ + 5;
91 while ((rid < 0)&&(!stop_)) {
92 switch (act) {
93 case MemZA_Fill:
94 if (rid < 0) for(uint_4 k=0; k<NbZones(); k++) {
95 if ((states[k].act == MemZA_None) &&
96 ((states[k].stat == MemZS_Free)||((states[k].stat&mask_finalized_)==mask_finalized_) )) {
97 if (states[k].serial < bestserial) { rid=k; bestserial=states[k].serial; }
98 }
99 }
100 if (rid >= 0) { states[rid].act = MemZA_Fill; states[rid].stat = MemZS_Free; }
101 break;
102 case MemZA_Save:
103 for(uint_4 k=0; k<NbZones(); k++) {
104 if ((states[k].act == MemZA_None) &&
105 (states[k].stat & MemZS_Filled) && !(states[k].stat & MemZS_Saved) ) {
106 if (states[k].serial < bestserial) { rid=k; bestserial=states[k].serial; }
107 }
108 }
109 if (rid >= 0) states[rid].act = MemZA_Save;
110 break;
111 case MemZA_Proc:
112 for(uint_4 k=0; k<NbZones(); k++) {
113 if ((states[k].act == MemZA_None) &&
114 (states[k].stat & MemZS_Saved) && !(states[k].stat & MemZS_Proc) ) {
115 if (states[k].serial < bestserial) { rid=k; bestserial=states[k].serial; }
116 }
117 }
118 if (rid >= 0) states[rid].act = MemZA_Proc;
119 break;
120 case MemZA_ProcA:
121 for(uint_4 k=0; k<NbZones(); k++) {
122 if ((states[k].act == MemZA_None) && (states[k].stat & MemZS_Filled) &&
123 !(states[k].stat & MemZS_ProcA) ) {
124 if (states[k].serial < bestserial) { rid=k; bestserial=states[k].serial; }
125 }
126 }
127 if (rid >= 0) states[rid].act = MemZA_ProcA;
128 break;
129 case MemZA_ProcB:
130 for(uint_4 k=0; k<NbZones(); k++) {
131 if ((states[k].act == MemZA_None) && (states[k].stat & MemZS_Filled) &&
132 (states[k].stat & MemZS_ProcA) && !(states[k].stat & MemZS_ProcB) ) {
133 if (states[k].serial < bestserial) { rid=k; bestserial=states[k].serial; }
134 }
135 }
136 if (rid >= 0) states[rid].act = MemZA_ProcB;
137 break;
138 case MemZA_ProcC:
139 for(uint_4 k=0; k<NbZones(); k++) {
140 if ((states[k].act == MemZA_None) && (states[k].stat & MemZS_Filled) &&
141 (states[k].stat & MemZS_ProcB) && !(states[k].stat & MemZS_ProcC) ) {
142 if (states[k].serial < bestserial) { rid=k; bestserial=states[k].serial; }
143 }
144 }
145 if (rid >= 0) states[rid].act = MemZA_ProcC;
146 break;
147 case MemZA_ProcD:
148 for(uint_4 k=0; k<NbZones(); k++) {
149 if ((states[k].act == MemZA_None) && (states[k].stat & MemZS_Filled) &&
150 (states[k].stat & MemZS_ProcC) && !(states[k].stat & MemZS_ProcD) ) {
151 if (states[k].serial < bestserial) { rid=k; bestserial=states[k].serial; }
152 }
153 }
154 if (rid >= 0) states[rid].act = MemZA_ProcD;
155 break;
156 case MemZA_ProcE:
157 for(uint_4 k=0; k<NbZones(); k++) {
158 if ((states[k].act == MemZA_None) && (states[k].stat & MemZS_Filled) &&
159 (states[k].stat & MemZS_ProcD) && !(states[k].stat & MemZS_ProcE) ) {
160 if (states[k].serial < bestserial) { rid=k; bestserial=states[k].serial; }
161 }
162 }
163 if (rid >= 0) states[rid].act = MemZA_ProcE;
164 break;
165 case MemZA_ProcF:
166 for(uint_4 k=0; k<NbZones(); k++) {
167 if ((states[k].act == MemZA_None) && (states[k].stat & MemZS_Filled) &&
168 (states[k].stat & MemZS_ProcE) && !(states[k].stat & MemZS_ProcF) ) {
169 if (states[k].serial < bestserial) { rid=k; bestserial=states[k].serial; }
170 }
171 }
172 if (rid >= 0) states[rid].act = MemZA_ProcF;
173 break;
174 case MemZA_ProcG:
175 for(uint_4 k=0; k<NbZones(); k++) {
176 if ((states[k].act == MemZA_None) && (states[k].stat & MemZS_Filled) &&
177 (states[k].stat & MemZS_ProcF) && !(states[k].stat & MemZS_ProcG) ) {
178 if (states[k].serial < bestserial) { rid=k; bestserial=states[k].serial; }
179 }
180 }
181 if (rid >= 0) states[rid].act = MemZA_ProcG;
182 break;
183 case MemZA_ProcH:
184 for(uint_4 k=0; k<NbZones(); k++) {
185 if ((states[k].act == MemZA_None) && (states[k].stat & MemZS_Filled) &&
186 (states[k].stat & MemZS_ProcG) && !(states[k].stat & MemZS_ProcH) ) {
187 if (states[k].serial < bestserial) { rid=k; bestserial=states[k].serial; }
188 }
189 }
190 if (rid >= 0) states[rid].act = MemZA_ProcH;
191 break;
192 case MemZA_ProcI:
193 for(uint_4 k=0; k<NbZones(); k++) {
194 if ((states[k].act == MemZA_None) && (states[k].stat & MemZS_Filled) &&
195 (states[k].stat & MemZS_ProcH) && !(states[k].stat & MemZS_ProcI) ) {
196 if (states[k].serial < bestserial) { rid=k; bestserial=states[k].serial; }
197 }
198 }
199 if (rid >= 0) states[rid].act = MemZA_ProcI;
200 break;
201 case MemZA_ProcJ:
202 for(uint_4 k=0; k<NbZones(); k++) {
203 if ((states[k].act == MemZA_None) && (states[k].stat & MemZS_Filled) &&
204 (states[k].stat & MemZS_ProcI) && !(states[k].stat & MemZS_ProcJ) ) {
205 if (states[k].serial < bestserial) { rid=k; bestserial=states[k].serial; }
206 }
207 }
208 if (rid >= 0) states[rid].act = MemZA_ProcJ;
209 break;
210 case MemZA_SaveProc:
211 for(uint_4 k=0; k<NbZones(); k++) {
212 if ((states[k].act == MemZA_None) &&
213 (states[k].stat & mask_saveproc_ready_) && !(states[k].stat & MemZS_SavedProc) ) {
214 if (states[k].serial < bestserial) { rid=k; bestserial=states[k].serial; }
215 }
216 }
217 if (rid >= 0) states[rid].act = MemZA_SaveProc;
218 break;
219 case MemZA_None: // MTQ pour supprimer un warning
220 break;
221 } // Fin de switch
222 if (rid < 0) mex.wait();
223 } // Fin de while
224 mex.unlock();
225 return rid;
226}
227
228/* --Methode-- */
229int RAcqMemZoneMgr::FreeMemZone(int id, MemZStatus st)
230{
231 if ((id < 0) || (id >= (int)states.size())) return 1;
232 int rc = 0;
233 mex.lock();
234 switch (st) {
235 case MemZS_Free :
236 states[id].serial = 0;
237 states[id].stat = MemZS_Free;
238 states[id].act = MemZA_None;
239 break;
240 case MemZS_Filled :
241 if (states[id].act != MemZA_Fill) rc = 2;
242 else states[id].nbact[0]++;
243 serial_ ++;
244 states[id].serial = serial_;
245 states[id].stat |= MemZS_Filled;
246 states[id].act = MemZA_None;
247 break;
248 case MemZS_Saved :
249 if (states[id].act != MemZA_Save) rc = 4;
250 else states[id].nbact[1]++;
251 states[id].stat |= MemZS_Saved;
252 states[id].act = MemZA_None;
253 break;
254 case MemZS_Proc :
255 if (states[id].act != MemZA_Proc) rc = 8;
256 else states[id].nbact[2]++;
257 states[id].stat |= MemZS_Proc;
258 states[id].act = MemZA_None;
259 break;
260 case MemZS_ProcA :
261 if (states[id].act != MemZA_ProcA) rc = 16;
262 else states[id].nbact[3]++;
263 states[id].stat |= MemZS_ProcA;
264 states[id].act = MemZA_None;
265 break;
266 case MemZS_ProcB :
267 if (states[id].act != MemZA_ProcB) rc = 32;
268 else states[id].nbact[4]++;
269 states[id].stat |= MemZS_ProcB;
270 states[id].act = MemZA_None;
271 break;
272 case MemZS_ProcC :
273 if (states[id].act != MemZA_ProcC) rc = 64;
274 else states[id].nbact[5]++;
275 states[id].stat |= MemZS_ProcC;
276 states[id].act = MemZA_None;
277 break;
278 case MemZS_ProcD :
279 if (states[id].act != MemZA_ProcD) rc = 128;
280 else states[id].nbact[6]++;
281 states[id].stat |= MemZS_ProcD;
282 states[id].act = MemZA_None;
283 break;
284 case MemZS_ProcE :
285 if (states[id].act != MemZA_ProcE) rc = 256;
286 else states[id].nbact[7]++;
287 states[id].stat |= MemZS_ProcE;
288 states[id].act = MemZA_None;
289 break;
290 case MemZS_ProcF :
291 if (states[id].act != MemZA_ProcF) rc = 512;
292 else states[id].nbact[8]++;
293 states[id].stat |= MemZS_ProcF;
294 states[id].act = MemZA_None;
295 break;
296 case MemZS_ProcG :
297 if (states[id].act != MemZA_ProcG) rc = 1024;
298 else states[id].nbact[9]++;
299 states[id].stat |= MemZS_ProcG;
300 states[id].act = MemZA_None;
301 break;
302 case MemZS_ProcH :
303 if (states[id].act != MemZA_ProcH) rc = 2048;
304 else states[id].nbact[10]++;
305 states[id].stat |= MemZS_ProcH;
306 states[id].act = MemZA_None;
307 break;
308 case MemZS_ProcI :
309 if (states[id].act != MemZA_ProcI) rc = 4096;
310 else states[id].nbact[11]++;
311 states[id].stat |= MemZS_ProcI;
312 states[id].act = MemZA_None;
313 break;
314 case MemZS_ProcJ :
315 if (states[id].act != MemZA_ProcJ) rc = 4096;
316 else states[id].nbact[12]++;
317 states[id].stat |= MemZS_ProcJ;
318 states[id].act = MemZA_None;
319 break;
320 case MemZS_SavedProc :
321 if (states[id].act != MemZA_SaveProc) rc = 16384;
322 else states[id].nbact[13]++;
323 states[id].stat |= MemZS_ProcF;
324 states[id].act = MemZA_None;
325 break;
326 default :
327 rc = 65536;
328 states[id].serial = 0;
329 states[id].stat = MemZS_Free;
330 states[id].act = MemZA_None;
331 break;
332 } // Fin de switch
333 mex.unlock();
334 mex.broadcast();
335 return rc;
336}
337
338/* --Methode-- */
339ostream& RAcqMemZoneMgr::Print(ostream& os)
340{
341 os << "RAcqMemZoneMgr::Print() NbZones=" << NbZones() << " PaqSize()=" << PaqSize()
342 << " NbPaquets()=" << NbPaquets() << " NbFibres()=" << NbFibres() << " ZoneSize()="
343 << ZoneSize() << endl;
344 if (ProcPaqSize() > 0)
345 cout << " ... With Processed Data Zones ProcPaqSize()=" << ProcPaqSize()
346 << " ProcZoneSize()=" << ProcZoneSize() << endl;
347 else cout << " ... NO Processed Data Zones" << endl;
348 for(uint_4 k=0; k<states.size(); k++) {
349 os << " [" << k << "] Act=" << states[k].act << " Stat=" << states[k].stat
350 << " NbAct[0.."<< MXNACTMZM-1 << "]=" << states[k].nbact[0];
351 for(uint_4 j=1; j<MXNACTMZM; j++) cout << "," << states[k].nbact[j];
352 cout << endl;
353 }
354 return os;
355}
356
357/* --Methode-- */
358void RAcqMemZoneMgr::Stop()
359{
360 // cout << "RAcqMemZoneMgr::Stop() ........ STOP BROADCAST" <<endl;
361 stop_ = true;
362 runstate_ = MemZR_Stopped;
363 mex.broadcast();
364}
365
366/* --Methode-- */
367MemZaction RAcqMemZoneMgr::Convert_Status2Action(MemZStatus st)
368// methode statique
369{
370 MemZaction ra=MemZA_None;
371 switch (st) {
372 case MemZS_Filled:
373 ra=MemZA_Fill;
374 break;
375 case MemZS_Saved:
376 ra=MemZA_Save;
377 break;
378 case MemZS_Proc:
379 ra=MemZA_Proc;
380 break;
381 case MemZS_ProcA:
382 ra=MemZA_ProcA;
383 break;
384 case MemZS_ProcB:
385 ra=MemZA_ProcB;
386 break;
387 case MemZS_ProcC:
388 ra=MemZA_ProcC;
389 break;
390 case MemZS_ProcD:
391 ra=MemZA_ProcD;
392 break;
393 case MemZS_ProcE:
394 ra=MemZA_ProcE;
395 break;
396 case MemZS_ProcF:
397 ra=MemZA_ProcF;
398 break;
399 default:
400 ra=MemZA_None;
401 break;
402 }
403 return ra;
404}
Note: See TracBrowser for help on using the repository browser.