diff options
author | Erik Schnetter <schnetter@gmail.com> | 2013-08-06 12:56:10 -0400 |
---|---|---|
committer | Erik Schnetter <schnetter@gmail.com> | 2013-08-06 13:11:11 -0400 |
commit | b6b6b71ca4c1de25e5d8f2dbc515d052b72aba32 (patch) | |
tree | c2ed6f24c83205415e5f8508921dd1bf848101f3 | |
parent | 849b1e88db67e2a49d8acb04f71e1951ddc8b02c (diff) |
Carpet: Release all memory when shutting down
Deallocate all metadata and grid functions when shutting down. This avoids Valgrind errors.
-rw-r--r-- | Carpet/Carpet/src/Shutdown.cc | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/Carpet/Carpet/src/Shutdown.cc b/Carpet/Carpet/src/Shutdown.cc index 0d5fbe244..c9b85019c 100644 --- a/Carpet/Carpet/src/Shutdown.cc +++ b/Carpet/Carpet/src/Shutdown.cc @@ -79,6 +79,8 @@ namespace Carpet { } END_REVERSE_MGLEVEL_LOOP; + + main_timer_tree.root->stop(); if (output_timer_tree_every > 0) { @@ -93,6 +95,54 @@ namespace Carpet { if (output_xml_timer_tree) { main_timer_tree.root->outputXML(out_dir,CCTK_MyProc (cctkGH)); } + + + + // Delete timer tree + delete main_timer_tree.root; main_timer_tree.root = 0; + delete mode_timer_tree.root; mode_timer_tree.root = 0; + + // Free all memory, call all destructors + for (size_t gi=0; gi<arrdata.size(); ++gi) { + for (size_t m=0; m<arrdata.AT(gi).size(); ++m) { + for (size_t vi=0; vi<arrdata.AT(gi).AT(m).data.size(); ++vi) { + ggf*& f = arrdata.AT(gi).AT(m).data.AT(vi); + if (f) { + delete f; f = 0; + } + } + } + } + // for (int gi=0; gi<CCTK_NumGroups(); ++gi) { + // const int tls = 0; + // CCTK_GroupStorageDecrease(cctkGH, 1, &gi, &tls, 0); + // } + + for (size_t gi=0; gi<arrdata.size(); ++gi) { + if (CCTK_GroupTypeI(gi) == CCTK_GF) { + for (size_t m=0; m<arrdata.AT(gi).size(); ++m) { + arrdata.AT(gi).AT(m).tt = 0; + arrdata.AT(gi).AT(m).dd = 0; + arrdata.AT(gi).AT(m).hh = 0; + } + } else { + for (size_t m=0; m<arrdata.AT(gi).size(); ++m) { + delete arrdata.AT(gi).AT(m).tt; arrdata.AT(gi).AT(m).tt = 0; + delete arrdata.AT(gi).AT(m).dd; arrdata.AT(gi).AT(m).dd = 0; + delete arrdata.AT(gi).AT(m).hh; arrdata.AT(gi).AT(m).hh = 0; + } + } + } + + delete tt; tt = 0; + for (size_t m=0; m<vdd.size(); ++m) { + delete vdd.AT(m); vdd.AT(m) = 0; + } + for (size_t m=0; m<vhh.size(); ++m) { + delete vhh.AT(m); vhh.AT(m) = 0; + } + + // earlier checkpoint before finalising MPI Waypoint ("Done with shutdown"); |