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

Last change on this file since 3593 was 3538, checked in by ansari, 17 years ago

This commit was generated by cvs2svn to compensate for changes in r3537,
which included commits to RCS files with non-trunk default branches.

File size: 3.6 KB
RevLine 
[3537]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.