source: Sophya/branches/Reza/AddOn/TAcq/racqumem.cc@ 3670

Last change on this file since 3670 was 3537, checked in by ansari, 17 years ago

Ajout du module AddOn/TAcq (programmes test pour acquisition BAORadio) ds cvs sophya (sous-repertoire AddOn/) , Reza 22/10/2008

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