The global communication layer
This commit is contained in:
parent
59b6246f76
commit
694a908a61
1 changed files with 147 additions and 0 deletions
147
eo/src/paradisEO/comm/eoListener.h
Normal file
147
eo/src/paradisEO/comm/eoListener.h
Normal file
|
|
@ -0,0 +1,147 @@
|
|||
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
|
||||
|
||||
// "eoListener.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
|
||||
|
||||
Cont act: cahon@lifl.fr
|
||||
*/
|
||||
|
||||
#ifndef eoListener_h
|
||||
#define eoListener_h
|
||||
|
||||
#include <vector>
|
||||
#include <paradisEO/comm/eoLocalListener.h>
|
||||
#include <paradisEO/comm/messages/to/eoPublishMessTo.h>
|
||||
#include <paradisEO/comm/messages/to/eoKillMessTo.h>
|
||||
#include <mpi.h>
|
||||
|
||||
/**
|
||||
Necessary for any use of a distributed model.
|
||||
It makes it possible to have a total state of
|
||||
that one.
|
||||
*/
|
||||
|
||||
// In the near future ... Enabling different kinds of EO to send/receive ..
|
||||
|
||||
template <class EOT> class eoListener : public vector <eoLocalListener <EOT> > {
|
||||
|
||||
public :
|
||||
|
||||
/**
|
||||
Constructor.
|
||||
*/
|
||||
|
||||
eoListener (int argc, char ** argv) : comm (MPI :: COMM_WORLD) {
|
||||
|
||||
// Mpi requires it !
|
||||
MPI :: Init (argc, argv) ;
|
||||
|
||||
// Who and how many ?
|
||||
rank = MPI :: COMM_WORLD.Get_rank () ;
|
||||
len = MPI :: COMM_WORLD.Get_size () ;
|
||||
|
||||
// To build local listeners algorithms
|
||||
for (int i = 0 ; i < len ; i ++) {
|
||||
eoLocalListener <EOT> loc_listen (i) ;
|
||||
push_back (loc_listen) ;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Destructor.
|
||||
*/
|
||||
|
||||
~ eoListener () {
|
||||
|
||||
MPI :: Finalize () ;
|
||||
}
|
||||
|
||||
/**
|
||||
A reference to the current listener
|
||||
*/
|
||||
|
||||
eoLocalListener <EOT> & here () {
|
||||
|
||||
return operator [] (rank) ;
|
||||
}
|
||||
|
||||
/**
|
||||
To import messages ...
|
||||
*/
|
||||
|
||||
void update () {
|
||||
|
||||
for (int i = 0 ; i < size () ; i ++)
|
||||
operator [] (i).update () ;
|
||||
}
|
||||
|
||||
/**
|
||||
To broadcast the string identifier of the local process to the
|
||||
whole neighbouring ...
|
||||
*/
|
||||
|
||||
void publish (string label) {
|
||||
|
||||
eoPublishMessTo <EOT> mess (label) ;
|
||||
for (int i = 0 ; i < size () ; i ++)
|
||||
if (i != rank)
|
||||
mess (operator [] (i)) ;
|
||||
here ().label () = label ; // Nothing to send !
|
||||
}
|
||||
|
||||
/**
|
||||
Blocking. Waits for at least one 'eoLocalListener' to
|
||||
receive any eoPop ...
|
||||
*/
|
||||
|
||||
void wait () {
|
||||
|
||||
bool b = false ;
|
||||
|
||||
do {
|
||||
comm.Probe (MPI :: ANY_SOURCE, 0) ;
|
||||
update () ;
|
||||
for (int i = 0 ; i < size () ; i ++)
|
||||
if (! operator [] (i).empty ())
|
||||
b = true ;
|
||||
|
||||
} while (! b) ;
|
||||
}
|
||||
|
||||
void destroy (string label) {
|
||||
|
||||
eoKillMessTo <EOT> mess ;
|
||||
for (int i = 0 ; i < len ; i ++) {
|
||||
if (operator [] (i).label () == label)
|
||||
mess (operator [] (i)) ;
|
||||
}
|
||||
}
|
||||
|
||||
private :
|
||||
|
||||
int rank, len ; // Rank of current process, and number of distributed processes
|
||||
|
||||
MPI :: Comm & comm ; // Communicator
|
||||
|
||||
|
||||
} ;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
Reference in a new issue