5 #define TAILLE_SPLIT 100000
8 template<class T,class TCorba,class TSeqCorba,class CorbaSender>
9 CorbaNCNoCopyReceiver<T,TCorba,TSeqCorba,CorbaSender>::CorbaNCNoCopyReceiver(CorbaSender mySender):_mySender(mySender){
12 template<class T,class TCorba,class TSeqCorba,class CorbaSender>
13 CorbaNCNoCopyReceiver<T,TCorba,TSeqCorba,CorbaSender>::~CorbaNCNoCopyReceiver(){
15 CORBA::release(_mySender);
18 template<class T,class TCorba,class TSeqCorba,class CorbaSender>
19 void *CorbaNCNoCopyReceiver<T,TCorba,TSeqCorba,CorbaSender>::getDistValue(long &size)
21 TSeqCorba seq=_mySender->send();
23 return seq->get_buffer(1);
26 template<class T,class TCorba,class TSeqCorba,class CorbaSender>
27 void *CorbaNCNoCopyReceiver<T,TCorba,TSeqCorba,CorbaSender>::getValue(long &size)
29 return Receiver::getValue(size,_mySender);
32 template<class T,class TCorba,class TSeqCorba,class CorbaSender>
33 CorbaNCWithCopyReceiver<T,TCorba,TSeqCorba,CorbaSender>::CorbaNCWithCopyReceiver(CorbaSender mySender):_mySender(mySender){
36 template<class T,class TCorba,class TSeqCorba,class CorbaSender>
37 CorbaNCWithCopyReceiver<T,TCorba,TSeqCorba,CorbaSender>::~CorbaNCWithCopyReceiver(){
39 CORBA::release(_mySender);
42 template<class T,class TCorba,class TSeqCorba,class CorbaSender>
43 void *CorbaNCWithCopyReceiver<T,TCorba,TSeqCorba,CorbaSender>::getDistValue(long &size){
44 size=_mySender->getSize();
48 for(long i=0;i<size;i+=TAILLE_SPLIT)
50 if(size-i>TAILLE_SPLIT)
54 TSeqCorba seq=_mySender->sendPart(i,n);
55 T *seqd=(T *)seq->get_buffer(0);
62 template<class T,class TCorba,class TSeqCorba,class CorbaSender>
63 void *CorbaNCWithCopyReceiver<T,TCorba,TSeqCorba,CorbaSender>::getValue(long &size)
65 return Receiver::getValue(size,_mySender);
68 template<class T,class TCorba,class TSeqCorba,class CorbaSender>
69 CorbaWCNoCopyReceiver<T,TCorba,TSeqCorba,CorbaSender>::CorbaWCNoCopyReceiver(CorbaSender mySender):_mySender(mySender){
72 template<class T,class TCorba,class TSeqCorba,class CorbaSender>
73 CorbaWCNoCopyReceiver<T,TCorba,TSeqCorba,CorbaSender>::~CorbaWCNoCopyReceiver(){
75 CORBA::release(_mySender);
78 template<class T,class TCorba,class TSeqCorba,class CorbaSender>
79 void *CorbaWCNoCopyReceiver<T,TCorba,TSeqCorba,CorbaSender>::getDistValue(long &size){
80 size=_mySender->getSize();
84 for(long i=0;i<size;i+=TAILLE_SPLIT)
86 if(size-i>TAILLE_SPLIT)
90 TSeqCorba seq=_mySender->sendPart(i,n);
91 TCorba *seqd=seq->get_buffer(0);
98 template<class T,class TCorba,class TSeqCorba,class CorbaSender>
99 void *CorbaWCNoCopyReceiver<T,TCorba,TSeqCorba,CorbaSender>::getValue(long &size)
101 return Receiver::getValue(size,_mySender);
104 template<class T,class TCorba,class TSeqCorba,class CorbaSender>
105 CorbaWCWithCopyReceiver<T,TCorba,TSeqCorba,CorbaSender>::CorbaWCWithCopyReceiver(CorbaSender mySender):_mySender(mySender){
108 template<class T,class TCorba,class TSeqCorba,class CorbaSender>
109 CorbaWCWithCopyReceiver<T,TCorba,TSeqCorba,CorbaSender>::~CorbaWCWithCopyReceiver(){
110 _mySender->release();
111 CORBA::release(_mySender);
114 template<class T,class TCorba,class TSeqCorba,class CorbaSender>
115 void *CorbaWCWithCopyReceiver<T,TCorba,TSeqCorba,CorbaSender>::getDistValue(long &size){
116 size=_mySender->getSize();
120 for(long i=0;i<size;i+=TAILLE_SPLIT)
122 if(size-i>TAILLE_SPLIT)
126 TSeqCorba seq=_mySender->sendPart(i,n);
127 TCorba *seqd=seq->get_buffer(0);
128 for(long j=0;j<n;j++)
134 template<class T,class TCorba,class TSeqCorba,class CorbaSender>
135 void *CorbaWCWithCopyReceiver<T,TCorba,TSeqCorba,CorbaSender>::getValue(long &size)
137 return Receiver::getValue(size,_mySender);
142 template<class T,MPI_Datatype T2>
143 MPIReceiver<T,T2>::MPIReceiver(SALOME::MPISender_ptr mySender):_mySender(mySender){
146 template<class T,MPI_Datatype T2>
147 MPIReceiver<T,T2>::~MPIReceiver(){
148 _mySender->release();
149 CORBA::release(_mySender);
152 template<class T,MPI_Datatype T2>
153 void *MPIReceiver<T,T2>::getDistValue(long &size){
159 char port_name_clt [MPI_MAX_PORT_NAME];
160 float telps, tuser, tsys, tcpu;
166 MPI_Comm_rank(MPI_COMM_WORLD, &myproc);
167 SALOME::MPISender::param_var p =_mySender->getParam();
170 MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_RETURN);
171 while ( i != TIMEOUT && MPI_Lookup_name((char*)p->service,MPI_INFO_NULL,port_name_clt) != MPI_SUCCESS) {
174 MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_ARE_FATAL);
175 if ( i == TIMEOUT ) {
180 // Connect to service, get the inter-communicator server
181 // Attention MPI_Comm_connect est un appel collectif :
182 // - Si lancement mpirun -c n -----> uniquement MPI_COMM_SELF fonctionne
183 // - Si lancement client_server&client_server ----> MPI_COMM_WORLD fonctionne
185 // TIMEOUT is inefficient since MPI_Comm_Connect doesn't return if we asked for
186 // a service that has been unpublished !
187 MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_RETURN);
189 while ( i != TIMEOUT && MPI_Comm_connect(port_name_clt, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &com)!=MPI_SUCCESS ) {
192 MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_ARE_FATAL);
193 if ( i == TIMEOUT ) {
198 MPI_Recv( &_n, 1, MPI_LONG, sproc,p->tag1,com,&status);
200 MPI_Recv( _v, _n, T2, sproc,p->tag2,com,&status);
202 MPI_Comm_disconnect( &com );
207 template<class T,MPI_Datatype T2>
208 void *MPIReceiver<T,T2>::getValue(long &size)
210 return Receiver::getValue(size,_mySender);
216 #include <sys/types.h>
217 #include <sys/socket.h>
218 #include <netinet/in.h>
219 #include <arpa/inet.h>
224 template<class T,int (*myFunc)(XDR*,T*)>
225 SocketReceiver<T,myFunc>::SocketReceiver(SALOME::SocketSender_ptr mySender) : _mySender(mySender)
231 template<class T,int (*myFunc)(XDR*,T*)>
232 SocketReceiver<T,myFunc>::~SocketReceiver()
236 _mySender->release();
237 CORBA::release(_mySender);
241 template<class T,int (*myFunc)(XDR*,T*)>
242 void *SocketReceiver<T,myFunc>::getValue(long &size)
244 return Receiver::getValue(size,_mySender);
247 template<class T,int (*myFunc)(XDR*,T*)>
248 void* SocketReceiver<T,myFunc>::getDistValue(long &size)
252 XDR xp; /* pointeur sur le decodeur XDR */
257 SALOME::SocketSender::param_var p = _mySender->getParam();
259 size = p->lend - p->lstart + 1;
262 connectCom(p->internet_address, p->myport);
266 xdrmem_create(&xp,(char*)v,size*sizeof(T),XDR_DECODE );
267 while( n < size*sizeof(T) ){
268 m = read(_clientSockfd, (char*)v+n, size*sizeof(T)-n);
272 SALOME::ExceptionStruct es;
273 es.type = SALOME::COMM;
274 es.text = "error read Socket exception";
275 throw SALOME::SALOME_Exception(es);
279 xdr_vector( &xp, (char*)v, size, sizeof(T), (xdrproc_t)myFunc);
282 _mySender->endOfCom();
285 catch(SALOME::SALOME_Exception &ex){
286 if( ex.details.type == SALOME::COMM )
288 _senderDestruc=false;
289 cout << ex.details.text << endl;
290 throw MultiCommException("Unknown sender protocol");
299 template<class T,int (*myFunc)(XDR*,T*)>
300 void SocketReceiver<T,myFunc>::initCom()
303 _mySender->initCom();
305 /* Ouverture de la socket */
306 _clientSockfd = socket(AF_INET, SOCK_STREAM, 0);
307 if (_clientSockfd < 0) {
309 SALOME::ExceptionStruct es;
310 es.type = SALOME::COMM;
311 es.text = "error Socket exception";
312 throw SALOME::SALOME_Exception(es);
315 catch(SALOME::SALOME_Exception &ex){
316 if( ex.details.type == SALOME::COMM )
318 _senderDestruc=false;
319 cout << ex.details.text << endl;
320 throw MultiCommException("Unknown sender protocol");
328 template<class T,int (*myFunc)(XDR*,T*)>
329 void SocketReceiver<T,myFunc>::connectCom(const char *dest_address, int port)
331 struct sockaddr_in serv_addr;
332 struct hostent * server;
333 SALOME::ExceptionStruct es;
336 /* reception of the host structure on the remote process */
337 server = gethostbyname(dest_address);
338 if( server == NULL ) {
340 es.type = SALOME::COMM;
341 es.text = "error unknown host Socket exception";
342 _senderDestruc=false;
343 throw SALOME::SALOME_Exception(es);
346 /* Initialisation of the socket structure */
347 bzero((char*)&serv_addr,sizeof(serv_addr));
348 serv_addr.sin_family = AF_INET;
349 serv_addr.sin_addr.s_addr = INADDR_ANY;
350 bcopy((char *)server->h_addr,
351 (char *)&serv_addr.sin_addr.s_addr,
353 serv_addr.sin_port = htons(port);
355 if( connect(_clientSockfd, (struct sockaddr *) & serv_addr, sizeof(struct sockaddr)) < 0 ){
357 es.type = SALOME::COMM;
358 es.text = "error connect Socket exception";
359 _senderDestruc=false;
360 throw SALOME::SALOME_Exception(es);
363 _mySender->acceptCom();
366 catch(SALOME::SALOME_Exception &ex){
367 if( ex.details.type == SALOME::COMM )
369 _senderDestruc=false;
370 cout << ex.details.text << endl;
371 throw MultiCommException("Unknown sender protocol");
380 template<class T,int (*myFunc)(XDR*,T*)>
381 void SocketReceiver<T,myFunc>::closeCom()
383 _mySender->closeCom();
384 if( _clientSockfd >= 0 ){
385 close(_clientSockfd);