Salome HOME
projects
/
modules
/
med.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
a4fb51c
)
Memory leak fix on DisjointDEC. union_comm was not freed properly.
author
abn
<adrien.bruneton@cea.fr>
Wed, 21 Oct 2015 12:56:11 +0000
(14:56 +0200)
committer
abn
<adrien.bruneton@cea.fr>
Wed, 21 Oct 2015 13:54:35 +0000
(15:54 +0200)
src/ParaMEDMEM/DisjointDEC.cxx
patch
|
blob
|
history
src/ParaMEDMEM/DisjointDEC.hxx
patch
|
blob
|
history
src/ParaMEDMEM/MPIProcessorGroup.cxx
patch
|
blob
|
history
src/ParaMEDMEM/MPIProcessorGroup.hxx
patch
|
blob
|
history
src/ParaMEDMEMTest/ParaMEDMEMTest_ICoco.cxx
patch
|
blob
|
history
diff --git
a/src/ParaMEDMEM/DisjointDEC.cxx
b/src/ParaMEDMEM/DisjointDEC.cxx
index e8ee329e96f013574d471d7e986c016619942df2..57e67fd2c93721871b57a49232740f8d0e8c55f6 100644
(file)
--- 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);
}
{
_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);
}
{
copyInstance(s);
}
@@
-111,9
+123,14
@@
namespace ParaMEDMEM
_union_group = _source_group->fuse(*_target_group);
}
_union_group = _source_group->fuse(*_target_group);
}
- DisjointDEC::DisjointDEC(const std::set<int>& source_ids, const std::set<int>& target_ids, const MPI_Comm& world_comm):_local_field(0),
- _owns_field(false),
- _owns_groups(true)
+ DisjointDEC::DisjointDEC(const std::set<int>& source_ids,
+ const std::set<int>& 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
{
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_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;
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;
{ // This process is not in union
_source_group=0;
_target_group=0;
_union_group=0;
+ comm.groupFree(&union_group);
+ comm.groupFree(&world_group);
return;
}
return;
}
@@
-162,10
+179,11
@@
namespace ParaMEDMEM
delete [] target_ranks_union;
// Create the MPIProcessorGroups
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);
_union_group = _source_group->fuse(*_target_group);
-
+ comm.groupFree(&union_group);
+ comm.groupFree(&world_group);
}
DisjointDEC::~DisjointDEC()
}
DisjointDEC::~DisjointDEC()
@@
-191,6
+209,8
@@
namespace ParaMEDMEM
_target_group=0;
delete _union_group;
_union_group=0;
_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)
}
void DisjointDEC::setNature(NatureOfField nature)
diff --git
a/src/ParaMEDMEM/DisjointDEC.hxx
b/src/ParaMEDMEM/DisjointDEC.hxx
index 521353f5ed5d5ee4f28ee55ed09873c3671023dc..aec6bb901c1b14faca452d897253437257689555 100644
(file)
--- a/
src/ParaMEDMEM/DisjointDEC.hxx
+++ b/
src/ParaMEDMEM/DisjointDEC.hxx
@@
-40,7
+40,10
@@
namespace ParaMEDMEM
class DisjointDEC : public DEC
{
public:
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);
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;
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 5b7c2405526b2483c4307b487565372ac77f1f05..922f209201bc8f05b9c44960d1cd306bf8e7ca8e 100644
(file)
--- a/
src/ParaMEDMEM/MPIProcessorGroup.cxx
+++ b/
src/ParaMEDMEM/MPIProcessorGroup.cxx
@@
-85,7
+85,7
@@
namespace ParaMEDMEM
*/
MPIProcessorGroup::MPIProcessorGroup(const CommInterface& interface, set<int> proc_ids, const MPI_Comm& world_comm):
*/
MPIProcessorGroup::MPIProcessorGroup(const CommInterface& interface, set<int> proc_ids, const MPI_Comm& world_comm):
- ProcessorGroup(interface, proc_ids),_world_comm(world_comm)
+ ProcessorGroup(interface, proc_ids),
_world_comm(world_comm)
{
updateMPISpecificAttributes();
}
{
updateMPISpecificAttributes();
}
diff --git
a/src/ParaMEDMEM/MPIProcessorGroup.hxx
b/src/ParaMEDMEM/MPIProcessorGroup.hxx
index d4f25eed4d951f601443b979e3b9eec1a602085e..7c39ed26dfdad4edf539f69afcd7a36b065db8fa 100644
(file)
--- a/
src/ParaMEDMEM/MPIProcessorGroup.hxx
+++ b/
src/ParaMEDMEM/MPIProcessorGroup.hxx
@@
-51,7
+51,7
@@
namespace ParaMEDMEM
private:
void updateMPISpecificAttributes();
private:
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;
};
MPI_Group _group;
MPI_Comm _comm;
};
diff --git
a/src/ParaMEDMEMTest/ParaMEDMEMTest_ICoco.cxx
b/src/ParaMEDMEMTest/ParaMEDMEMTest_ICoco.cxx
index a4624005ddf5f1df505d98397dfe6badd4734b9b..f46c7674982d18c85e6a67934c321aefa68720c5 100644
(file)
--- 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);
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;
if (size !=2) return ;
CommInterface comm;