source: Sophya/trunk/AddOn/TAcq/racqueth.h@ 3901

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

Suite recherche de probleme de blocage avec transfert sur ethernet ds mfacq.cc (EthernetReader...), Reza 07/10/2010

File size: 6.7 KB
Line 
1#ifndef RACQUETH_H_SEEN
2#define RACQUETH_H_SEEN
3
4//----------------------------------------------------------------
5// ---- classes de threads pour lecture/ecriture des paquets (transfert DMA)
6// et ecriture disque pour acquisition BAORadio -----
7// LAL - R. Ansari - Juin/Juillet 2008
8//----------------------------------------------------------------
9
10#include "racqumem.h"
11#include <string>
12#include <vector>
13#include <iostream>
14#include "sopnamsp.h"
15#include "zthread.h"
16#include "pciewrap.h"
17#include "swrapsock.h"
18#include "brtypes.h"
19#include "brpaqu.h"
20#include "brparam.h"
21#include "minifits.h"
22
23using namespace std;
24
25// Quelques definitions globales
26// Nombre maximum de fibres geres par les classes PCIEToEthernet ...
27// ATTENTION cette definition (MAXANAFIB) se trouve dans plusieurs fichiers
28#ifndef MAXNBFIB
29#define MAXNBFIB 32
30#endif
31// ATTENTION cette definition (MAXANAFIB) se trouve dans plusieurs fichiers
32#ifndef MAXANAFIB
33#define MAXANAFIB 32
34#endif
35
36#ifndef BRSPORTID
37#define BRSPORTID 6912
38#endif
39#ifndef BRTCPMSGLEN
40#define BRTCPMSGLEN 128
41#endif
42#ifndef BRTCPMSGLEN2
43#define BRTCPMSGLEN2 64
44#endif
45
46
47//----------------------------------------------------------------------------------
48// Classe thread de lecture PCI-Express et recopie sur interface reseau (Ethernet)
49//----------------------------------------------------------------------------------
50
51class PCIEToEthernet : public ZThread {
52public:
53 PCIEToEthernet(vector<PCIEWrapperInterface*> vec_pciw , vector<string>& destname, BRParList const& par, int portid=BRSPORTID);
54 virtual ~PCIEToEthernet();
55 virtual void run();
56 void Stop();
57 inline void STOP() { stop_ = true; }
58
59 inline int SetPrintLevel(int lev=0, uint_8 prtmodulo=50000)
60 { prtlev_=lev; prtmodulo_=prtmodulo; return 0; }
61
62protected:
63 virtual size_t SendToTargets(int fib, Byte* data, size_t len);
64
65 BRParList par_; // Parametres divers d'acquisition
66
67 uint_8 nmaxpaq_; // Nombre maxi de paquets traites - DOIT etre mutiple de mmgr.NbPaquets()
68 BRDataFmtConv swapall_; // select data swap/format conversion for BRPaquet
69 bool stop_;
70 unsigned int sizeFr_ ;
71 vector<PCIEWrapperInterface *> vec_pciw_;
72 vector<string> destname_;
73 int tcpportid_;
74 vector< vector<ClientSocket> > vvec_skt_;
75 vector< vector<uint_8> > vvec_errorcnt_;
76 vector< uint_8 > vec_cntpaq_;
77 uint_4 packSize_;
78 uint_4 packSizeInMgr_;
79 uint_4 nbDma_;
80 uint_8 totrdsnd_;
81 bool fgdirectsend_; // true -> direct transfer of DMA data to ethernet
82
83 int prtlev_; // print level
84 uint_8 prtmodulo_; // print periodicity (modulo)
85};
86
87//------------------------------------------------------------------
88// Classe thread de lecture sur interface reseau (Ethernet)
89//------------------------------------------------------------------
90class EthernetReader : public ZThread {
91public:
92 EthernetReader(RAcqMemZoneMgr& mem, BRParList const& par, int portid=BRSPORTID);
93 virtual ~EthernetReader();
94
95 // Configuration du mode de lecture des paquets
96 // Si force_samefc=true, on essaye de lire des paquets avec meme FrameCounter, sans depasser une
97 // difference maximum de maxdiff_paqnum entre nombre de paquets lus sur chaque fibre
98 inline void SetReadMode(bool force_samefc=false, uint_4 maxdiff_paqnum=0, uint_4 maxresync=0)
99 { rdsamefc_=force_samefc; sfc_maxdpc_=maxdiff_paqnum; sfc_maxresync_=maxresync; }
100 // En activant le flag, le reader ne se termine qu'avec la reception des message END sur chaque lien
101 inline void WaitENDMsg4Terminate(bool waitendmsg=false)
102 { waitendmsg_=waitendmsg; }
103
104 virtual void run();
105 inline void Stop() { stop_ = true; }
106 inline void STOP() { stop_ = true; }
107
108 inline int SetPrintLevel(int lev=0, uint_8 prtmodulo=50000)
109 { prtlev_=lev; prtmodulo_=prtmodulo; return 0; }
110
111protected:
112 bool ReadNextAllFibers(); // Renvoie true si probleme
113 bool ReadNext(int fib); // Renvoie true si probleme
114 void CleanUpAllSockets(); // pour finir la lecture de toutes les fibres
115 size_t ReceiveFromSocket(int fib, char* data, size_t len);
116
117 bool ReadNextAllFibersWithSync(); // Renvoie true si probleme
118// recale les links en cas d'ecart important entre nb de paquets lu sur chaque lien
119 int SkipAndSyncLinks(); // Renvoie 0 si rien fait, 1 si skip fait, 9 si probleme
120
121 // Permet d'avancer d'un paquet dans la zone - renvoie true si probleme
122 inline bool MoveToNextTarget() {
123 if ((mmbuf_ == NULL )||(targ_npaq_ >= max_targ_npaq))
124 if (MZoneManage()) return true;
125 targ_npaq_++;
126 return false;
127 }
128 inline Byte* GetPaquetTarget(int numfib) {
129 if ((mmbufib_[numfib] == NULL )||(targ_npaq_ > max_targ_npaq)||(targ_npaq_ == 0)) return NULL;
130 Byte* rb=mmbufib_[numfib]+(targ_npaq_-1)*packsize_;
131 return rb;
132 }
133 bool MZoneManage(bool clean=false); // Renvoie true si probleme
134
135 RAcqMemZoneMgr& memgr_;
136 BRParList par_; // Parametres divers d'acquisition
137 int tcpportid_;
138 ServerSocket* srv_sokp_; // Le socket serveur
139 vector< Socket > vsok_; // Les sockets de lecture pour chaque lien ethernet (1 lien= 1 fibre a l'envoi)
140 vector< uint_8 > vec_cntpaq_; // vecteur de compteurs de paquet ( 1 compteur / lien )
141 vector< uint_4 > vec_fgsokend_; // vecteur de flag, >0 : fin de reception (ou ereur) sur le lien
142 bool gl_fgsokend; // true -> au moins l'un de liens a termine
143 bool stop_;
144 bool rdsamefc_; // if true, read paquets with same value of FrameCounter on different fibers/link
145 uint_4 sfc_maxdpc_; // difference maxi entre nombre de paquets lu sur les liens
146 uint_4 sfc_maxresync_; // nb maximum de tentatives de resynchronisation
147
148 uint_8 totnbytesrd_;
149 uint_8 totnpaqrd_;
150 uint_8 totsamefc_; // nombre total de paquets avec meme framecounter
151
152 uint_8 totnbresync_; // nombre total de saut+resynchronisation
153
154 vector<BRPaquet> vpaq_;
155 vector<BRPaqChecker> vpchk_;
156 vector<uint_8> curfc_; // Numeros des FrameCounter des paquets courants
157 vector<uint_8> totnpqrd_; // nombre total de paquets lus / lien
158 vector<uint_8> totnpqok_; // nombre total de paquets OK / lien
159
160 uint_4 packsize_;
161 int mid_; // Identificateur zone memoire
162 uint_4 targ_npaq_; // Numero de paquet dans une seule zone memoire
163 uint_4 max_targ_npaq; // = mmgr.NbPaquets() = Max de targ_npaq_
164 Byte* mmbuf_; // Pointeur zone memoire rendu par RAcqMemZoneMgr
165 Byte* mmbufib_[MAXANAFIB]; // Pointeurs zone memoire de chaque fibre rendu par RAcqMemZoneMgr
166
167 // zone tampon contenant zero si lecture sur fibre est fini
168 char* dummybuff_;
169 string stopreason_; // message descriptif de la raison d'arret
170
171 bool waitendmsg_; // si true, attendre le message END message sur chaque lien avant de s'arreter
172
173 int prtlev_; // print level
174 uint_8 prtmodulo_; // print periodicity (modulo)
175};
176
177
178
179#endif
Note: See TracBrowser for help on using the repository browser.