source: Sophya/trunk/AddOn/TAcq/racqumem.h@ 3968

Last change on this file since 3968 was 3955, checked in by ansari, 15 years ago

Ajout des actions de traitemnt ProcG,ProcH,ProcI,ProcJ ds le gestionnaire memoire RAcqMemZoneMgr et adaptation de BRBaseProcessor, Reza 02/03/2011

File size: 8.4 KB
Line 
1#ifndef RACQUMEM_H_SEEN
2#define RACQUMEM_H_SEEN
3
4//----------------------------------------------------------------
5// ---- classes de gestion memoire pour acquisition BAORadio -----
6// LAL - R. Ansari - Juin/Juillet 2008
7// Modifs Mai 2009
8// - Introduction du numero d'ordre de remplissage
9// - Introduction de mask de recyclage et sequence de traitement procA/B/C
10//----------------------------------------------------------------
11
12
13#include "zthread.h"
14#include <string>
15#include <vector>
16#include <iostream>
17#include "brtypes.h"
18#include "timestamp.h"
19
20using namespace std;
21
22//-----------------------------------------------------------------------
23// Projet BAORadio - (C) LAL/IRFU 2008-2010
24// Structures de gestion memoire et synchronisation inter-threads
25//-----------------------------------------------------------------------
26
27// Les flags (bits) correspondant aux operations effectuees sur une zone
28// + Free : libre,
29// + Filled : rempli (par DMA ou lecture fits)
30// + Saved : ecrit sur disque
31// + Proc : traite (utilise principalement pour le monitoring durant l'acquisition)
32// + ProcA/B/C/D/E/F : Un maximum de SIX traitements qui peuvent s'enchainer
33// + ProcSaved : ecrit sur disque apres traitement
34
35enum MemZStatus { MemZS_Free=0, MemZS_Filled=1, MemZS_Saved=2, MemZS_Proc=4,
36 MemZS_ProcA=8, MemZS_ProcB=16, MemZS_ProcC=32,
37 MemZS_ProcD=64, MemZS_ProcE=128, MemZS_ProcF=256,
38 MemZS_ProcG=512, MemZS_ProcH=1024, MemZS_ProcI=2048, MemZS_ProcJ=4096,
39 MemZS_SavedProc=16384 };
40
41// L'action en cours sur une zone (associe aux flags MemZStatus ci-dessus)
42enum MemZaction { MemZA_None=0, MemZA_Fill=1, MemZA_Save=2, MemZA_Proc=4,
43 MemZA_ProcA=8, MemZA_ProcB=16, MemZA_ProcC=32,
44 MemZA_ProcD=64, MemZA_ProcE=128, MemZA_ProcF=256,
45 MemZA_ProcG=512, MemZA_ProcH=1024, MemZA_ProcI=2048, MemZA_ProcJ=4096,
46 MemZA_SaveProc=16384 };
47
48// configuration du RAcqMemZoneMgr
49enum MemZconfig { MemZConf_SingleFiberDataOnly=0, MemZConf_MultiFiberDataOnly=1,
50 MemZConf_SingleFiberProcDataOnly=2, MemZConf_MultiFiberProcDataOnly=3,
51 MemZConf_SingleFiberDataAndProcData=4, MemZConf_MultiFiberDataAndProcData=5 };
52// L'etat d'execution en cours : running, waiting, stopped
53enum MemZRunState { MemZR_Running=0, MemZR_Waiting=1, MemZR_Stopped=2};
54
55
56// --------------------------------------------------------------------
57// Structure de gestion utilisee par la classe RAcqMemMgr
58#define MXNACTMZM 14
59typedef struct {
60 uint_8 serial; // Numero de serie permettant d'ordonner en temps les zones memoire rempli
61 uint_4 act; // Indique l'action en cours sur une zone Fill,Save ...
62 uint_4 stat; // Champ de flag (bits) indiquant les operations effectuees sur la zone
63 uint_4 nbact[MXNACTMZM]; // compteurs nb de fois ou (fill,save,proc,procA/B/C) a ete effectuee sur la zone
64// int tid; Pas utilise pour le moment, permet l'identification du thread operant sur la zone
65} St_MemZ;
66
67
68// ---------------------------------------------------------
69// Classe pour donnees auxiliaires associees a chaque zone
70// ---------------------------------------------------------
71class RAcqMZAuxData {
72public:
73 RAcqMZAuxData() { }
74 inline SOPHYA::TimeStamp& FillTime() { return filltime_; }
75
76 SOPHYA::TimeStamp filltime_;
77};
78
79// -------------------------------------------------------------------
80// Classe de gestion de zones memoire partagee (des buffers) entre
81// threads - qui doivent operer successivement sur les vecteurs
82// -------------------------------------------------------------------
83class RAcqMemZoneMgr {
84public:
85// Constructeur, nz=Nb de zones, np=Nb de paquets/zone , psz=taille de paquet
86// Si procpsz>0 , on alloue aussi des zones memoire pour donnees traitees
87// dans ce cas, procpsz à la taille memoire des donnees traites pour chaque paquet
88// Constructeur 1 : l'objet ne contient que les donnees d'une fibre
89// garde pour maintenir la compatibilite avec version TAcq v <= 6.0
90 RAcqMemZoneMgr(uint_4 nz, uint_4 np, uint_4 psz);
91// Constructeur 2 : l'objet peut contenir plusieurs fibres, et des donnees processes en plus
92 RAcqMemZoneMgr(uint_4 nzon, uint_4 nfib, uint_4 npaq, uint_4 paqsz, uint_4 procsz=0);
93
94 ~RAcqMemZoneMgr();
95
96 // Retourne le nombre de zones memoire
97 inline uint_4 NbZones() { return nzones; }
98 // Retourne le nombre de fibres dans chaque zone
99 inline uint_4 NbFibres() { return nfibres; }
100 // Retourne la taille de paquet
101 inline uint_4 PaqSize() { return paqsz; }
102 // Retourne le nb de paquets dans une zone
103 inline uint_4 NbPaquets() { return npaq; }
104 // Retourne la taille totale d'une zone
105 inline uint_4 ZoneSize() { return nfibres*npaq*paqsz; }
106 inline uint_4 OneFiberZoneSize() { return npaq*paqsz; }
107
108 // Retourne la taille de la zone memoire correspondant aux donnees traitees d'un paquet
109 inline uint_4 ProcPaqSize() { return procpaqsz; }
110 // Retourne la taille totale d'une zone de donnees traitees
111 inline uint_4 ProcZoneSize() { return nfibres*npaq*procpaqsz; }
112 inline uint_4 OneFiberProcZoneSize() { return npaq*procpaqsz; }
113
114 // Definit l'etat des operations obligatoires avant qu'une zone
115 // remplie ne puisse etre recyclee (re-remplie)
116 inline void SetFinalizedMask(uint_4 mask=((uint_4)MemZS_Saved))
117 { mask_finalized_ = mask; }
118 inline uint_4 GetFinalizedMask() { return mask_finalized_; }
119
120 // Definit l'etat des operations obligatoires avant qu'une zone
121 // ne puissent etre sauvee apres traitement (subir l'action ProcSaved)
122 inline void SetProcSavedReadyMask(uint_4 mask=((uint_4)MemZS_ProcA))
123 { mask_saveproc_ready_ = mask; }
124 inline uint_4 GetProcSavedReadyMask() { return mask_saveproc_ready_; }
125
126 // Retourne l'identificateur d'une zone memoire disponible pour une action specifique
127 int FindMemZoneId(MemZaction act);
128 // Libere une zone memoire en marquant son etat
129 int FreeMemZone(int id, MemZStatus st);
130
131 // Retourne le pointeur de la zone numero k pour les datas pour une fibre donnee
132 inline Byte* GetMemZone(int id, int fib) {
133 if ((id < 0) || (id >=(int) memzones.size())) return NULL;
134 if ((fib < 0) || (fib >=(int) nfibres)) return NULL;
135 return memzones[id]+fib*OneFiberZoneSize();
136 }
137 // Retourne le pointeur de la zone numero k pour les resultats de traitement pour une fibre donnee
138 inline Byte* GetProcMemZone(int id, int fib) {
139 if ((id < 0) || (id >=(int) procmemzones.size())) return NULL;
140 return procmemzones[id]+fib*OneFiberProcZoneSize();
141 }
142 // Retourne le pointeur de la zone numero k pour les datas
143 inline Byte* GetMemZone(int id) {
144 if ((id < 0) || (id >=(int) memzones.size())) return NULL;
145 return memzones[id];
146 }
147 // Retourne le pointeur de la zone numero k pour les resultats de traitement
148 inline Byte* GetProcMemZone(int id) {
149 if ((id < 0) || (id >=(int) procmemzones.size())) return NULL;
150 return procmemzones[id];
151 }
152 // Retourne le pointeur sur les donnees auxiliaire associee a une zone
153 inline RAcqMZAuxData* GetAuxData(int id) {
154 if ((id < 0) || (id >=(int) auxdatap.size())) return NULL;
155 return auxdatap[id];
156 }
157 // Retourne l'identificateur (numero absolu) de la fibre
158 inline int& FiberId(int fib) {
159 if ((fib < 0) || (fib >=(int) nfibres)) return dummy_;
160 return fiber_id[fib];
161 }
162
163 ostream& Print(ostream& os);
164 inline ostream& Print() { return Print(cout); }
165
166 // Pour controler l'etat d'execution global
167 void Stop();
168 inline MemZRunState GetRunState()
169 { return runstate_; }
170 inline MemZRunState ChangeRunState( MemZRunState st)
171 { runstate_ = st; return runstate_; }
172
173 // Conversion Status -> action
174 static MemZaction Convert_Status2Action(MemZStatus st);
175
176protected:
177 void Init(); // Fait l'allocation des differents buffers - est appele par les constructeurs
178
179 // ... variables membres
180 SOPHYA::ZMutex mex;
181 uint_4 nzones, nfibres, npaq, paqsz, procpaqsz;
182 vector< Byte* > memzones; // pointeur de donnees de chaque zone
183 vector< St_MemZ > states; // etat de chaque zone
184 vector< RAcqMZAuxData* > auxdatap; // pointeur de donnees auxiliaires associees a chaque zone
185 vector< Byte* > procmemzones; // pointeur de donnees traitees de chaque zone
186// Identificateur (numero absolu) des fibres
187 vector< int > fiber_id;
188 int dummy_;
189 bool stop_;
190 MemZRunState runstate_;
191 uint_4 mask_finalized_;
192 uint_4 mask_saveproc_ready_;
193 uint_8 serial_;
194};
195
196
197
198
199#endif
Note: See TracBrowser for help on using the repository browser.