ATLAS Offline Software
Loading...
Searching...
No Matches
SG::ArenaBlockAllocatorBase Class Referenceabstract

Common functionality for block-oriented allocators. More...

#include <ArenaBlockAllocatorBase.h>

Inheritance diagram for SG::ArenaBlockAllocatorBase:
Collaboration diagram for SG::ArenaBlockAllocatorBase:

Public Types

typedef char * pointer
 Type for pointers to elements.
typedef const char * const_pointer
 And a const version of the pointer.
typedef void func_t(pointer)
 Type of functions for constructor, etc.

Public Member Functions

 ArenaBlockAllocatorBase (const Params &params)
 Constructor.
virtual ~ArenaBlockAllocatorBase ()
 Destructor.
 ArenaBlockAllocatorBase (const ArenaBlockAllocatorBase &)=delete
 Don't allow copy construction or assignment.
ArenaBlockAllocatorBaseoperator= (const ArenaBlockAllocatorBase &)=delete
 ArenaBlockAllocatorBase (ArenaBlockAllocatorBase &&other)
 Move constructor.
ArenaBlockAllocatorBaseoperator= (ArenaBlockAllocatorBase &&other)
 Move assignment.
void swap (ArenaBlockAllocatorBase &other)
 Swap.
virtual void reserve (size_t size) override
 Set the total number of elements cached by the allocator.
virtual void erase () override
 Free all allocated elements and release memory back to the system.
virtual Stats stats () const override
 Return the statistics block for this allocator.
virtual const std::string & name () const override
 Return the name of this allocator.
const Paramsparams () const
 Return this Allocator's parameters.
void protect ()
 Write-protect the memory managed by this allocator.
void unprotect ()
 Write-enable the memory managed by this allocator.
virtual void reset ()=0
 Free all allocated elements.
virtual void report (std::ostream &os) const
 Generate a report on the memory usage of this allocator.

Static Public Member Functions

template<class T>
static func_tmakeConstructor (const std::false_type &)
 Make a constructor function pointer for a non-trivial constructor.
template<class T>
static func_tmakeConstructor (const std::true_type &)
 Make a constructor function pointer for a trivial constructor.
template<class T>
static func_tmakeDestructor (const std::false_type &)
 Make a constructor function pointer for a non-trivial destructor.
template<class T>
static func_tmakeDestructor (const std::true_type &)
 Make a constructor function pointer for a trivial destructor.
template<class T>
static func_tmakeClear (const std::false_type &)
 Make a function pointer for a clear function.
template<class T>
static func_tmakeClear (const std::true_type &)
 Make a dummy clear function pointer.

Protected Member Functions

ArenaBlockgetBlock ()
 Return an empty block, either newly-allocated or from the free list.
void eraseUnprotected ()
 Free all allocated elements and release memory back to the system.

Protected Attributes

Params m_params
 The parameters for this allocator.
ArenaBlockm_blocks
 The list of blocks currently in use.
ArenaBlockm_freeblocks
 The list of free blocks.
ArenaAllocatorBase::Stats m_stats
 The statistics structure.
bool m_protected
 Flag whether the arena has been protected.

Static Private Member Functions

template<typename T>
static void construct_fcn (pointer p)
 Call T's default constructor on the object at p.
template<typename T>
static void destroy_fcn (pointer p)
 Call T's destructor on the object at p.
template<typename T>
static void clear_fcn (pointer p)
 Call T::clear on the object at p.

Detailed Description

Common functionality for block-oriented allocators.

See Arena.h for an overview of the arena-based memory allocators.

This class factors out some common functionality for allocators that use ArenaBlock.

Definition at line 33 of file ArenaBlockAllocatorBase.h.

Member Typedef Documentation

◆ const_pointer

typedef const char* SG::ArenaAllocatorBase::const_pointer
inherited

And a const version of the pointer.

Definition at line 140 of file ArenaAllocatorBase.h.

◆ func_t

typedef void SG::ArenaAllocatorBase::func_t(pointer)
inherited

Type of functions for constructor, etc.

Definition at line 143 of file ArenaAllocatorBase.h.

◆ pointer

typedef char* SG::ArenaAllocatorBase::pointer
inherited

Type for pointers to elements.

Definition at line 137 of file ArenaAllocatorBase.h.

Constructor & Destructor Documentation

◆ ArenaBlockAllocatorBase() [1/3]

SG::ArenaBlockAllocatorBase::ArenaBlockAllocatorBase ( const Params & params)

Constructor.

Parameters
paramsThe parameters structure for this allocator. See ArenaAllocatorBase.h for the contents.

Definition at line 25 of file ArenaBlockAllocatorBase.cxx.

