The local communication layer
This commit is contained in:
parent
694a908a61
commit
37d09fbccd
1 changed files with 156 additions and 0 deletions
156
eo/src/paradisEO/comm/eoLocalListener.h
Normal file
156
eo/src/paradisEO/comm/eoLocalListener.h
Normal file
|
|
@ -0,0 +1,156 @@
|
||||||
|
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
|
||||||
|
|
||||||
|
// "eoLocalListener.h"
|
||||||
|
|
||||||
|
// (c) OPAC Team, LIFL, 2002
|
||||||
|
|
||||||
|
/* This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
Contact: cahon@lifl.fr
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef eoLocalListener_h
|
||||||
|
#define eoLocalListener_h
|
||||||
|
|
||||||
|
#include <queue>
|
||||||
|
#include <string>
|
||||||
|
#include <paradisEO/comm/messages/from/eoHeaderMessFrom.h>
|
||||||
|
#include <paradisEO/comm/messages/from/eoEOReceiveMessFrom.h>
|
||||||
|
#include <paradisEO/comm/messages/from/eoEOSendMessFrom.h>
|
||||||
|
#include <paradisEO/comm/messages/from/eoPublishMessFrom.h>
|
||||||
|
#include <paradisEO/comm/messages/from/eoKillMessFrom.h>
|
||||||
|
#include <eoPop.h>
|
||||||
|
#include <mpi.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
A local listener to pack any coming message or, on contrary, to
|
||||||
|
send any data to another distributed process.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Well, not very nice, but necessary for multiples header inclusions :-/
|
||||||
|
|
||||||
|
template <class EOT> class eoHeaderMessFrom ;
|
||||||
|
template <class EOT> class eoMessFrom ;
|
||||||
|
template <class EOT> class eoMessTo ;
|
||||||
|
template <class EOT> class eoEOReceiveMessFrom ;
|
||||||
|
template <class EOT> class eoEOSendMessFrom ;
|
||||||
|
template <class EOT> class eoPublishMessFrom ;
|
||||||
|
template <class EOT> class eoKillMessFrom ;
|
||||||
|
|
||||||
|
template <class EOT> class eoLocalListener : public queue <eoPop <EOT> > {
|
||||||
|
|
||||||
|
public :
|
||||||
|
|
||||||
|
/**
|
||||||
|
Constructor
|
||||||
|
*/
|
||||||
|
|
||||||
|
eoLocalListener (int _num_id) :
|
||||||
|
|
||||||
|
num_id (_num_id),
|
||||||
|
comm (& MPI :: COMM_WORLD), // Shared communicator ...
|
||||||
|
req_EO (false) {
|
||||||
|
|
||||||
|
gethostname (host_name, 255) ; // Host ?
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Any distributed algorithm or agent has its own integer
|
||||||
|
identifiant, which lets us to distinguish them.
|
||||||
|
*/
|
||||||
|
|
||||||
|
bool operator == (eoLocalListener <EOT> & loc_listen) {
|
||||||
|
|
||||||
|
return loc_listen.num_id == num_id ;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
To import awaiting messages from other algorithms.
|
||||||
|
For each one, an action may be performed.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void update () {
|
||||||
|
|
||||||
|
while (comm -> Iprobe (num_id, 0)) {
|
||||||
|
// While any more messages
|
||||||
|
|
||||||
|
eoHeaderMessFrom <EOT> header (* this) ;
|
||||||
|
eoMessFrom <EOT> * mess ;
|
||||||
|
|
||||||
|
/* The header identifies the kind of messages.
|
||||||
|
Currently, only four are necessary and so defined */
|
||||||
|
|
||||||
|
if (header == "eoEOReceiveMessTo")
|
||||||
|
mess = new eoEOReceiveMessFrom <EOT> (* this) ;
|
||||||
|
else if (header == "eoEOSendMessTo")
|
||||||
|
mess = new eoEOSendMessFrom <EOT> (* this) ;
|
||||||
|
else if (header == "eoPublishMessTo")
|
||||||
|
mess = new eoPublishMessFrom <EOT> (* this) ;
|
||||||
|
else {
|
||||||
|
mess = new eoKillMessFrom <EOT> (* this) ;
|
||||||
|
}
|
||||||
|
// Any side effects ?
|
||||||
|
mess -> operator () () ;
|
||||||
|
delete mess ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
String identifier of this algo/agent ?
|
||||||
|
*/
|
||||||
|
|
||||||
|
string & label () {
|
||||||
|
|
||||||
|
return name_id ;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool & need_immigration () {
|
||||||
|
|
||||||
|
return req_EO ;
|
||||||
|
}
|
||||||
|
|
||||||
|
int number () {
|
||||||
|
|
||||||
|
return num_id ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void destroy () {
|
||||||
|
|
||||||
|
cout << "Agent [" << name_id << "] stopped ..." << endl ;
|
||||||
|
MPI :: Finalize () ;
|
||||||
|
exit (0) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
char host_name [255] ; // Host string identifier
|
||||||
|
|
||||||
|
private :
|
||||||
|
|
||||||
|
MPI :: Comm * comm ; // MPI Communicator
|
||||||
|
|
||||||
|
string name_id ; // String id.
|
||||||
|
int num_id ; // MPI id.
|
||||||
|
bool req_EO ;
|
||||||
|
|
||||||
|
// Friendly classes
|
||||||
|
friend class eoMessFrom <EOT> ;
|
||||||
|
friend class eoMessTo <EOT> ;
|
||||||
|
|
||||||
|
} ;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Reference in a new issue