git-svn-id: svn://scm.gforge.inria.fr/svnroot/paradiseo@790 331e1502-861f-0410-8da2-ba01fb791d7f

This commit is contained in:
atantar 2007-11-18 17:00:47 +00:00
commit adb6419766
60 changed files with 1017 additions and 1095 deletions

View file

@ -1,4 +1,4 @@
/*
/*
* <communicable.cpp>
* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007
* (C) OPAC Team, LIFL, 2002-2007
@ -46,8 +46,7 @@ static std :: map <const Communicable *, unsigned> comm_to_key; /* Map of regist
unsigned Communicable :: num_comm = 0;
Communicable :: Communicable ()
{
Communicable :: Communicable () {
comm_to_key [this] = key = ++ num_comm;
key_to_comm.push_back (this);
@ -55,48 +54,41 @@ Communicable :: Communicable ()
sem_init (& sem_stop, 0, 0);
}
Communicable :: ~ Communicable ()
{
Communicable :: ~ Communicable () {
}
COMM_ID Communicable :: getKey ()
{
COMM_ID Communicable :: getKey () {
return key;
}
Communicable * getCommunicable (COMM_ID __key)
{
Communicable * getCommunicable (COMM_ID __key) {
assert (__key < key_to_comm.size ());
return key_to_comm [__key];
return key_to_comm [__key];
}
COMM_ID getKey (const Communicable * __comm)
{
COMM_ID getKey (const Communicable * __comm) {
return comm_to_key [__comm];
}
void Communicable :: lock ()
{
void Communicable :: lock () {
sem_wait (& sem_lock);
}
sem_wait (& sem_lock);
}
void Communicable :: unlock ()
{
void Communicable :: unlock () {
sem_post (& sem_lock);
}
void Communicable :: stop ()
{
void Communicable :: stop () {
sem_wait (& sem_stop);
}
void Communicable :: resume ()
{
void Communicable :: resume () {
sem_post (& sem_stop);
}

View file

@ -1,4 +1,4 @@
/*
/*
* <communicable.h>
* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007
* (C) OPAC Team, LIFL, 2002-2007
@ -41,35 +41,34 @@
typedef unsigned COMM_ID;
class Communicable
{
class Communicable {
public :
public :
Communicable ();
Communicable ();
virtual ~ Communicable ();
virtual ~ Communicable ();
COMM_ID getKey ();
COMM_ID getKey ();
void lock (); /* It suspends the current process if the semaphore is locked */
void unlock (); /* It unlocks the shared semaphore */
void lock (); /* It suspends the current process if the semaphore is locked */
void unlock (); /* It unlocks the shared semaphore */
void stop (); /* It suspends the current process */
void resume (); /* It resumes ___________ */
protected :
void stop (); /* It suspends the current process */
void resume (); /* It resumes ___________ */
COMM_ID key;
protected :
sem_t sem_lock;
sem_t sem_stop;
COMM_ID key;
static unsigned num_comm;
};
sem_t sem_lock;
sem_t sem_stop;
static unsigned num_comm;
};
extern Communicable * getCommunicable (COMM_ID __key);
extern Communicable * getCommunicable (COMM_ID __key);
//extern COMM_ID getKey (const Communicable * __comm);

View file

