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

Last change on this file since 3623 was 3623, checked in by ansari, 16 years ago

Modifications et ameliorations diverses pour programme acquisition/traitement multifibres

Reza 22/05/2009

1- Extension/amelioration classe BRPaquet et BRPaqChecker
2- Correction BUG dans RAcqMemZoneMgr bloquant l'utilisation a une seule zone memoire
3- Classe PCIEWrapper devenue virtuelle pure et introduction de la classe TestPCIWrapperNODMA
pour les smulations.

File size: 3.7 KB
Line 
1#include "racqumem.h"
2
3//----------------------------------------------------------------
4// ---- classes de gestion memoire pour acquisition BAORadio -----
5// LAL - R. Ansari - Juin/Juillet 2008
6//----------------------------------------------------------------
7
8
9RAcqMemZoneMgr::RAcqMemZoneMgr(uint_4 nz, uint_4 np, uint_4 psz)
10 : mex(true), nzones(nz), npaq(np), paqsz(psz), stop_(false)
11{
12 St_MemZ st;
13
14 st.act = (uint_4)MemZA_None;
15 st.stat = (uint_8)MemZS_Free;
16 for(int k=0; k<3; k++) st.nbact[k] = 0;
17 uint_8 mzsz = npaq*paqsz;
18
19 for(int k=0; k<NbZones(); k++) {
20 memzones.push_back(new Byte[mzsz] );
21 states.push_back(st);
22 }
23
24}
25
26RAcqMemZoneMgr::~RAcqMemZoneMgr()
27{
28 for(uint_4 k=0; k<NbZones(); k++) delete[] memzones[k];
29}
30
31int RAcqMemZoneMgr::FindMemZoneId(MemZaction act)
32{
33 int rid = -1;
34 if (stop_) return rid;
35 if ((act != MemZA_Fill) && (act != MemZA_Save) && (act != MemZA_Proc)) return rid;
36 mex.lock();
37 while ((rid < 0)&&(!stop_)) {
38 switch (act)
39 {
40 case MemZA_Fill:
41 if (rid < 0) for(uint_4 k=0; k<NbZones(); k++) {
42 if ((states[k].act == MemZA_None) &&
43 ((states[k].stat == MemZS_Free)||(states[k].stat & MemZS_Saved)) )
44 { rid = k; break; }
45 }
46 if (rid >= 0) { states[rid].act = MemZA_Fill; states[rid].stat = MemZS_Free; }
47 break;
48 case MemZA_Save:
49 for(uint_4 k=0; k<NbZones(); k++) {
50 if ((states[k].act == MemZA_None) && (states[k].stat & MemZS_Filled) &&
51 !(states[k].stat & MemZS_Saved) ) { rid = k; break; }
52 }
53 if (rid >= 0) states[rid].act = MemZA_Save;
54 break;
55 case MemZA_Proc:
56 for(uint_4 k=0; k<NbZones(); k++) {
57 if ((states[k].act == MemZA_None) && (states[k].stat & MemZS_Filled) &&
58 !(states[k].stat & MemZS_Proc) ) { rid = k; break; }
59 }
60 if (rid >= 0) states[rid].act = MemZA_Proc;
61 break;
62 case MemZA_None: // MTQ pour supprimer un warning
63 break;
64 }
65 if (rid < 0) mex.wait();
66 }
67 mex.unlock();
68 return rid;
69}
70
71int RAcqMemZoneMgr::FreeMemZone(int id, MemZStatus st)
72{
73 if ((id < 0) || (id >= (int)states.size())) return 1;
74 int rc = 0;
75 mex.lock();
76 switch (st) {
77 case MemZS_Free :
78 states[id].stat = MemZS_Free;
79 states[id].act = MemZA_None;
80 break;
81 case MemZS_Filled :
82 if (states[id].act != MemZA_Fill) rc = 2;
83 else states[id].nbact[0]++;
84 states[id].stat |= MemZS_Filled;
85 states[id].act = MemZA_None;
86 break;
87 case MemZS_Saved :
88 if (states[id].act != MemZA_Save) rc = 4;
89 else states[id].nbact[1]++;
90 states[id].stat |= MemZS_Saved;
91 states[id].act = MemZA_None;
92 break;
93 case MemZS_Proc :
94 if (states[id].act != MemZA_Proc) rc = 8;
95 else states[id].nbact[2]++;
96 states[id].stat |= MemZS_Proc;
97 states[id].act = MemZA_None;
98 break;
99 default :
100 rc = 16;
101 states[id].stat = MemZS_Free;
102 states[id].act = MemZA_None;
103 break;
104 }
105 mex.unlock();
106 mex.broadcast();
107 return rc;
108}
109
110/* MIS en inline
111Byte* RAcqMemZoneMgr::GetMemZone(int id)
112{
113 if ((id < 0) || (id >= memzones.size())) return NULL;
114 return memzones[id];
115}
116*/
117ostream& RAcqMemZoneMgr::Print(ostream& os)
118{
119 os << "RAcqMemZoneMgr::Print() NbZones=" << NbZones() << " PaqSize()=" << PaqSize()
120 << " NbPaquets()=" << NbPaquets() << " ZoneSize()=" << ZoneSize() << endl;
121 for(uint_4 k=0; k<states.size(); k++)
122 os << " [" << k << "] Act=" << states[k].act << " Stat=" << states[k].stat
123 << " NbAct[0..2]=" << states[k].nbact[0] << "," << states[k].nbact[1]
124 << "," << states[k].nbact[2] << endl;
125 return os;
126}
127
128void RAcqMemZoneMgr::Stop()
129{
130 // cout << "RAcqMemZoneMgr::Stop() ........ STOP BROADCAST" <<endl;
131 stop_ = true;
132 mex.broadcast();
133}
Note: See TracBrowser for help on using the repository browser.