26 : m_params (params),
27 m_blocks (nullptr),
28 m_freeblocks (nullptr),
29 m_stats(),
30 m_protected (false)
31{
32}
const Params & params() const
Return this Allocator's parameters.
ArenaAllocatorBase::Stats m_stats
The statistics structure.
ArenaBlock * m_blocks
The list of blocks currently in use.
Params m_params
The parameters for this allocator.
ArenaBlock * m_freeblocks
The list of free blocks.
bool m_protected
Flag whether the arena has been protected.

◆ ~ArenaBlockAllocatorBase()

SG::ArenaBlockAllocatorBase::~ArenaBlockAllocatorBase ( )
virtual

Destructor.

Definition at line 38 of file ArenaBlockAllocatorBase.cxx.

39{
40 // Should be called by the derived class dtor.
41 // Can't do it from here since it may call reset(), which is
42 // pure virtual in this class.
43 //erase();
44}

◆ ArenaBlockAllocatorBase() [2/3]

SG::ArenaBlockAllocatorBase::ArenaBlockAllocatorBase ( const ArenaBlockAllocatorBase & )
delete

Don't allow copy construction or assignment.

◆ ArenaBlockAllocatorBase() [3/3]

SG::ArenaBlockAllocatorBase::ArenaBlockAllocatorBase ( ArenaBlockAllocatorBase && other)

Move constructor.

Definition at line 50 of file ArenaBlockAllocatorBase.cxx.

52 : m_params (other.m_params),
53 m_blocks (other.m_blocks),
54 m_freeblocks (other.m_freeblocks),
55 m_stats (other.m_stats),
56 m_protected (other.m_protected)
57{
58 other.m_blocks = nullptr;
59 other.m_freeblocks = nullptr;
60 other.m_stats.clear();
61 other.m_protected = false;
62}

Member Function Documentation

◆ clear_fcn()

template<typename T>
void SG::ArenaAllocatorBase::clear_fcn ( pointer p)
staticprivateinherited

Call T::clear on the object at p.

Parameters
pThe object on which to run the clear.

◆ construct_fcn()

template<typename T>
void SG::ArenaAllocatorBase::construct_fcn ( pointer p)
staticprivateinherited

Call T's default constructor on the object at p.

Parameters
pThe object on which to run the constructor.

◆ destroy_fcn()

template<typename T>
void SG::ArenaAllocatorBase::destroy_fcn ( pointer p)
staticprivateinherited

Call T's destructor on the object at p.

Parameters
pThe object on which to run the destructor.

◆ erase()

void SG::ArenaBlockAllocatorBase::erase ( )
overridevirtual

Free all allocated elements and release memory back to the system.

All elements allocated are freed, and all allocated blocks of memory are released back to the system. destructor should be called on them if it was provided (preceded by clear if provided and mustClear was set).

Implements SG::ArenaAllocatorBase.

Reimplemented in SG::ArenaHeapAllocator, and SG::ArenaPoolAllocator.

Definition at line 172 of file ArenaBlockAllocatorBase.cxx.

173{
174 if (m_protected) {
175 throw SG::ExcProtected();
176 }
178}
void eraseUnprotected()
Free all allocated elements and release memory back to the system.

◆ eraseUnprotected()

void SG::ArenaBlockAllocatorBase::eraseUnprotected ( )
protected

Free all allocated elements and release memory back to the system.

Assumes that the blocks are already unprotected.

Definition at line 186 of file ArenaBlockAllocatorBase.cxx.

187{
188 // Do we need to run clear() on the allocated elements?
189 // If so, do so via reset().
190 if (m_params.mustClear && m_params.clear) {
191 reset();
192 }
193
194 // Kill the block lists (both free and in use).
197 m_blocks = m_freeblocks = nullptr;
198
199 // Reset statistics.
200 m_stats.clear();
201}
virtual void reset()=0
Free all allocated elements.
static void destroyList(ArenaBlock *p, func_t *dtor)
Destroy all blocks in a list.

◆ getBlock()

ArenaBlock * SG::ArenaBlockAllocatorBase::getBlock ( )
protected

Return an empty block, either newly-allocated or from the free list.

Update statistics appropriately.

Definition at line 245 of file ArenaBlockAllocatorBase.cxx.

246{
247 if (m_protected) {
248 throw SG::ExcProtected();
249 }
250
251 ArenaBlock* newblock = m_freeblocks;
252 if (newblock) {
253 // There's something on the free list. Remove it and update statistics.
254 m_freeblocks = newblock->link();
255 --m_stats.blocks.free;
256 }
257 else {
258 // Otherwise, we need to make a new block.
259 newblock = ArenaBlock::newBlock (m_params.nblock, m_params.eltSize,
260 m_params.constructor);
261 m_stats.elts.total += newblock->size();
262 ++m_stats.blocks.total;
263 }
264 // Finish updating statistics.
265 // (Remaining ones are computed in stats().)
266 ++m_stats.blocks.inuse;
267
268 // Link it into the in-use list and return.
269 newblock->link() = m_blocks;
270 m_blocks = newblock;
271 return newblock;
272}
static ArenaBlock * newBlock(size_t n, size_t elt_size, func_t *ctor)
Create a new block.

