From: abn Date: Wed, 21 Oct 2015 12:56:11 +0000 (+0200) Subject: Memory leak fix on DisjointDEC. union_comm was not freed properly. X-Git-Tag: V8_0_pre~5 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=1f524fd9bdec402d829cbaf369fb194f90c8af20;p=tools%2Fmedcoupling.git Memory leak fix on DisjointDEC. union_comm was not freed properly. --- diff --git a/src/ParaMEDMEM/DisjointDEC.cxx b/src/ParaMEDMEM/DisjointDEC.cxx index e8ee329e9..57e67fd2c 100644 --- a/src/ParaMEDMEM/DisjointDEC.cxx +++ b/src/ParaMEDMEM/DisjointDEC.cxx @@ -72,16 +72,28 @@ namespace ParaMEDMEM */ - DisjointDEC::DisjointDEC(ProcessorGroup& source_group, ProcessorGroup& target_group):_local_field(0), - _source_group(&source_group), - _target_group(&target_group), - _owns_field(false), - _owns_groups(false) + DisjointDEC::DisjointDEC(ProcessorGroup& source_group, ProcessorGroup& target_group): + _local_field(0), + _source_group(&source_group), + _target_group(&target_group), + _comm_interface(0), + _owns_field(false), + _owns_groups(false), + _union_comm(MPI_COMM_NULL) { _union_group = source_group.fuse(target_group); } - DisjointDEC::DisjointDEC(const DisjointDEC& s):DEC(s),_local_field(0),_union_group(0),_source_group(0),_target_group(0),_owns_field(false),_owns_groups(false) + DisjointDEC::DisjointDEC(const DisjointDEC& s): + DEC(s), + _local_field(0), + _union_group(0), + _source_group(0), + _target_group(0), + _comm_interface(0), + _owns_field(false), + _owns_groups(false), + _union_comm(MPI_COMM_NULL) { copyInstance(s); } @@ -111,9 +123,14 @@ namespace ParaMEDMEM _union_group = _source_group->fuse(*_target_group); } - DisjointDEC::DisjointDEC(const std::set& source_ids, const std::set& target_ids, const MPI_Comm& world_comm):_local_field(0), - _owns_field(false), - _owns_groups(true) + DisjointDEC::DisjointDEC(const std::set& source_ids, + const std::set& target_ids, + const MPI_Comm& world_comm): + _local_field(0), + _owns_field(false), + _owns_groups(true), + _comm_interface(0), + _union_comm(MPI_COMM_NULL) { ParaMEDMEM::CommInterface comm; // Create the list of procs including source and target @@ -129,15 +146,15 @@ namespace ParaMEDMEM MPI_Group union_group,world_group; comm.commGroup(world_comm,&world_group); comm.groupIncl(world_group,union_ids.size(),union_ranks_world,&union_group); - MPI_Comm union_comm; - comm.commCreate(world_comm,union_group,&union_comm); + comm.commCreate(world_comm,union_group,&_union_comm); delete[] union_ranks_world; - - if (union_comm==MPI_COMM_NULL) + if (_union_comm==MPI_COMM_NULL) { // This process is not in union _source_group=0; _target_group=0; _union_group=0; + comm.groupFree(&union_group); + comm.groupFree(&world_group); return; } @@ -162,10 +179,11 @@ namespace ParaMEDMEM delete [] target_ranks_union; // Create the MPIProcessorGroups - _source_group = new MPIProcessorGroup(comm,source_ids_union,union_comm); - _target_group = new MPIProcessorGroup(comm,target_ids_union,union_comm); + _source_group = new MPIProcessorGroup(comm,source_ids_union,_union_comm); + _target_group = new MPIProcessorGroup(comm,target_ids_union,_union_comm); _union_group = _source_group->fuse(*_target_group); - + comm.groupFree(&union_group); + comm.groupFree(&world_group); } DisjointDEC::~DisjointDEC() @@ -191,6 +209,8 @@ namespace ParaMEDMEM _target_group=0; delete _union_group; _union_group=0; + if (_union_comm != MPI_COMM_NULL) + _comm_interface->commFree(&_union_comm); } void DisjointDEC::setNature(NatureOfField nature) diff --git a/src/ParaMEDMEM/DisjointDEC.hxx b/src/ParaMEDMEM/DisjointDEC.hxx index 521353f5e..aec6bb901 100644 --- a/src/ParaMEDMEM/DisjointDEC.hxx +++ b/src/ParaMEDMEM/DisjointDEC.hxx @@ -40,7 +40,10 @@ namespace ParaMEDMEM class DisjointDEC : public DEC { public: - DisjointDEC():_local_field(0),_union_group(0),_source_group(0),_target_group(0),_owns_field(false),_owns_groups(false) { } + DisjointDEC():_local_field(0),_union_group(0),_source_group(0),_target_group(0), + _owns_field(false),_owns_groups(false), + _comm_interface(0), _union_comm(MPI_COMM_NULL) + { } DisjointDEC(ProcessorGroup& source_group, ProcessorGroup& target_group); DisjointDEC(const DisjointDEC&); DisjointDEC &operator=(const DisjointDEC& s); @@ -80,6 +83,7 @@ namespace ParaMEDMEM const CommInterface* _comm_interface; bool _owns_field; bool _owns_groups; + MPI_Comm _union_comm; }; } diff --git a/src/ParaMEDMEM/MPIProcessorGroup.cxx b/src/ParaMEDMEM/MPIProcessorGroup.cxx index 5b7c24055..922f20920 100644 --- a/src/ParaMEDMEM/MPIProcessorGroup.cxx +++ b/src/ParaMEDMEM/MPIProcessorGroup.cxx @@ -85,7 +85,7 @@ namespace ParaMEDMEM */ MPIProcessorGroup::MPIProcessorGroup(const CommInterface& interface, set proc_ids, const MPI_Comm& world_comm): - ProcessorGroup(interface, proc_ids),_world_comm(world_comm) + ProcessorGroup(interface, proc_ids), _world_comm(world_comm) { updateMPISpecificAttributes(); } diff --git a/src/ParaMEDMEM/MPIProcessorGroup.hxx b/src/ParaMEDMEM/MPIProcessorGroup.hxx index d4f25eed4..7c39ed26d 100644 --- a/src/ParaMEDMEM/MPIProcessorGroup.hxx +++ b/src/ParaMEDMEM/MPIProcessorGroup.hxx @@ -51,7 +51,7 @@ namespace ParaMEDMEM private: void updateMPISpecificAttributes(); private: - const MPI_Comm _world_comm; + const MPI_Comm _world_comm; // just an observer - current instance is not responsible for the management of this comm MPI_Group _group; MPI_Comm _comm; }; diff --git a/src/ParaMEDMEMTest/ParaMEDMEMTest_ICoco.cxx b/src/ParaMEDMEMTest/ParaMEDMEMTest_ICoco.cxx index a4624005d..f46c76749 100644 --- a/src/ParaMEDMEMTest/ParaMEDMEMTest_ICoco.cxx +++ b/src/ParaMEDMEMTest/ParaMEDMEMTest_ICoco.cxx @@ -102,7 +102,7 @@ void ParaMEDMEMTest::testICoco1() MPI_Comm_size(MPI_COMM_WORLD,&size); MPI_Comm_rank(MPI_COMM_WORLD,&rank); - //the test is meant to run on five processors + //the test is meant to run on 2 processors if (size !=2) return ; CommInterface comm;