@ -1,4 +1,4 @@
/*
/*
* <cooperative.h>
* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007
* (C) OPAC Team, LIFL, 2002-2007
@ -42,29 +42,28 @@
typedef unsigned COOP_ID;
class Cooperative : public Communicable
{
class Cooperative : public Communicable {
public :
public :
Runner * getOwner ();
Runner * getOwner ();
void setOwner (Runner & __runner);
void setOwner (Runner & __runner);
virtual void pack () = 0;
virtual void pack () = 0;
virtual void unpack () = 0;
virtual void unpack () = 0;
void send (Cooperative * __coop);
void send (Cooperative * __coop);
virtual void notifySending ();
virtual void notifySending ();
private :
private :
Runner * owner;
Runner * owner;
};
};
extern Cooperative * getCooperative (COOP_ID __key);
extern Cooperative * getCooperative (COOP_ID __key);
#endif

View file

@ -1,4 +1,4 @@
/*
/*
* <eoPop_comm.h>
* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007
* (C) OPAC Team, LIFL, 2002-2007
@ -34,23 +34,21 @@
*
*/
#ifndef __eoPop_comm_h
#define __eoPop_comm_h
#ifndef __eoPop_mesg_h
#define __eoPop_mesg_h
#include <eoPop.h>
#include "messaging.h"
template <class EOT> void pack (const eoPop <EOT> & __pop)
{
template <class EOT> void pack (const eoPop <EOT> & __pop) {
pack ((unsigned) __pop.size ());
for (unsigned i = 0; i < __pop.size (); i ++)
pack (__pop [i]);
}
template <class EOT> void unpack (eoPop <EOT> & __pop)
{
template <class EOT> void unpack (eoPop <EOT> & __pop) {
unsigned n;

View file

@ -1,4 +1,4 @@
/*
/*
* <eoVector_comm.h>
* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007
* (C) OPAC Team, LIFL, 2002-2007
@ -34,43 +34,28 @@
*
*/
#ifndef __eoVector_comm_h
#define __eoVector_comm_h
#ifndef __eoVector_mesg_h
#define __eoVector_mesg_h
#include <eoVector.h>
#include "messaging.h"
template <class F, class T> void pack (const eoVector <F, T> & __v)
{
template <class F, class T> void pack (const eoVector <F, T> & __v) {
if ( !__v.invalid() )
{
pack( (unsigned int) 1 );
pack (__v.fitness ()) ;
}
else
pack( (unsigned int) 0 );
pack (__v.fitness ()) ;
unsigned len = __v.size ();
pack (len);
for (unsigned i = 0 ; i < len; i ++)
pack (__v [i]);
pack (__v [i]);
}
template <class F, class T> void unpack (eoVector <F, T> & __v)
{
template <class F, class T> void unpack (eoVector <F, T> & __v) {
F fit;
unpack (fit);
__v.fitness (fit);
F fit;
unsigned int vfit;
unpack( vfit );
if ( vfit )
{
unpack (fit);
__v.fitness (fit);
}
else
__v.invalidate();
unsigned len;
unpack (len);
__v.resize (len);
@ -78,23 +63,21 @@ template <class F, class T> void unpack (eoVector <F, T> & __v)
unpack (__v [i]);
}
template <class F, class T, class V> void pack (const eoVectorParticle <F, T, V> & __v)
{
template <class F, class T, class V> void pack (const eoVectorParticle <F, T, V> & __v) {
pack (__v.fitness ()) ;
pack (__v.best());
unsigned len = __v.size ();
pack (len);
for (unsigned i = 0 ; i < len; i ++)
pack (__v [i]);
pack (__v [i]);
for (unsigned i = 0 ; i < len; i ++)
pack (__v.bestPositions[i]);
pack (__v.bestPositions[i]);
for (unsigned i = 0 ; i < len; i ++)
pack (__v.velocities[i]);
pack (__v.velocities[i]);
}
template <class F, class T, class V> void unpack (eoVectorParticle <F, T, V> & __v)
{
template <class F, class T, class V> void unpack (eoVectorParticle <F, T, V> & __v) {
F fit;
unpack(fit);
@ -105,11 +88,11 @@ template <class F, class T, class V> void unpack (eoVectorParticle <F, T, V> & _
unpack (len);
__v.resize (len);
for (unsigned i = 0 ; i < len; i ++)
unpack (__v [i]);
unpack (__v [i]);
for (unsigned i = 0 ; i < len; i ++)
unpack (__v.bestPositions[i]);
unpack (__v.bestPositions[i]);
for (unsigned i = 0 ; i < len; i ++)
unpack (__v.velocities[i]);
unpack (__v.velocities[i]);
}
#endif

View file

@ -1,4 +1,4 @@
/*
/*
* <messaging.h>
* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007
* (C) OPAC Team, LIFL, 2002-2007
@ -40,46 +40,44 @@
#include <utility>
/* Char */
extern void pack (const char & __c);
extern void pack (const char & __c);
/* Float */
extern void pack (const float & __f, int __nitem = 1);
extern void pack (const float & __f, int __nitem = 1);
/* Double */
extern void pack (const double & __d, int __nitem = 1);
extern void pack (const double & __d, int __nitem = 1);
/* Integer */
extern void pack (const int & __i, int __nitem = 1);
extern void pack (const int & __i, int __nitem = 1);
/* Unsigned int. */
extern void pack (const unsigned int & __ui, int __nitem = 1);
extern void pack (const unsigned int & __ui, int __nitem = 1);
/* Short int. */
extern void pack (const short & __sh, int __nitem = 1);
extern void pack (const short & __sh, int __nitem = 1);
/* Unsigned short */
extern void pack (const unsigned short & __ush, int __nitem = 1);
/* Long */
extern void pack (const long & __l, int __nitem = 1);
extern void pack (const long & __l, int __nitem = 1);
/* Unsigned long */
extern void pack (const unsigned long & __ul, int __nitem = 1);
extern void pack (const unsigned long & __ul, int __nitem = 1);
/* String */
extern void pack (const char * __str);
extern void pack (const char * __str);
/* Pointer */
template <class T> void pack (const T * __ptr)
{
pack ((unsigned long) __ptr);
template <class T> void pack (const T * __ptr) {
pack ((unsigned long) __ptr);
}
/* Pair */
template <class U, class V> void pack (const std :: pair <U, V> & __pair)
{
template <class U, class V> void pack (const std :: pair <U, V> & __pair) {
pack (__pair.first);
pack (__pair.second);
}
@ -88,48 +86,46 @@ template <class U, class V> void pack (const std :: pair <U, V> & __pair)
//
/* Char */
extern void unpack (char & __c);
extern void unpack (char & __c);
/* Float */
extern void unpack (float & __f, int __nitem = 1);
extern void unpack (float & __f, int __nitem = 1);
/* Double */
extern void unpack (double & __d, int __nitem = 1);
extern void unpack (double & __d, int __nitem = 1);
/* Integer */
extern void unpack (int & __i, int __nitem = 1);
extern void unpack (int & __i, int __nitem = 1);
/* Unsigned int. */
extern void unpack (unsigned int & __ui, int __nitem = 1);
extern void unpack (unsigned int & __ui, int __nitem = 1);
/* Short int. */
extern void unpack (short & __sh, int __nitem = 1);
extern void unpack (short & __sh, int __nitem = 1);
/* Unsigned short */
extern void unpack (unsigned short & __ush, int __nitem = 1);
/* Long */
extern void unpack (long & __l, int __nitem = 1);
extern void unpack (long & __l, int __nitem = 1);
/* Unsigned long */
extern void unpack (unsigned long & __ul, int __nitem = 1);
extern void unpack (unsigned long & __ul, int __nitem = 1);
/* String */
extern void unpack (char * __str);
extern void unpack (char * __str);
/* Pointer */
template <class T> void unpack (T * & __ptr)
{
template <class T> void unpack (T * & __ptr) {
unsigned long p;
unpack (p);
__ptr = (T *) p;
}
/* Pair */
template <class U, class V> void unpack (std :: pair <U, V> & __pair)
{
template <class U, class V> void unpack (std :: pair <U, V> & __pair) {
unpack (__pair.first);
unpack (__pair.second);
}

View file

@ -1,4 +1,4 @@
/*
/*
* <peo_debug.cpp>
* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007
* (C) OPAC Team, LIFL, 2002-2007
@ -56,8 +56,7 @@ static char host [MAX_BUFF_SIZE];
std :: vector <FILE *> files;
void setDebugMode (bool __dbg)
{
void setDebugMode (bool __dbg) {
debug = __dbg;
gethostname (host, MAX_BUFF_SIZE);
@ -65,9 +64,8 @@ void setDebugMode (bool __dbg)
extern int getNodeRank ();
void initDebugging ()
{
void initDebugging () {
mkdir (DEBUG_PATH, S_IRWXU);
// files.push_back (stdout);
char buff [MAX_BUFF_SIZE];
@ -75,37 +73,33 @@ void initDebugging ()
files.push_back (fopen (buff, "w"));
}
void endDebugging ()
{
void endDebugging () {
for (unsigned i = 0; i < files.size (); i ++)
if (files [i] != stdout)
fclose (files [i]);
}
void printDebugMessage (const char * __mess)
{
void printDebugMessage (const char * __mess) {
return;
if (debug) {
if (debug)
{
char buff [MAX_BUFF_SIZE];
time_t t = time (0);
char buff [MAX_BUFF_SIZE];
time_t t = time (0);
/* Date */
sprintf (buff, "[%s][%s: ", host, ctime (& t));
* strchr (buff, '\n') = ']';
for (unsigned i = 0; i < files.size (); i ++)
fprintf (files [i], buff);
/* Date */
sprintf (buff, "[%s][%s: ", host, ctime (& t));
* strchr (buff, '\n') = ']';
for (unsigned i = 0; i < files.size (); i ++)
fprintf (files [i], buff);
/* Message */
sprintf (buff, "%s", __mess);
for (unsigned i = 0; i < files.size (); i ++)
{
fputs (buff, files [i]);
fputs ("\n", files [i]);
fflush (files [i]);
}
/* Message */
sprintf (buff, "%s", __mess);
for (unsigned i = 0; i < files.size (); i ++) {
fputs (buff, files [i]);
fputs ("\n", files [i]);
fflush (files [i]);
}
}
}

View file

@ -1,4 +1,4 @@
/*
/*
* <peo_debug.h>
* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007
* (C) OPAC Team, LIFL, 2002-2007

View file

@ -1,4 +1,4 @@
/*
/*
* <peo_fin.cpp>
* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007
* (C) OPAC Team, LIFL, 2002-2007
@ -39,8 +39,8 @@
#include "runner.h"
#include "rmc.h"
void peo :: finalize ()
{
void peo :: finalize () {
printDebugMessage ("waiting for the termination of all threads");

View file

@ -1,4 +1,4 @@
/*
/*
* <peo_fin.h>
* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007
* (C) OPAC Team, LIFL, 2002-2007
@ -37,9 +37,8 @@
#ifndef __peo_finalize_h
#define __peo_finalize_h
namespace peo
{
namespace peo {
extern void finalize ();
}

View file

@ -1,4 +1,4 @@
/*
/*
* <peo_init.cpp>
* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007
* (C) OPAC Team, LIFL, 2002-2007
@ -41,26 +41,24 @@
#include "peo_debug.h"
#include "rmc.h"
namespace peo
{
namespace peo {
int * argc;
char * * * argv;
void init (int & __argc, char * * & __argv)
{
void init (int & __argc, char * * & __argv) {
argc = & __argc;
argv = & __argv;
/* Initializing the the Resource Management and Communication */
initRMC (__argc, __argv);
/* Loading the common parameters */
/* Loading the common parameters */
loadParameters (__argc, __argv);
/* */
initDebugging ();
}

View file

@ -1,4 +1,4 @@
/*
/*
* <peo_init.h>
* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007
* (C) OPAC Team, LIFL, 2002-2007
@ -37,13 +37,12 @@
#ifndef __peo_init_h
#define __peo_init_h
namespace peo
{
namespace peo {
extern int * argc;
extern char * * * argv;
extern void init (int & __argc, char * * & __argv);
}

View file

@ -1,4 +1,4 @@
/*
/*
* <peo_param.cpp>
* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007
* (C) OPAC Team, LIFL, 2002-2007
@ -41,8 +41,7 @@
void peo :: loadParameters (int & __argc, char * * & __argv)
{
void peo :: loadParameters (int & __argc, char * * & __argv) {
eoParser parser (__argc, __argv);

View file

@ -1,4 +1,4 @@
/*
/*
* <peo_param.h>
* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007
* (C) OPAC Team, LIFL, 2002-2007
@ -37,9 +37,8 @@
#ifndef __peo_param_h
#define __peo_param_h
namespace peo
{
namespace peo {
extern void loadParameters (int & __argc, char * * & __argv);
}

View file

@ -1,4 +1,4 @@
/*
/*
* <peo_run.cpp>
* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007
* (C) OPAC Team, LIFL, 2002-2007
@ -39,9 +39,8 @@
#include "rmc.h"
#include "runner.h"
void peo :: run ()
{
void peo :: run () {
startRunners ();
runRMC ();

View file

@ -1,4 +1,4 @@
/*
/*
* <peo_run.h>
* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007
* (C) OPAC Team, LIFL, 2002-2007
@ -37,9 +37,8 @@
#ifndef __peo_run_h
#define __peo_run_h
namespace peo
{
namespace peo {
extern void run ();
}

View file

@ -1,4 +1,4 @@
/*
/*
* <reac_thread.cpp>
* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007
* (C) OPAC Team, LIFL, 2002-2007
@ -40,29 +40,25 @@ static bool the_end = false;
static std :: vector <ReactiveThread *> reac_threads;
ReactiveThread :: ReactiveThread ()
{
ReactiveThread :: ReactiveThread () {
reac_threads.push_back (this);
sem_init (& sem, 0, 0);
}
void ReactiveThread :: sleep ()
{
void ReactiveThread :: sleep () {
sem_wait (& sem);
sem_wait (& sem);
}
void ReactiveThread :: wakeUp ()
{
void ReactiveThread :: wakeUp () {
sem_post (& sem);
sem_post (& sem);
}
void stopReactiveThreads ()
{
void stopReactiveThreads () {
the_end = true;
for (unsigned i = 0; i < reac_threads.size (); i ++)
reac_threads [i] -> wakeUp ();
reac_threads [i] -> wakeUp ();
}

View file

@ -1,4 +1,4 @@
/*
/*
* <reac_thread.h>
* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007
* (C) OPAC Team, LIFL, 2002-2007
@ -41,23 +41,22 @@
#include "thread.h"
class ReactiveThread : public Thread
{
class ReactiveThread : public Thread {
public:
public:
/* Ctor */
ReactiveThread ();
/* Ctor */
ReactiveThread ();
void sleep ();
void wakeUp ();
private:
void sleep ();
void wakeUp ();
private:
sem_t sem;
};
sem_t sem;
};
extern void stopReactiveThreads ();

View file

@ -1,4 +1,4 @@
/*
/*
* <ring_topo.cpp>
* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007
* (C) OPAC Team, LIFL, 2002-2007
@ -37,19 +37,17 @@
#include "ring_topo.h"
void RingTopology :: setNeighbors (Cooperative * __mig,
std :: vector <Cooperative *> & __from,
std :: vector <Cooperative *> & __to)
{
std :: vector <Cooperative *> & __from,
std :: vector <Cooperative *> & __to) {
__from.clear () ;
__to.clear () ;
int len = mig.size () ;
for (int i = 0 ; i < len ; i ++)
if (mig [i] == __mig)
{
__from.push_back (mig [(i - 1 + len) % len]) ;
__to.push_back (mig [(i + 1) % len]) ;
break;
int len = mig.size () ;
for (int i = 0 ; i < len ; i ++)
if (mig [i] == __mig) {
__from.push_back (mig [(i - 1 + len) % len]) ;
__to.push_back (mig [(i + 1) % len]) ;
break;
}
}

View file

@ -1,4 +1,4 @@
/*
/*
* <ring_topo.h>
* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007
* (C) OPAC Team, LIFL, 2002-2007
@ -39,15 +39,14 @@
#include "topology.h"
class RingTopology : public Topology
{
public :
void setNeighbors (Cooperative * __mig,
std :: vector <Cooperative *> & __from,
std :: vector <Cooperative *> & __to);
};
class RingTopology : public Topology {
public :
void setNeighbors (Cooperative * __mig,
std :: vector <Cooperative *> & __from,
std :: vector <Cooperative *> & __to);
};
#endif

View file

@ -1,4 +1,4 @@
/*
/*
* <rmc.h>
* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007
* (C) OPAC Team, LIFL, 2002-2007
@ -39,7 +39,7 @@
extern void initRMC (int & __argc, char * * & __argv);
extern void runRMC (); /* Resource Management and Communication */
extern void runRMC (); /* Resource Management and Communication */
extern void finalizeRMC ();

View file

@ -1,4 +1,4 @@
/*
/*
* <runner.cpp>
* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007
* (C) OPAC Team, LIFL, 2002-2007
@ -41,104 +41,163 @@
#include "peo_debug.h"
#include "messaging.h"
static unsigned num_act = 0; /* Number of active runners */
#include "../rmc/mpi/mess.h"
#include "../rmc/mpi/tags.h"
static std :: vector <pthread_t *> ll_threads; /* Low-level runner threads */
static std :: vector <pthread_t *> ll_threads; /* Low-level runner threads */
static std :: vector <Runner *> the_runners;
static unsigned num_runners = 0;
static unsigned num_def_runners = 0; /* Number of defined runners */
Runner :: Runner ()
{
static unsigned num_local_exec_runners = 0; /* Number of locally executing runners */
static unsigned num_exec_runners = 0; /* Number of globally executing runners */
id = ++ num_runners;
the_runners.push_back (this);
sem_init (& sem_start, 0, 0);
num_act ++;
}
extern int getNodeRank ();
extern int getNumberOfNodes ();
void unpackTerminationOfRunner ()
{
RUNNER_ID id;
unpack (id);
num_act --;
printDebugMessage ("I'm noticed of the termination of a runner");
if (! num_act)
{
printDebugMessage ("all the runners have terminated. Now stopping the reactive threads.");
stopReactiveThreads ();
}
Runner :: Runner () {
def_id = ++ num_def_runners;
the_runners.push_back (this);
sem_init (& sem_start, 0, 0);
sem_init (& sem_cntxt, 0, 0);
}
bool atLeastOneActiveRunner ()
{
RUNNER_ID Runner :: getDefinitionID () {
return num_act;
return def_id;
}
RUNNER_ID Runner :: getID ()
{
RUNNER_ID Runner :: getExecutionID () {
return id;
return def_id;
}
void Runner :: start ()
{
setActive ();
sem_post (& sem_start);
run ();
terminate ();
}
void Runner :: notifySendingTermination ()
{
/*
char b [1000];
sprintf (b, "Il reste encore %d !!!!!!!!!!!!", n);
printDebugMessage (b);
*/
printDebugMessage ("je suis informe que tout le monde a recu ma terminaison");
setPassive ();
}
void Runner :: waitStarting ()
{
sem_wait (& sem_start);
}
Runner * getRunner (RUNNER_ID __key)
{
Runner * getRunner (RUNNER_ID __key) {
return dynamic_cast <Runner *> (getCommunicable (__key));
}
void startRunners ()
{
void packExecutionContext () {
num_local_exec_runners = 0;
for (unsigned i = 0; i < the_runners.size (); i ++)
if (the_runners [i] -> isAssignedLocally ()) num_local_exec_runners ++;
pack(num_local_exec_runners);
}
void unpackExecutionContext () {
unsigned num_remote_runners;
unpack(num_remote_runners);
num_exec_runners += num_remote_runners;
}
void initializeContext () {
initMessage ();
packExecutionContext ();
sendMessageToAll (EXECUTION_CONTEXT_TAG);
int src, tag;
for (unsigned i = 0; i < getNumberOfNodes(); i ++) {
cleanBuffers ();
waitMessage ();
probeMessage ( src, tag );
receiveMessage( src, tag );
initMessage ();
unpackExecutionContext ();
}
cleanBuffers ();
synchronizeNodes ();
for (unsigned i = 0; i < the_runners.size (); i ++)
if (the_runners [i] -> isAssignedLocally ()) the_runners [i] -> notifyContextInitialized ();
}
void Runner :: waitStarting () {
sem_wait (& sem_start);
}
void Runner :: waitContextInitialization () {
sem_wait (& sem_cntxt);
}
void Runner :: start () {
setActive ();
sem_post (& sem_start);
waitContextInitialization ();
run ();
terminate ();
}
void startRunners () {
/* Runners */
for (unsigned i = 0; i < the_runners.size (); i ++)
if (the_runners [i] -> isLocal ())
{
addThread (the_runners [i], ll_threads);
the_runners [i] -> waitStarting ();
}
if (the_runners [i] -> isAssignedLocally ()) {
addThread (the_runners [i], ll_threads);
the_runners [i] -> waitStarting ();
}
printDebugMessage ("launched the parallel runners");
}
void joinRunners ()
{
void joinRunners () {
joinThreads (ll_threads);
}
bool atLeastOneActiveRunner () {
return num_exec_runners;
}
unsigned numberOfActiveRunners () {
return num_exec_runners;
}
void Runner :: notifyContextInitialized () {
sem_post (& sem_cntxt);
}
void Runner :: notifySendingTermination () {
printDebugMessage ("I am informed that everyone received my termination notification.");
setPassive ();
}
void unpackTerminationOfRunner () {
RUNNER_ID finished_id;
unpack (finished_id);
num_exec_runners --;
printDebugMessage ("I'm noticed of the termination of a runner");
if (!num_exec_runners) {
printDebugMessage ("All the runners have terminated - now stopping the reactive threads.");
stopReactiveThreads ();
}
}

View file

@ -1,4 +1,4 @@
/*
/*
* <runner.h>
* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007
* (C) OPAC Team, LIFL, 2002-2007
@ -42,46 +42,60 @@
#include "communicable.h"
#include "thread.h"
typedef unsigned RUNNER_ID;
class Runner : public Communicable, public Thread
{
public :
class Runner : public Communicable, public Thread {
Runner ();
public :
void start ();
Runner ();
void waitStarting ();
RUNNER_ID getDefinitionID ();
bool isLocal ();
RUNNER_ID getExecutionID ();
void terminate ();
bool isAssignedLocally ();
virtual void run () = 0;
void waitStarting ();
RUNNER_ID getID ();
void waitContextInitialization ();
void packTermination ();
void start ();
void notifySendingTermination ();
virtual void run () = 0;
private :
void terminate ();
sem_t sem_start;
void notifyContextInitialized ();
unsigned id;
};
void notifySendingTermination ();
extern bool atLeastOneActiveRunner ();
void packTermination ();
extern void unpackTerminationOfRunner ();
private :
extern Runner * getRunner (RUNNER_ID __key);
sem_t sem_start;
sem_t sem_cntxt;
unsigned def_id;
};
extern Runner * getRunner (RUNNER_ID __key);
extern void initializeContext ();
extern void startRunners ();
extern void joinRunners ();
extern bool atLeastOneActiveRunner ();
extern unsigned numberOfActiveRunners ();
extern void unpackTerminationOfRunner ();
#endif

View file

@ -1,4 +1,4 @@
/*
/*
* <service.cpp>
* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007
* (C) OPAC Team, LIFL, 2002-2007
@ -36,55 +36,51 @@
#include "service.h"
void Service :: setOwner (Thread & __owner)
{
void Service :: setOwner (Thread & __owner) {
owner = & __owner;
}
Thread * Service :: getOwner ()
{
Thread * Service :: getOwner () {
return owner;
}
Service * getService (SERVICE_ID __key)
{
Service * getService (SERVICE_ID __key) {
return dynamic_cast <Service *> (getCommunicable (__key));
}
void Service :: notifySendingData ()
{
void Service :: notifySendingData () {
}
void Service :: notifySendingResourceRequest ()
{
void Service :: notifySendingResourceRequest () {
num_sent_rr --;
if (! num_sent_rr)
notifySendingAllResourceRequests ();
}
void Service :: notifySendingAllResourceRequests ()
{
void Service :: notifySendingAllResourceRequests () {
}
void Service :: packData ()
{
void Service :: packData () {
}
void Service :: unpackData ()
{
void Service :: unpackData () {
}
void Service :: execute ()
{
void Service :: execute () {
}
void Service :: packResult () {
}
void Service :: packResult ()
{
}
void Service :: unpackResult () {
void Service :: unpackResult ()
{
}

View file

@ -1,4 +1,4 @@
/*
/*
* <service.h>
* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007
* (C) OPAC Team, LIFL, 2002-2007
@ -42,38 +42,37 @@
typedef unsigned SERVICE_ID;
class Service : public Communicable
{
class Service : public Communicable {
public :
public :
void setOwner (Thread & __owner);
void setOwner (Thread & __owner);
Thread * getOwner ();
Thread * getOwner ();
void requestResourceRequest (unsigned __how_many = 1);
void packResourceRequest ();
void requestResourceRequest (unsigned __how_many = 1);
void packResourceRequest ();
virtual void packData ();
virtual void unpackData ();
virtual void packData ();
virtual void unpackData ();
virtual void execute ();
virtual void packResult ();
virtual void unpackResult ();
virtual void execute ();
virtual void notifySendingData ();
virtual void notifySendingResourceRequest ();
virtual void notifySendingAllResourceRequests ();
virtual void packResult ();
virtual void unpackResult ();
private :
virtual void notifySendingData ();
virtual void notifySendingResourceRequest ();
virtual void notifySendingAllResourceRequests ();
Thread * owner; /* Owner thread (i.e. 'uses' that service) */
private :
unsigned num_sent_rr; /* Number of RR not really sent (i.e. still in the sending queue)*/
Thread * owner; /* Owner thread (i.e. 'uses' that service) */
};
unsigned num_sent_rr; /* Number of RR not really sent (i.e. still in the sending queue)*/
};
extern Service * getService (SERVICE_ID __key);
extern Service * getService (SERVICE_ID __key);
#endif

View file

@ -1,4 +1,4 @@
/*
/*
* <thread.cpp>
* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007
* (C) OPAC Team, LIFL, 2002-2007
@ -42,79 +42,59 @@ static std :: vector <Thread *> threads;
unsigned num_act = 0;
Thread :: Thread ()
{
Thread :: Thread () {
threads.push_back (this);
act = false;
}
Thread :: ~ Thread ()
{
Thread :: ~ Thread () {
/* Nothing ! */
}
extern int getNodeRank ();
void Thread :: setActive ()
{
void Thread :: setActive () {
if (! act )
{
if (! act) {
act = true;
num_act ++;
// if (getNodeRank () == 1)
// printf ("On passe a %d\n", num_act);
}
act = true;
num_act ++;
}
}
void Thread :: setPassive ()
{
void Thread :: setPassive () {
if (act)
{
if (act) {
act = false;
num_act --;
// if (getNodeRank () == 1)
// printf ("On passe a %d\n", num_act);
}
act = false;
num_act --;
}
}
bool atLeastOneActiveThread ()
{
bool atLeastOneActiveThread () {
return num_act;
}
unsigned numberOfActiveThreads ()
{
static void * launch (void * __arg) {
return num_act;
}
static void * launch (void * __arg)
{
Thread * thr = (Thread *) __arg;
Thread * thr = (Thread *) __arg;
thr -> start ();
return 0;
}
void addThread (Thread * __hl_thread, std :: vector <pthread_t *> & __ll_threads)
{
void addThread (Thread * __hl_thread, std :: vector <pthread_t *> & __ll_threads) {
pthread_t * ll_thr = new pthread_t;
__ll_threads.push_back (ll_thr);
pthread_create (ll_thr, 0, launch, __hl_thread);
pthread_create (ll_thr, 0, launch, __hl_thread);
}
void joinThreads (std :: vector <pthread_t *> & __threads)
{
void joinThreads (std :: vector <pthread_t *> & __threads) {
for (unsigned i = 0; i < __threads.size (); i ++)
pthread_join (* __threads [i], 0);
for (unsigned i = 0; i < __threads.size (); i ++)
pthread_join (* __threads [i], 0);
}

View file

@ -1,4 +1,4 @@
/*
/*
* <thread.h>
* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007
* (C) OPAC Team, LIFL, 2002-2007
@ -41,28 +41,27 @@
/* A high-level thread */
class Thread
{
class Thread {
public:
public:
/* Ctor */
Thread ();
/* Ctor */
Thread ();
/* Dtor */
virtual ~ Thread ();
/* Go ! */
virtual void start () = 0;
/* Dtor */
virtual ~ Thread ();
void setActive ();/* It means the current process is going to send messages soon */
void setPassive ();/* The current process is not going to perform send operations
(but it may receive messages) */
/* Go ! */
virtual void start () = 0;
void setActive ();/* It means the current process is going to send messages soon */
void setPassive ();/* The current process is not going to perform send operations
(but it may receive messages) */
private :
bool act;
};
private :
bool act;
};
extern void addThread (Thread * __hl_thread, std :: vector <pthread_t *> & __ll_threads);
@ -71,7 +70,4 @@ extern void joinThreads (std :: vector <pthread_t *> & __ll_threads);
extern bool atLeastOneActiveThread (); /* It returns 'true' iff at least one process is going
to send messages */
extern unsigned numberOfActiveThreads ();
#endif /*THREAD_H_*/

View file

@ -1,4 +1,4 @@
/*
/*
* <topology.cpp>
* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007
* (C) OPAC Team, LIFL, 2002-2007
@ -36,15 +36,13 @@
#include "topology.h"
Topology :: ~ Topology ()
{
Topology :: ~ Topology () {
/* Nothing ! */
}
void Topology :: add (Cooperative & __mig)
{
mig.push_back (& __mig) ;
}
void Topology :: add (Cooperative & __mig) {
mig.push_back (& __mig) ;
}

View file

@ -1,4 +1,4 @@
/*
/*
* <topology.h>
* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007
* (C) OPAC Team, LIFL, 2002-2007
@ -41,22 +41,21 @@
#include "cooperative.h"
class Topology
{
class Topology {
public:
public:
virtual ~Topology ();
virtual ~Topology ();
void add (Cooperative & __mig);
void add (Cooperative & __mig);
virtual void setNeighbors (Cooperative * __mig,
std :: vector <Cooperative *> & __from,
std :: vector <Cooperative *> & __to) = 0;
virtual void setNeighbors (Cooperative * __mig,
std :: vector <Cooperative *> & __from,
std :: vector <Cooperative *> & __to) = 0;
protected:
protected:
std :: vector <Cooperative *> mig ;
};
std :: vector <Cooperative *> mig ;
};
#endif