Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/global/management/include/G4AllocatorPool.hh

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  1 //
  2 // ********************************************************************
  3 // * License and Disclaimer                                           *
  4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.                             *
 10 // *                                                                  *
 11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                                                  *
 18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // ********************************************************************
 25 //
 26 // G4AllocatorPool
 27 //
 28 // Class description:
 29 //
 30 // Class implementing a memory pool for fast allocation and deallocation
 31 // of memory chunks.  The size of the chunks for small allocated objects
 32 // is fixed to 1Kb and takes into account of memory alignment; for large
 33 // objects it is set to 10 times the object's size.
 34 // The implementation is derived from: B.Stroustrup, The C++ Programming
 35 // Language, Third Edition.
 36 
 37 //           -------------- G4AllocatorPool ----------------
 38 //
 39 // Author: G.Cosmo (CERN), November 2000
 40 // --------------------------------------------------------------------
 41 #ifndef G4AllocatorPool_hh
 42 #define G4AllocatorPool_hh 1
 43 
 44 class G4AllocatorPool
 45 {
 46  public:
 47   explicit G4AllocatorPool(unsigned int n = 0);
 48   // Create a pool of elements of size n
 49   ~G4AllocatorPool();
 50   // Destructor. Return storage to the free store
 51 
 52   G4AllocatorPool(const G4AllocatorPool& right) = default;
 53   // Copy constructor
 54   G4AllocatorPool& operator=(const G4AllocatorPool& right);
 55   // Equality operator
 56 
 57   inline void* Alloc();
 58   // Allocate one element
 59   inline void Free(void* b);
 60   // Return an element back to the pool
 61 
 62   inline unsigned int Size() const;
 63   // Return storage size
 64   void Reset();
 65   // Return storage to the free store
 66 
 67   inline int GetNoPages() const;
 68   // Return the total number of allocated pages
 69   inline unsigned int GetPageSize() const;
 70   // Accessor for default page size
 71   inline void GrowPageSize(unsigned int factor);
 72   // Increase default page size by a given factor
 73 
 74  private:
 75   struct G4PoolLink
 76   {
 77     G4PoolLink* next;
 78   };
 79   class G4PoolChunk
 80   {
 81    public:
 82     explicit G4PoolChunk(unsigned int sz)
 83       : size(sz)
 84       , mem(new char[size])
 85       , next(nullptr)
 86     {
 87       ;
 88     }
 89     ~G4PoolChunk() { delete[] mem; }
 90     const unsigned int size;
 91     char* mem;
 92     G4PoolChunk* next;
 93   };
 94 
 95   void Grow();
 96   // Make pool larger
 97 
 98  private:
 99   const unsigned int esize;
100   unsigned int csize;
101   G4PoolChunk* chunks = nullptr;
102   G4PoolLink* head    = nullptr;
103   int nchunks         = 0;
104 };
105 
106 // ------------------------------------------------------------
107 // Inline implementation
108 // ------------------------------------------------------------
109 
110 // ************************************************************
111 // Alloc
112 // ************************************************************
113 //
114 inline void* G4AllocatorPool::Alloc()
115 {
116   if(head == nullptr)
117   {
118     Grow();
119   }
120   G4PoolLink* p = head;  // return first element
121   head          = p->next;
122   return p;
123 }
124 
125 // ************************************************************
126 // Free
127 // ************************************************************
128 //
129 inline void G4AllocatorPool::Free(void* b)
130 {
131   auto* p = static_cast<G4PoolLink*>(b);
132   p->next       = head;  // put b back as first element
133   head          = p;
134 }
135 
136 // ************************************************************
137 // Size
138 // ************************************************************
139 //
140 inline unsigned int G4AllocatorPool::Size() const { return nchunks * csize; }
141 
142 // ************************************************************
143 // GetNoPages
144 // ************************************************************
145 //
146 inline int G4AllocatorPool::GetNoPages() const { return nchunks; }
147 
148 // ************************************************************
149 // GetPageSize
150 // ************************************************************
151 //
152 inline unsigned int G4AllocatorPool::GetPageSize() const { return csize; }
153 
154 // ************************************************************
155 // GrowPageSize
156 // ************************************************************
157 //
158 inline void G4AllocatorPool::GrowPageSize(unsigned int sz)
159 {
160   csize = (sz) != 0u ? sz * csize : csize;
161 }
162 
163 #endif
164