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
RevLine 
[3537]1#include "racqumem.h"
2
[3683]3using namespace SOPHYA;
4
[3537]5//----------------------------------------------------------------
6// ---- classes de gestion memoire pour acquisition BAORadio -----
7// LAL - R. Ansari - Juin/Juillet 2008
8//----------------------------------------------------------------
9
[4016]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
[3626]20/* --Methode-- */
[3658]21RAcqMemZoneMgr::RAcqMemZoneMgr(uint_4 nz, uint_4 np, uint_4 psz)
[3958]22 : mex(true), nzones(nz), nfibres(1), npaq(np), paqsz(psz), procpaqsz(0),
23 fiber_id(1), stop_(false), runstate_(MemZR_Running)
[3537]24{
[3658]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),
[3958]31 fiber_id(nfib), stop_(false), runstate_(MemZR_Running)
[3658]32{
33 Init();
34}
35
36/* --Methode-- */
37void RAcqMemZoneMgr::Init()
38{
[3537]39 St_MemZ st;
[3623]40
[3626]41 st.serial = 0;
[3537]42 st.act = (uint_4)MemZA_None;
[3626]43 st.stat = (uint_4)MemZS_Free;
[3683]44 for(int k=0; k<MXNACTMZM; k++) st.nbact[k] = 0;
[3658]45 uint_8 mzsz = nfibres*npaq*paqsz;
46 uint_8 procmzsz = nfibres*npaq*procpaqsz;
[3537]47
[3958]48 for(unsigned int k=0; k<NbZones(); k++) {
49 memzones.push_back(new Byte[mzsz] );
50 states.push_back(st);
[3979]51 auxdatap.push_back( new RAcqMZAuxData((size_t)NbFibres()) );
[3958]52 if (procmzsz > 0) procmemzones.push_back(new Byte[procmzsz] );
53 }
54 for(size_t k=0; k<NbFibres(); k++) fiber_id[k]=0;
[3909]55 dummy_=0;
[3626]56 serial_ = 0;
57 SetFinalizedMask();
[3683]58 SetProcSavedReadyMask();
[3537]59}
60
[3626]61/* --Methode-- */
[3537]62RAcqMemZoneMgr::~RAcqMemZoneMgr()
63{
[3658]64 for(uint_4 k=0; k<NbZones(); k++) {
65 delete[] memzones[k];
[3909]66 delete auxdatap[k];
[3658]67 if (procpaqsz > 0) delete[] procmemzones[k];
68 }
[3537]69}
70
[3626]71/* --Methode-- */
[3537]72int RAcqMemZoneMgr::FindMemZoneId(MemZaction act)
[3626]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
[3537]79{
80 int rid = -1;
81 if (stop_) return rid;
[3635]82 if ((act != MemZA_Fill) && (act != MemZA_Save) && (act != MemZA_Proc) &&
[3779]83 (act != MemZA_ProcA) && (act != MemZA_ProcB) && (act != MemZA_ProcC) &&
84 (act != MemZA_ProcD) && (act != MemZA_ProcE) && (act != MemZA_ProcF) &&
[3955]85 (act != MemZA_ProcG) && (act != MemZA_ProcH) && (act != MemZA_ProcI) &&
86 (act != MemZA_ProcJ) &&
[3779]87 (act != MemZA_SaveProc) ) return rid;
88
[3537]89 mex.lock();
[3626]90 uint_8 bestserial = serial_ + 5;
[3537]91 while ((rid < 0)&&(!stop_)) {
[3626]92 switch (act) {
[3623]93 case MemZA_Fill:
94 if (rid < 0) for(uint_4 k=0; k<NbZones(); k++) {
95 if ((states[k].act == MemZA_None) &&
[3640]96 ((states[k].stat == MemZS_Free)||((states[k].stat&mask_finalized_)==mask_finalized_) )) {
[3626]97 if (states[k].serial < bestserial) { rid=k; bestserial=states[k].serial; }
98 }
[3623]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++) {
[3626]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 }
[3623]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++) {
[3626]113 if ((states[k].act == MemZA_None) &&
[3671]114 (states[k].stat & MemZS_Saved) && !(states[k].stat & MemZS_Proc) ) {
[3626]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++) {
[3623]122 if ((states[k].act == MemZA_None) && (states[k].stat & MemZS_Filled) &&
[3626]123 !(states[k].stat & MemZS_ProcA) ) {
124 if (states[k].serial < bestserial) { rid=k; bestserial=states[k].serial; }
125 }
[3623]126 }
[3626]127 if (rid >= 0) states[rid].act = MemZA_ProcA;
[3623]128 break;
[3626]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;
[3683]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;
[3955]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;
[3683]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;
[3623]219 case MemZA_None: // MTQ pour supprimer un warning
220 break;
[3626]221 } // Fin de switch
[3623]222 if (rid < 0) mex.wait();
[3626]223 } // Fin de while
[3537]224 mex.unlock();
225 return rid;
226}
227
[3626]228/* --Methode-- */
[3537]229int RAcqMemZoneMgr::FreeMemZone(int id, MemZStatus st)
230{
[3623]231 if ((id < 0) || (id >= (int)states.size())) return 1;
[3537]232 int rc = 0;
233 mex.lock();
234 switch (st) {
[3626]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;
[3683]274 else states[id].nbact[5]++;
[3626]275 states[id].stat |= MemZS_ProcC;
276 states[id].act = MemZA_None;
277 break;
[3683]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;
[3955]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;
[3683]320 case MemZS_SavedProc :
[3955]321 if (states[id].act != MemZA_SaveProc) rc = 16384;
322 else states[id].nbact[13]++;
[3683]323 states[id].stat |= MemZS_ProcF;
324 states[id].act = MemZA_None;
325 break;
[3626]326 default :
[3683]327 rc = 65536;
[3626]328 states[id].serial = 0;
329 states[id].stat = MemZS_Free;
330 states[id].act = MemZA_None;
331 break;
332 } // Fin de switch
[3537]333 mex.unlock();
334 mex.broadcast();
335 return rc;
336}
337
[3913]338/* --Methode-- */
[3537]339ostream& RAcqMemZoneMgr::Print(ostream& os)
340{
341 os << "RAcqMemZoneMgr::Print() NbZones=" << NbZones() << " PaqSize()=" << PaqSize()
[3958]342 << " NbPaquets()=" << NbPaquets() << " NbFibres()=" << NbFibres() << " ZoneSize()="
343 << ZoneSize() << endl;
[3635]344 if (ProcPaqSize() > 0)
345 cout << " ... With Processed Data Zones ProcPaqSize()=" << ProcPaqSize()
346 << " ProcZoneSize()=" << ProcZoneSize() << endl;
347 else cout << " ... NO Processed Data Zones" << endl;
[3683]348 for(uint_4 k=0; k<states.size(); k++) {
[3537]349 os << " [" << k << "] Act=" << states[k].act << " Stat=" << states[k].stat
[3683]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 }
[3537]354 return os;
355}
356
[3913]357/* --Methode-- */
[3537]358void RAcqMemZoneMgr::Stop()
359{
[3623]360 // cout << "RAcqMemZoneMgr::Stop() ........ STOP BROADCAST" <<endl;
[3537]361 stop_ = true;
[3658]362 runstate_ = MemZR_Stopped;
[3537]363 mex.broadcast();
364}
[3913]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.