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

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

Amelioration/ correction diverses, introduction du programme de lecture / traitement multi-thread mcrd.cc - Reza 26/05/2009

File size: 4.1 KB
RevLine 
[3537]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
[3626]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
[3537]10//----------------------------------------------------------------
11
12
13#include "machdefs.h"
14#include <string>
15#include <vector>
16#include <iostream>
17#include "sopnamsp.h"
18#include "zthread.h"
[3623]19// #include "dmamgrintf.h"
[3537]20#include "brtypes.h"
[3623]21#include "pciewrap.h"
[3537]22using namespace std;
23
24// Structure de gestion utilisee par la classe RAcqMemMgr
25typedef struct {
[3626]26 uint_8 serial; // Numero de serie permettant d'ordonner en temps les zones memoire rempli
27 uint_4 act; // Indique l'action en cours sur une zone Fill,Save ...
28 uint_4 stat; // Champ de flag (bits) indiquant les operations effectuees sur la zone
29 uint_4 nbact[6]; // compteurs nb de fois ou (fill,save,proc,procA/B/C) a ete effectuee sur la zone
30// int tid; Pas utilise pour le moment, permet l'identification du thread operant sur la zone
[3537]31} St_MemZ;
32
[3626]33// Les flags (bits) correspondant aux operations effectuees sur une zone
34// Free->libre, Filled->rempli(par DMA), Saved(ecrit sur disque), Proc(Traitement)
35// ProcA/B/C : Trois traitement qui doivent s'enchainer
36enum MemZStatus { MemZS_Free=0, MemZS_Filled=1, MemZS_Saved=2, MemZS_Proc=4,
37 MemZS_ProcA=8, MemZS_ProcB=16, MemZS_ProcC=32 };
38// L'action en cours sur une zone
39enum MemZaction { MemZA_None=0, MemZA_Fill=1, MemZA_Save=2, MemZA_Proc=4,
40 MemZA_ProcA=8, MemZA_ProcB=16, MemZA_ProcC=32 };
[3537]41
42// -------------------------------------------------------------------
[3626]43// Classe de gestion de zones memoire partagee (des buffers) entre
[3537]44// threads - qui doivent operer successivement sur les vecteurs
45// -------------------------------------------------------------------
46class RAcqMemZoneMgr {
47public:
[3626]48// Constructeur, nz=Nb de zones, np=Nb de paquets/zone , psz=taille de paquet
[3635]49// Si procpsz>0 , on alloue aussi des zones memoire pour donnees traitees
50// dans ce cas, procpsz à la taille memoire des donnees traites pour chaque paquet
51 RAcqMemZoneMgr(uint_4 nz, uint_4 np=256, uint_4 psz=4096, uint_4 procpsz=0);
[3537]52 ~RAcqMemZoneMgr();
53
54 // Retourne le nombre de zones memoire
55 inline uint_4 NbZones() { return nzones; }
56 // Retourne la taille de paquet
57 inline uint_4 PaqSize() { return paqsz; }
58 // Retourne le nb de paquets dans une zone
59 inline uint_4 NbPaquets() { return npaq; }
60 // Retourne la taille totale d'une zone
61 inline uint_4 ZoneSize() { return npaq*paqsz; }
[3635]62
63 // Retourne la taille de la zone memoire correspondant aux donnees traitees d'un paquet
64 inline uint_4 ProcPaqSize() { return procpaqsz; }
65 // Retourne la taille totale d'une zone de donnees traitees
66 inline uint_4 ProcZoneSize() { return npaq*procpaqsz; }
[3537]67
[3626]68 // Definit l'etat des operations obligatoires avant qu'une zone
69 // remplie ne puisse etre recyclee (re-remplie)
[3629]70 inline void SetFinalizedMask(uint_4 mask=((uint_4)MemZS_Saved))
[3626]71 { mask_finalized_ = mask; }
72 inline uint_4 GetFinalizedMask() { return mask_finalized_; }
[3623]73
[3537]74 // Retourne un MemZone disponible pour une action specifique
75 int FindMemZoneId(MemZaction act);
76 // Libere une zone memoire en marquant son etat
77 int FreeMemZone(int id, MemZStatus st);
78 // Retourne le pointeur de la zone numero k
79 inline Byte* GetMemZone(int id) {
[3623]80 if ((id < 0) || (id >=(int) memzones.size())) return NULL;
[3537]81 return memzones[id];
82 }
[3635]83 inline Byte* GetProcMemZone(int id) {
84 if ((id < 0) || (id >=(int) procmemzones.size())) return NULL;
85 return procmemzones[id];
86 }
[3537]87
88 ostream& Print(ostream& os);
89 void Stop();
90
91protected:
92 // ... variables membres
93 ZMutex mex;
[3635]94 uint_4 nzones, npaq, paqsz, procpaqsz;
[3623]95// DMAMgrInterface &dma_;
[3537]96 vector< Byte* > memzones;
97 vector< St_MemZ > states;
[3635]98 vector< Byte* > procmemzones;
[3537]99 bool stop_;
[3626]100 uint_4 mask_finalized_;
101 uint_8 serial_;
[3537]102};
103
104
105
106
107#endif
Note: See TracBrowser for help on using the repository browser.