From 108c0bcf35e9e480ef9b0bb8843ad99270c15ccf Mon Sep 17 00:00:00 2001 From: Benjamin Bouvier Date: Wed, 11 Jul 2012 10:41:48 +0200 Subject: [PATCH] Automatic deleting functors, only if necessary. --- eo/src/mpi/eoMpi.h | 25 +++++++++++----- eo/src/mpi/eoMultiParallelApply.h | 2 -- eo/src/mpi/eoParallelApply.h | 49 ++++++++++++++++++++++++------- eo/src/mpi/eoTerminateJob.h | 4 +++ 4 files changed, 60 insertions(+), 20 deletions(-) diff --git a/eo/src/mpi/eoMpi.h b/eo/src/mpi/eoMpi.h index c277ddd0..fc419b13 100644 --- a/eo/src/mpi/eoMpi.h +++ b/eo/src/mpi/eoMpi.h @@ -40,11 +40,19 @@ namespace eo template< typename JobData, typename Wrapped > struct SharedDataFunction { - SharedDataFunction( Wrapped * w = 0 ) : _wrapped( w ) + SharedDataFunction( Wrapped * w = 0 ) : _wrapped( w ), _needDelete( false ) { // empty } + virtual ~SharedDataFunction() + { + if( _wrapped && _wrapped->needDelete() ) + { + delete _wrapped; + } + } + void wrapped( Wrapped * w ) { _wrapped = w; @@ -59,9 +67,13 @@ namespace eo } } + bool needDelete() { return _needDelete; } + void needDelete( bool b ) { _needDelete = b; } + protected: JobData* d; Wrapped* _wrapped; + bool _needDelete; }; template< typename JobData > @@ -119,7 +131,6 @@ namespace eo template< typename JobData > struct JobStore { - // TODO commentaire: ces pointeurs devraient être alloués avec new pour éviter segfault on quit. JobStore( SendTaskFunction* stf, HandleResponseFunction* hrf, @@ -138,12 +149,10 @@ namespace eo ~JobStore() { - // TODO commentaire: Composition Pattern => délégation de la destruction => destruction homogène => new - // et delete partout. - delete _stf; - delete _hrf; - delete _ptf; - delete _iff; + if( _stf->needDelete() ) delete _stf; + if( _hrf->needDelete() ) delete _hrf; + if( _ptf->needDelete() ) delete _ptf; + if( _iff->needDelete() ) delete _iff; } SendTaskFunction & sendTask() { return *_stf; } diff --git a/eo/src/mpi/eoMultiParallelApply.h b/eo/src/mpi/eoMultiParallelApply.h index 85b1689e..f4fe47b5 100644 --- a/eo/src/mpi/eoMultiParallelApply.h +++ b/eo/src/mpi/eoMultiParallelApply.h @@ -27,7 +27,6 @@ namespace eo ~ProcessTaskParallelEval() { - delete _wrapped; } }; @@ -39,7 +38,6 @@ namespace eo ParallelEvalStore( eoUF & _proc, int _masterRank, - // long _maxTime = 0, int _packetSize = 1 ) : ParallelApplyStore< EOT >( _proc, *( new std::vector ), _masterRank, _packetSize ) diff --git a/eo/src/mpi/eoParallelApply.h b/eo/src/mpi/eoParallelApply.h index d93b5b81..9598b952 100644 --- a/eo/src/mpi/eoParallelApply.h +++ b/eo/src/mpi/eoParallelApply.h @@ -21,17 +21,23 @@ namespace eo { ParallelApplyData( eoUF & _proc, - std::vector & _pop, int _masterRank, // long _maxTime = 0, - int _packetSize + int _packetSize, + std::vector * _pop = 0 ) : - _data( &_pop ), func( _proc ), index( 0 ), size( _pop.size() ), packetSize( _packetSize ), masterRank( _masterRank ), comm( Node::comm() ) + _data( _pop ), func( _proc ), index( 0 ), packetSize( _packetSize ), masterRank( _masterRank ), comm( Node::comm() ) { if ( _packetSize <= 0 ) { throw std::runtime_error("Packet size should not be negative."); } + + if( _pop ) + { + size = _pop->size(); + } + tempArray = new EOT[ _packetSize ]; } @@ -172,18 +178,36 @@ namespace eo ParallelApplyStore( eoUF & _proc, - std::vector& _pop, int _masterRank, - // long _maxTime = 0, int _packetSize = 1, // JobStore functors - SendTaskParallelApply * stpa = new SendTaskParallelApply, - HandleResponseParallelApply* hrpa = new HandleResponseParallelApply, - ProcessTaskParallelApply* ptpa = new ProcessTaskParallelApply, - IsFinishedParallelApply* ifpa = new IsFinishedParallelApply + SendTaskParallelApply * stpa = 0, + HandleResponseParallelApply* hrpa = 0, + ProcessTaskParallelApply* ptpa = 0, + IsFinishedParallelApply* ifpa = 0 ) : - _data( _proc, _pop, _masterRank, _packetSize ) + _data( _proc, _masterRank, _packetSize ) { + if( stpa == 0 ) { + stpa = new SendTaskParallelApply; + stpa->needDelete( true ); + } + + if( hrpa == 0 ) { + hrpa = new HandleResponseParallelApply; + hrpa->needDelete( true ); + } + + if( ptpa == 0 ) { + ptpa = new ProcessTaskParallelApply; + ptpa->needDelete( true ); + } + + if( ifpa == 0 ) { + ifpa = new IsFinishedParallelApply; + ifpa->needDelete( true ); + } + _stf = stpa; _hrf = hrpa; _ptf = ptpa; @@ -192,6 +216,11 @@ namespace eo ParallelApplyData* data() { return &_data; } + void data( std::vector& _pop ) + { + _data.init( _pop ); + } + virtual ~ParallelApplyStore() { } diff --git a/eo/src/mpi/eoTerminateJob.h b/eo/src/mpi/eoTerminateJob.h index 4dc9f421..ed45ca05 100644 --- a/eo/src/mpi/eoTerminateJob.h +++ b/eo/src/mpi/eoTerminateJob.h @@ -49,9 +49,13 @@ namespace eo DummyJobStore() { _stf = new DummySendTaskFunction; + _stf->needDelete( true ); _hrf = new DummyHandleResponseFunction; + _hrf->needDelete( true ); _ptf = new DummyProcessTaskFunction; + _ptf->needDelete( true ); _iff = new DummyIsFinishedFunction; + _iff->needDelete( true ); } void* data() { return 0; }