◆ makeClear() [1/2]

template<class T>
func_t * SG::ArenaAllocatorBase::makeClear ( const std::false_type & )
staticinherited

Make a function pointer for a clear function.

◆ makeClear() [2/2]

template<class T>
func_t * SG::ArenaAllocatorBase::makeClear ( const std::true_type & )
staticinherited

Make a dummy clear function pointer.

◆ makeConstructor() [1/2]

template<class T>
func_t * SG::ArenaAllocatorBase::makeConstructor ( const std::false_type & )
staticinherited

Make a constructor function pointer for a non-trivial constructor.

◆ makeConstructor() [2/2]

template<class T>
func_t * SG::ArenaAllocatorBase::makeConstructor ( const std::true_type & )
staticinherited

Make a constructor function pointer for a trivial constructor.

◆ makeDestructor() [1/2]

template<class T>
func_t * SG::ArenaAllocatorBase::makeDestructor ( const std::false_type & )
staticinherited

Make a constructor function pointer for a non-trivial destructor.

◆ makeDestructor() [2/2]

template<class T>
func_t * SG::ArenaAllocatorBase::makeDestructor ( const std::true_type & )
staticinherited

Make a constructor function pointer for a trivial destructor.

◆ name()

const std::string & SG::ArenaBlockAllocatorBase::name ( ) const
overridevirtual

Return the name of this allocator.

Implements SG::ArenaAllocatorBase.

Definition at line 225 of file ArenaBlockAllocatorBase.cxx.

226{
227 return m_params.name;
228}

◆ operator=() [1/2]

ArenaBlockAllocatorBase & SG::ArenaBlockAllocatorBase::operator= ( ArenaBlockAllocatorBase && other)

Move assignment.

Definition at line 69 of file ArenaBlockAllocatorBase.cxx.

71{
72 if (this != &other) {
73 erase();
74 m_params = other.m_params;
75 m_blocks = other.m_blocks;
76 m_freeblocks = other.m_freeblocks;
77 m_stats = other.m_stats;
78 m_protected = other.m_protected;
79 other.m_blocks = nullptr;
80 other.m_freeblocks = nullptr;
81 other.m_stats.clear();
82 other.m_protected = false;
83 }
84 return *this;
85}
virtual void erase() override
Free all allocated elements and release memory back to the system.

◆ operator=() [2/2]

ArenaBlockAllocatorBase & SG::ArenaBlockAllocatorBase::operator= ( const ArenaBlockAllocatorBase & )
delete

◆ params()

const ArenaAllocatorBase::Params & SG::ArenaBlockAllocatorBase::params ( ) const

Return this Allocator's parameters.

Return this allocator's parameters.

Definition at line 235 of file ArenaBlockAllocatorBase.cxx.

236{
237 return m_params;
238}

◆ protect()

void SG::ArenaBlockAllocatorBase::protect ( )

Write-protect the memory managed by this allocator.

Adjust protection on the memory managed by this allocator to disallow writes.

Definition at line 281 of file ArenaBlockAllocatorBase.cxx.

282{
284 m_protected = true;
285}
static void protectList(ArenaBlock *p)
Write-protect all blocks in a list.

◆ report()

void SG::ArenaAllocatorBase::report ( std::ostream & os) const
virtualinherited

Generate a report on the memory usage of this allocator.

Parameters
osStream to which the report should be written.

Definition at line 130 of file ArenaAllocatorBase.cxx.

131{
132 os << " " << stats() << " " << name() << std::endl;
133}
virtual const std::string & name() const =0
Return the name of this allocator.
virtual Stats stats() const =0
Return the statistics block for this allocator.

◆ reserve()

void SG::ArenaBlockAllocatorBase::reserve ( size_t size)
overridevirtual

Set the total number of elements cached by the allocator.

Parameters
sizeThe desired pool size.

This allows changing the number of elements that are currently free but cached. Any allocated elements are not affected by this call.

If size is greater than the total number of elements currently cached, then more will be allocated. This will preferably done with a single block, but that is not guaranteed; in addition, the allocator may allocate more elements than is requested.

If size is smaller than the total number of elements currently cached, as many blocks as possible will be released back to the system. It may not be possible to release the number of elements requested; this should be implemented on a best-effort basis.

Implements SG::ArenaAllocatorBase.

Definition at line 120 of file ArenaBlockAllocatorBase.cxx.

