TIMPI
semipermanent.h
Go to the documentation of this file.
1 // The TIMPI Message-Passing Parallelism Library.
2 // Copyright (C) 2002-2025 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner
3 
4 // This library is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU Lesser General Public
6 // License as published by the Free Software Foundation; either
7 // version 2.1 of the License, or (at your option) any later version.
8 
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 // Lesser General Public License for more details.
13 
14 // You should have received a copy of the GNU Lesser General Public
15 // License along with this library; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 
18 
19 
20 #ifndef TIMPI_SEMIPERMANENT_H
21 #define TIMPI_SEMIPERMANENT_H
22 
23 
24 // Local includes
25 #include "timpi/timpi_config.h"
26 
27 // C/C++ includes
28 
29 #include <memory>
30 #include <vector>
31 
32 namespace TIMPI
33 {
34 
35 // Forward declare friend
36 class TIMPIInit;
37 
49 {
50 public:
51  SemiPermanent() = default;
52  virtual ~SemiPermanent() = default;
53 
54  /*
55  * Transfer ownership of a pointer to some "SemiPermanent" objects,
56  * to be destroyed (and thereby do any necessary cleanup work)
57  * whenever the last TIMPIInit is destroyed, before MPI is
58  * finalized.
59  */
60  static void add(std::unique_ptr<SemiPermanent> obj);
61 
62  // Class to hold a reference to the SemiPermanent objects; they will
63  // only be destructed when the last Ref is.
64  struct Ref {
65  Ref() { _ref_count++; }
66  ~Ref();
67  };
68 
69 private:
70 
71  // Mechanisms to avoid leaks after every TIMPIInit has been
72  // destroyed
73  static int _ref_count;
74  static std::vector<std::unique_ptr<SemiPermanent>> _stuff_to_clean;
75 };
76 
77 
78 } // namespace TIMPI
79 
80 #endif // TIMPI_SEMIPERMANENT_H
virtual ~SemiPermanent()=default
static std::vector< std::unique_ptr< SemiPermanent > > _stuff_to_clean
Definition: semipermanent.h:74
The SemiPermanent "class" is basically just a place for a destructor vtable.
Definition: semipermanent.h:48
static void add(std::unique_ptr< SemiPermanent > obj)
Definition: semipermanent.C:42