5 #define TAILLE_SPLIT 100000
8 template<class T,class TCorba,class TSeqCorba,class CorbaSender,class servForT,class ptrForT>
9 CorbaNCNoCopyReceiver<T,TCorba,TSeqCorba,CorbaSender,servForT,ptrForT>::CorbaNCNoCopyReceiver(CorbaSender mySender):_mySender(mySender){
12 template<class T,class TCorba,class TSeqCorba,class CorbaSender,class servForT,class ptrForT>
13 CorbaNCNoCopyReceiver<T,TCorba,TSeqCorba,CorbaSender,servForT,ptrForT>::~CorbaNCNoCopyReceiver(){
17 template<class T,class TCorba,class TSeqCorba,class CorbaSender,class servForT,class ptrForT>
18 T *CorbaNCNoCopyReceiver<T,TCorba,TSeqCorba,CorbaSender,servForT,ptrForT>::getDistValue(long &size)
20 TSeqCorba seq=_mySender->send();
22 return (T *)seq->get_buffer(1);
25 template<class T,class TCorba,class TSeqCorba,class CorbaSender,class servForT,class ptrForT>
26 T *CorbaNCNoCopyReceiver<T,TCorba,TSeqCorba,CorbaSender,servForT,ptrForT>::getValue(long &size)
28 return Receiver<T,servForT,ptrForT>::getValue(size,_mySender);
31 template<class T,class TCorba,class TSeqCorba,class CorbaSender,class servForT,class ptrForT>
32 CorbaNCWithCopyReceiver<T,TCorba,TSeqCorba,CorbaSender,servForT,ptrForT>::CorbaNCWithCopyReceiver(CorbaSender mySender):_mySender(mySender){
35 template<class T,class TCorba,class TSeqCorba,class CorbaSender,class servForT,class ptrForT>
36 CorbaNCWithCopyReceiver<T,TCorba,TSeqCorba,CorbaSender,servForT,ptrForT>::~CorbaNCWithCopyReceiver(){
40 template<class T,class TCorba,class TSeqCorba,class CorbaSender,class servForT,class ptrForT>
41 T *CorbaNCWithCopyReceiver<T,TCorba,TSeqCorba,CorbaSender,servForT,ptrForT>::getDistValue(long &size){
42 size=_mySender->getSize();
46 for(long i=0;i<size;i+=TAILLE_SPLIT)
48 if(size-i>TAILLE_SPLIT)
52 TSeqCorba seq=_mySender->sendPart(i,n);
53 T *seqd=(T *)seq->get_buffer(0);
60 template<class T,class TCorba,class TSeqCorba,class CorbaSender,class servForT,class ptrForT>
61 T *CorbaNCWithCopyReceiver<T,TCorba,TSeqCorba,CorbaSender,servForT,ptrForT>::getValue(long &size)
63 return Receiver<T,servForT,ptrForT>::getValue(size,_mySender);
66 template<class T,class TCorba,class TSeqCorba,class CorbaSender,class servForT,class ptrForT>
67 CorbaWCNoCopyReceiver<T,TCorba,TSeqCorba,CorbaSender,servForT,ptrForT>::CorbaWCNoCopyReceiver(CorbaSender mySender):_mySender(mySender){
70 template<class T,class TCorba,class TSeqCorba,class CorbaSender,class servForT,class ptrForT>
71 CorbaWCNoCopyReceiver<T,TCorba,TSeqCorba,CorbaSender,servForT,ptrForT>::~CorbaWCNoCopyReceiver(){
75 template<class T,class TCorba,class TSeqCorba,class CorbaSender,class servForT,class ptrForT>
76 T *CorbaWCNoCopyReceiver<T,TCorba,TSeqCorba,CorbaSender,servForT,ptrForT>::getDistValue(long &size){
77 size=_mySender->getSize();
81 for(long i=0;i<size;i+=TAILLE_SPLIT)
83 if(size-i>TAILLE_SPLIT)
87 TSeqCorba seq=_mySender->sendPart(i,n);
88 TCorba *seqd=seq->get_buffer(0);
95 template<class T,class TCorba,class TSeqCorba,class CorbaSender,class servForT,class ptrForT>
96 T *CorbaWCNoCopyReceiver<T,TCorba,TSeqCorba,CorbaSender,servForT,ptrForT>::getValue(long &size)
98 return Receiver<T,servForT,ptrForT>::getValue(size,_mySender);
101 template<class T,class TCorba,class TSeqCorba,class CorbaSender,class servForT,class ptrForT>
102 CorbaWCWithCopyReceiver<T,TCorba,TSeqCorba,CorbaSender,servForT,ptrForT>::CorbaWCWithCopyReceiver(CorbaSender mySender):_mySender(mySender){
105 template<class T,class TCorba,class TSeqCorba,class CorbaSender,class servForT,class ptrForT>
106 CorbaWCWithCopyReceiver<T,TCorba,TSeqCorba,CorbaSender,servForT,ptrForT>::~CorbaWCWithCopyReceiver(){
107 _mySender->release();
110 template<class T,class TCorba,class TSeqCorba,class CorbaSender,class servForT,class ptrForT>
111 T *CorbaWCWithCopyReceiver<T,TCorba,TSeqCorba,CorbaSender,servForT,ptrForT>::getDistValue(long &size){
112 size=_mySender->getSize();
116 for(long i=0;i<size;i+=TAILLE_SPLIT)
118 if(size-i>TAILLE_SPLIT)
122 TSeqCorba seq=_mySender->sendPart(i,n);
123 TCorba *seqd=seq->get_buffer(0);
124 for(long j=0;j<n;j++)
130 template<class T,class TCorba,class TSeqCorba,class CorbaSender,class servForT,class ptrForT>
131 T *CorbaWCWithCopyReceiver<T,TCorba,TSeqCorba,CorbaSender,servForT,ptrForT>::getValue(long &size)
133 return Receiver<T,servForT,ptrForT>::getValue(size,_mySender);
138 template<class T,MPI_Datatype T2,class CorbaSender,class servForT,class ptrForT>
139 MPIReceiver<T,T2,CorbaSender,servForT,ptrForT>::MPIReceiver(CorbaSender mySender):_mySender(mySender){
142 template<class T,MPI_Datatype T2,class CorbaSender,class servForT,class ptrForT>
143 MPIReceiver<T,T2,CorbaSender,servForT,ptrForT>::~MPIReceiver(){
144 _mySender->release();
147 template<class T,MPI_Datatype T2,class CorbaSender,class servForT,class ptrForT>
148 T *MPIReceiver<T,T2,CorbaSender,servForT,ptrForT>::getDistValue(long &size){
154 char port_name_clt [MPI_MAX_PORT_NAME];
155 float telps, tuser, tsys, tcpu;
161 MPI_Comm_rank(MPI_COMM_WORLD, &myproc);
162 SALOME::MPISender::param_var p =_mySender->getParam();
165 MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_RETURN);
166 while ( i != TIMEOUT && MPI_Lookup_name((char*)p->service,MPI_INFO_NULL,port_name_clt) != MPI_SUCCESS) {
169 MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_ARE_FATAL);
170 if ( i == TIMEOUT ) {
175 // Connect to service, get the inter-communicator server
176 // Attention MPI_Comm_connect est un appel collectif :
177 // - Si lancement mpirun -c n -----> uniquement MPI_COMM_SELF fonctionne
178 // - Si lancement client_server&client_server ----> MPI_COMM_WORLD fonctionne
180 // TIMEOUT is inefficient since MPI_Comm_Connect doesn't return if we asked for
181 // a service that has been unpublished !
182 MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_RETURN);
184 while ( i != TIMEOUT && MPI_Comm_connect(port_name_clt, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &com)!=MPI_SUCCESS ) {
187 MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_ARE_FATAL);
188 if ( i == TIMEOUT ) {
193 MPI_Recv( &_n, 1, MPI_LONG, sproc,p->tag1,com,&status);
195 MPI_Recv( _v, _n, T2, sproc,p->tag2,com,&status);
197 MPI_Comm_disconnect( &com );
202 template<class T,MPI_Datatype T2,class CorbaSender,class servForT,class ptrForT>
203 T *MPIReceiver<T,T2,CorbaSender,servForT,ptrForT>::getValue(long &size)
205 return Receiver<T,servForT,ptrForT>::getValue(size,_mySender);
211 #include <sys/types.h>
212 #include <sys/socket.h>
213 #include <netinet/in.h>
214 #include <arpa/inet.h>
219 template<class T,int (*myFunc)(XDR*,T*),class CorbaSender,class servForT,class ptrForT>
220 SocketReceiver<T,myFunc,CorbaSender,servForT,ptrForT>::SocketReceiver(CorbaSender mySender) : _mySender(mySender)
226 template<class T,int (*myFunc)(XDR*,T*),class CorbaSender,class servForT,class ptrForT>
227 SocketReceiver<T,myFunc,CorbaSender,servForT,ptrForT>::~SocketReceiver()
231 _mySender->release();
235 template<class T,int (*myFunc)(XDR*,T*),class CorbaSender,class servForT,class ptrForT>
236 T *SocketReceiver<T,myFunc,CorbaSender,servForT,ptrForT>::getValue(long &size)
238 return Receiver<T,servForT,ptrForT>::getValue(size,_mySender);
241 template<class T,int (*myFunc)(XDR*,T*),class CorbaSender,class servForT,class ptrForT>
242 T* SocketReceiver<T,myFunc,CorbaSender,servForT,ptrForT>::getDistValue(long &size)
246 XDR xp; /* pointeur sur le decodeur XDR */
251 SALOME::SocketSender::param_var p = _mySender->getParam();
253 size = p->lend - p->lstart + 1;
256 connectCom(p->internet_address, p->myport);
260 xdrmem_create(&xp,(char*)v,size*sizeof(T),XDR_DECODE );
261 while( n < size*sizeof(T) ){
262 m = read(_clientSockfd, (char*)v+n, size*sizeof(T)-n);
266 SALOME::ExceptionStruct es;
267 es.type = SALOME::COMM;
268 es.text = "error read Socket exception";
269 throw SALOME::SALOME_Exception(es);
273 xdr_vector( &xp, (char*)v, size, sizeof(T), (xdrproc_t)myFunc);
276 _mySender->endOfCom();
279 catch(SALOME::SALOME_Exception &ex){
280 if( ex.details.type == SALOME::COMM )
282 _senderDestruc=false;
283 cout << ex.details.text << endl;
284 throw MultiCommException("Unknown sender protocol");
293 template<class T,int (*myFunc)(XDR*,T*),class CorbaSender,class servForT,class ptrForT>
294 void SocketReceiver<T,myFunc,CorbaSender,servForT,ptrForT>::initCom()
297 _mySender->initCom();
299 /* Ouverture de la socket */
300 _clientSockfd = socket(AF_INET, SOCK_STREAM, 0);
301 if (_clientSockfd < 0) {
303 SALOME::ExceptionStruct es;
304 es.type = SALOME::COMM;
305 es.text = "error Socket exception";
306 throw SALOME::SALOME_Exception(es);
309 catch(SALOME::SALOME_Exception &ex){
310 if( ex.details.type == SALOME::COMM )
312 _senderDestruc=false;
313 cout << ex.details.text << endl;
314 throw MultiCommException("Unknown sender protocol");
322 template<class T,int (*myFunc)(XDR*,T*),class CorbaSender,class servForT,class ptrForT>
323 void SocketReceiver<T,myFunc,CorbaSender,servForT,ptrForT>::connectCom(const char *dest_address, int port)
325 struct sockaddr_in serv_addr;
326 struct hostent * server;
327 SALOME::ExceptionStruct es;
330 /* reception of the host structure on the remote process */
331 server = gethostbyname(dest_address);
332 if( server == NULL ) {
334 es.type = SALOME::COMM;
335 es.text = "error unknown host Socket exception";
336 _senderDestruc=false;
337 throw SALOME::SALOME_Exception(es);
340 /* Initialisation of the socket structure */
341 bzero((char*)&serv_addr,sizeof(serv_addr));
342 serv_addr.sin_family = AF_INET;
343 serv_addr.sin_addr.s_addr = INADDR_ANY;
344 bcopy((char *)server->h_addr,
345 (char *)&serv_addr.sin_addr.s_addr,
347 serv_addr.sin_port = htons(port);
349 if( connect(_clientSockfd, (struct sockaddr *) & serv_addr, sizeof(struct sockaddr)) < 0 ){
351 es.type = SALOME::COMM;
352 es.text = "error connect Socket exception";
353 _senderDestruc=false;
354 throw SALOME::SALOME_Exception(es);
357 _mySender->acceptCom();
360 catch(SALOME::SALOME_Exception &ex){
361 if( ex.details.type == SALOME::COMM )
363 _senderDestruc=false;
364 cout << ex.details.text << endl;
365 throw MultiCommException("Unknown sender protocol");
374 template<class T,int (*myFunc)(XDR*,T*),class CorbaSender,class servForT,class ptrForT>
375 void SocketReceiver<T,myFunc,CorbaSender,servForT,ptrForT>::closeCom()
377 _mySender->closeCom();
378 if( _clientSockfd >= 0 ){
379 close(_clientSockfd);