121{
122 if (m_protected) {
123 throw SG::ExcProtected();
124 }
125 if (size > m_stats.elts.total) {
126 // Growing the pool.
127 // Make a new block of the required size.
128 size_t sz = size - m_stats.elts.total;
129 ArenaBlock* newblock = ArenaBlock::newBlock (sz, m_params.eltSize,
130 m_params.constructor);
131
132 // Update statistics (others are derived in stats()).
133 ++m_stats.blocks.free;
134 ++m_stats.blocks.total;
135 m_stats.elts.total += newblock->size();
136
137 // Add to the free list.
138 newblock->link() = m_freeblocks;
139 m_freeblocks = newblock;
140 }
141 else {
142 // Shrinking the pool.
143 // Loop while we can get rid of the first free block.
144 while (size < m_stats.elts.total &&
145 m_freeblocks &&
146 m_freeblocks->size() <= (m_stats.elts.total - size))
147 {
148 // Remove it from the free list.
149 ArenaBlock* p = m_freeblocks;
150 m_freeblocks = m_freeblocks->link();
151
152 // Update statistics (others are derived in stats()).
153 m_stats.elts.total -= p->size();
154 --m_stats.blocks.free;
155 --m_stats.blocks.total;
156
157 // Free the block.
158 ArenaBlock::destroy (p, m_params.destructor);
159 }
160 }
161}
static Double_t sz
static void destroy(ArenaBlock *p, func_t *dtor)
Destroy a block.

◆ reset()

virtual void SG::ArenaAllocatorBase::reset ( )
pure virtualinherited

Free all allocated elements.

All elements allocated are returned to the free state. clear should be called on them if it was provided. The elements may continue to be cached internally, without returning to the system.

Implemented in SG::ArenaHeapAllocator, and SG::ArenaPoolAllocator.

◆ stats()

ArenaAllocatorBase::Stats SG::ArenaBlockAllocatorBase::stats ( ) const
overridevirtual

Return the statistics block for this allocator.

Implements SG::ArenaAllocatorBase.

Definition at line 207 of file ArenaBlockAllocatorBase.cxx.

208{
209 // Calculate derived statistics.
211 stats.elts.free = stats.elts.total - stats.elts.inuse;
212 stats.bytes.inuse = stats.elts.inuse * m_params.eltSize +
213 stats.blocks.inuse * ArenaBlock::overhead();
214 stats.bytes.total = stats.elts.total * m_params.eltSize +
215 stats.blocks.total * ArenaBlock::overhead();
216 stats.bytes.free = stats.elts.free * m_params.eltSize +
217 stats.blocks.free * ArenaBlock::overhead();
218 return stats;
219}
virtual Stats stats() const override
Return the statistics block for this allocator.
static size_t overhead()
Return the per-block memory overhead, in bytes.
Statistics for an allocator.

◆ swap()

void SG::ArenaBlockAllocatorBase::swap ( ArenaBlockAllocatorBase & other)

Swap.

Definition at line 91 of file ArenaBlockAllocatorBase.cxx.

92{
93 if (this != &other) {
94 std::swap (m_params, other.m_params);
95 std::swap (m_blocks, other.m_blocks);
96 std::swap (m_freeblocks, other.m_freeblocks);
97 std::swap (m_stats, other.m_stats);
98 std::swap (m_protected, other.m_protected);
99 }
100}
void swap(ElementLinkVector< DOBJ > &lhs, ElementLinkVector< DOBJ > &rhs)

◆ unprotect()

void SG::ArenaBlockAllocatorBase::unprotect ( )

Write-enable the memory managed by this allocator.

Adjust protection on the memory managed by this allocator to allow writes.

Definition at line 294 of file ArenaBlockAllocatorBase.cxx.

295{
296 if (m_protected) {
298 m_protected = false;
299 }
300}
static void unprotectList(ArenaBlock *p)
Write-enable all blocks in a list.

Member Data Documentation

◆ m_blocks

ArenaBlock* SG::ArenaBlockAllocatorBase::m_blocks
protected

The list of blocks currently in use.

Definition at line 161 of file ArenaBlockAllocatorBase.h.

◆ m_freeblocks

ArenaBlock* SG::ArenaBlockAllocatorBase::m_freeblocks
protected

The list of free blocks.

Definition at line 164 of file ArenaBlockAllocatorBase.h.

◆ m_params

Params SG::ArenaBlockAllocatorBase::m_params
protected

The parameters for this allocator.

Definition at line 158 of file ArenaBlockAllocatorBase.h.

◆ m_protected

bool SG::ArenaBlockAllocatorBase::m_protected
protected

Flag whether the arena has been protected.

Definition at line 170 of file ArenaBlockAllocatorBase.h.

◆ m_stats

ArenaAllocatorBase::Stats SG::ArenaBlockAllocatorBase::m_stats
protected

The statistics structure.

Definition at line 167 of file ArenaBlockAllocatorBase.h.


The documentation for this class was generated from the following files: