diff --git a/eo/src/mpi/eoMpi.h b/eo/src/mpi/eoMpi.h index 940f41292..7dafe1289 100644 --- a/eo/src/mpi/eoMpi.h +++ b/eo/src/mpi/eoMpi.h @@ -25,6 +25,7 @@ namespace eo namespace Channel { const int Commands = 0; + const int Messages = 1; } namespace Message @@ -33,26 +34,32 @@ namespace eo const int Finish = 1; } + template< typename JobData, typename Wrapped > struct SharedDataFunction { - SharedDataFunction( Wrapped * w ) + SharedDataFunction( Wrapped * w = 0 ) : _wrapped( w ) { - wrapped = w; + // empty + } + + void wrapped( Wrapped * w ) + { + _wrapped = w; } void data( JobData* _d ) { d = _d; - if( wrapped ) + if( _wrapped ) { - wrapped->data( _d ); + _wrapped->data( _d ); } } protected: JobData* d; - Wrapped* wrapped; + Wrapped* _wrapped; }; template< typename JobData > @@ -110,11 +117,78 @@ namespace eo template< typename JobData > struct JobStore { - virtual SendTaskFunction & sendTask() const = 0; - virtual HandleResponseFunction & handleResponse() const = 0; - virtual ProcessTaskFunction & processTask() const = 0; - virtual IsFinishedFunction & isFinished() const = 0; + JobStore( + SendTaskFunction* stf, + HandleResponseFunction* hrf, + ProcessTaskFunction* ptf, + IsFinishedFunction* iff + ) : + _stf( stf ), _hrf( hrf ), _ptf( ptf ), _iff( iff ) + { + // empty + } + + JobStore() + { + // empty + } + + SendTaskFunction & sendTask() { return *_stf; } + HandleResponseFunction & handleResponse() { return *_hrf; } + ProcessTaskFunction & processTask() { return *_ptf; } + IsFinishedFunction & isFinished() { return *_iff; } + + void sendTask( SendTaskFunction* stf ) { _stf = stf; } + void handleResponse( HandleResponseFunction* hrf ) { _hrf = hrf; } + void processTask( ProcessTaskFunction* ptf ) { _ptf = ptf; } + void isFinished( IsFinishedFunction* iff ) { _iff = iff; } + + void wrapSendTask( SendTaskFunction* stf ) + { + if( stf ) + { + stf->wrapped( _stf ); + _stf = stf; + } + } + + void wrapHandleResponse( HandleResponseFunction* hrf ) + { + if( hrf ) + { + hrf->wrapped( _hrf ); + _hrf = hrf; + } + } + + void wrapProcessTask( ProcessTaskFunction* ptf ) + { + if( ptf ) + { + ptf->wrapped( _ptf ); + _ptf = ptf; + } + } + + void wrapIsFinished( IsFinishedFunction* iff ) + { + if( iff ) + { + iff->wrapped( _iff ); + _iff = iff; + } + } + + // TODO commenter : laissé à la couche d'en dessous car impossible d'initialiser une donnée membre d'une classe mère depuis une classe fille. virtual JobData* data() = 0; + + protected: + + // TODO commenter : Utiliser des pointeurs pour éviter d'écraser les fonctions wrappées + SendTaskFunction< JobData >* _stf; + HandleResponseFunction< JobData >* _hrf; + ProcessTaskFunction< JobData >* _ptf; + IsFinishedFunction< JobData >* _iff; }; template< class JobData > @@ -141,15 +215,6 @@ namespace eo isFinished.data( store.data() ); } - /* - // master - virtual bool isFinished() = 0; - virtual void sendTask( int wrkRank ) = 0; - virtual void handleResponse( int wrkRank ) = 0; - // worker - virtual void processTask( ) = 0; - */ - protected: SendTaskFunction & sendTask; diff --git a/eo/src/mpi/eoParallelApply.h b/eo/src/mpi/eoParallelApply.h index 94549fc31..1487da9fb 100644 --- a/eo/src/mpi/eoParallelApply.h +++ b/eo/src/mpi/eoParallelApply.h @@ -153,6 +153,11 @@ namespace eo template< class EOT > struct ParallelApplyStore : public JobStore< ParallelApplyData > { + using JobStore< ParallelApplyData >::_stf; + using JobStore< ParallelApplyData >::_hrf; + using JobStore< ParallelApplyData >::_ptf; + using JobStore< ParallelApplyData >::_iff; + ParallelApplyStore( eoUF & _proc, std::vector& _pop, @@ -162,42 +167,28 @@ namespace eo ) : _data( _proc, _pop, _masterRank, _packetSize ) { - stpa = new SendTaskParallelApply; - hrpa = new HandleResponseParallelApply; - ptpa = new ProcessTaskParallelApply; - ispa = new IsFinishedParallelApply; + _stf = new SendTaskParallelApply; + _hrf = new HandleResponseParallelApply; + _ptf = new ProcessTaskParallelApply; + _iff = new IsFinishedParallelApply; } - ~ParallelApplyStore() - { - delete stpa; - delete hrpa; - delete ptpa; - delete ispa; - } - - SendTaskParallelApply< EOT >& sendTask() const { return *stpa; } - HandleResponseParallelApply< EOT >& handleResponse() const { return *hrpa; } - ProcessTaskParallelApply< EOT > & processTask() const { return *ptpa; } - IsFinishedParallelApply< EOT >& isFinished() const { return *ispa; } - - void sendTask( SendTaskParallelApply< EOT >* _stpa ) { stpa = _stpa; } - void handleResponse( HandleResponseParallelApply< EOT >* _hrpa ) { hrpa = _hrpa; } - void processTask( ProcessTaskParallelApply< EOT >* _ptpa ) { ptpa = _ptpa; } - void isFinished( IsFinishedParallelApply< EOT >* _ispa ) { ispa = _ispa; } - ParallelApplyData* data() { return &_data; } - protected: - // TODO commenter : Utiliser des pointeurs pour éviter d'écraser les fonctions wrappées - SendTaskParallelApply* stpa; - HandleResponseParallelApply* hrpa; - ProcessTaskParallelApply* ptpa; - IsFinishedParallelApply* ispa; + ~ParallelApplyStore() + { + delete _stf; + delete _hrf; + delete _ptf; + delete _iff; + } + protected: ParallelApplyData _data; }; + // TODO commentaire : impossible de faire un typedef sur un template sans passer + // par un traits => complique la tâche de l'utilisateur pour rien. template< typename EOT > class ParallelApply : public Job< ParallelApplyData > { @@ -212,10 +203,6 @@ namespace eo { // empty } - - protected: - - // bmpi::communicator& comm; }; } } diff --git a/eo/test/mpi/wrapper.cpp b/eo/test/mpi/wrapper.cpp index c653d5f86..e2bf25d62 100644 --- a/eo/test/mpi/wrapper.cpp +++ b/eo/test/mpi/wrapper.cpp @@ -19,16 +19,16 @@ struct plusOne : public eoUF< int&, void > template< class EOT > struct ShowWrappedResult : public IsFinishedParallelApply { - using IsFinishedParallelApply::wrapped; + using IsFinishedParallelApply::_wrapped; - ShowWrappedResult ( IsFinishedParallelApply * w ) : IsFinishedParallelApply( w ), times( 0 ) + ShowWrappedResult ( IsFinishedParallelApply * w = 0 ) : IsFinishedParallelApply( w ), times( 0 ) { // empty } bool operator()() { - bool wrappedValue = wrapped->operator()(); // (*wrapped)(); + bool wrappedValue = _wrapped->operator()(); // (*_wrapped)(); cout << times << ") Wrapped function would say that it is " << ( wrappedValue ? "":"not ") << "finished" << std::endl; ++times; return wrappedValue; @@ -61,12 +61,11 @@ int main(int argc, char** argv) StaticAssignmentAlgorithm assign( v.size() ); ParallelApplyStore< int > store( plusOneInstance, v, 0, 1 ); - IsFinishedParallelApply< int >& wrapped = store.isFinished(); - ShowWrappedResult< int >* wrapper = new ShowWrappedResult( &wrapped ); - store.isFinished( wrapper ); + store.wrapIsFinished( new ShowWrappedResult ); - // Job< ParallelApplyData > job( assign, 0, store ); ParallelApply job( assign, 0, store ); + // Equivalent to: + // Job< ParallelApplyData > job( assign, 0, store ); job.run(); if( job.isMaster() )