CookMem 1.4.0
A C++ memory context / allocator
Loading...
Searching...
No Matches
context.h
1/*
2 * Copyright (c) 2021-2026 Heng Yuan
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16#ifndef COOK_MEM_CONTEXT_H
17#define COOK_MEM_CONTEXT_H
18
19#include <cstdint>
20
21#include "config.h"
22#include "mmaparena.h"
23#include "logger.h"
24#include "pool.h"
25
26namespace cookmem
27{
28
36template<class Arena, class Logger, class TreeType = PtrRBTree, class T=void>
38{
39public:
44
46 typedef typename Pool::size_type size_type;
48 typedef typename Pool::difference_type difference_type;
50 typedef typename Pool::value_type value_type;
52 typedef typename Pool::pointer pointer;
54 typedef typename Pool::const_pointer const_pointer;
55
56public:
71 Logger& logger,
72 std::uint8_t paddingSize = DEFAULT_PADDING_SIZE)
73 : m_arena (arena),
74 m_logger (logger),
75 m_pool (m_arena, m_logger, paddingSize)
76 {
77 }
78
88 : m_arena (other.getArena ()),
89 m_logger (other.getLogger ()),
90 m_pool (m_arena, m_logger, other.getPaddingSize ())
91 {
92 }
93
94 virtual ~MemContext()
95 {
96 }
97
106 inline T*
107 allocate (size_type size) { return m_pool.allocate (size); }
108
125 inline T*
126 allocateAligned (size_type size, size_type alignment) { return m_pool.allocateAligned (size, alignment); }
127
139 inline T*
140 reallocate (T* ptr, size_type size) { return m_pool.reallocate (ptr, size); }
141
152 inline T*
153 callocate (size_type num, size_type size) { return m_pool.callocate (num, size); }
154
163 inline void
164 deallocate (T* ptr, size_type size = 0) { m_pool.deallocate (ptr, size); }
165
169 inline void
170 validate () { m_pool.validate (); }
171
185 inline bool
186 contains (T* ptr, bool checkUsed = false) { return m_pool.contains (ptr, checkUsed); }
187
202 inline size_type
203 getSize (T* ptr) { return m_pool.getUserSize (ptr); }
204
208 inline void
209 releaseAll () { m_pool.releaseAll (); }
210
220 inline void
222 {
223 m_pool.releaseAll ();
224 m_arena.releaseAll ();
225 }
226
232 inline size_type
233 getFootprintLimit () const { return m_pool.getFootprintLimit (); }
234
243 inline void
245
251 inline size_type
252 getFootprint () const { return m_pool.getFootprint (); }
253
259 inline size_type
260 getMaxFootprint () const { return m_pool.getMaxFootprint (); }
261
275 void
277 {
278 m_pool.setTrimEmptySegmentsInterval (interval);
279 }
280
286 {
287 return m_pool.getTrimEmptySegmentsInterval ();
288 }
289
304 void
306 {
307 m_pool.setImmediateReleaseThreshold (threshold);
308 }
309
318 {
319 return m_pool.getImmediateReleaseThreshold ();
320 }
321
327 inline bool
328 isStoringExactSize () const { return m_pool.isStoringExactSize (); }
329
336 void
337 setStoringExactSize (bool b) { m_pool.setStoringExactSize (b); }
338
346 bool
347 isPadding () const { return m_pool.isPadding (); }
348
352 std::uint8_t
353 getPaddingSize () const { return m_pool.getPaddingSize (); }
354
360 std::uint8_t
361 getPaddingByte () const { return m_pool.getPaddingByte (); }
362
369 void
370 setPaddingByte (std::uint8_t paddingByte) { m_pool.setPaddingByte (paddingByte); }
371
377 inline Arena&
378 getArena () { return m_arena; }
379
385 inline Logger&
386 getLogger () { return m_logger; }
387
393 inline Pool&
394 getPool () { return m_pool; }
395
396private:
397 Arena& m_arena;
398 Logger& m_logger;
399 Pool m_pool;
400};
401
405template<class Arena, class Logger>
407{
412
414 : arena (),
415 logger ()
416 {
417 }
418
419 virtual ~SimpleMemContainer ()
420 {
421 }
422};
423
431template<class Arena = MmapArena, class Logger = NoActionMemLogger, class TreeType = PtrRBTree, class T=void>
432class SimpleMemContext : private SimpleMemContainer<Arena, Logger>, public MemContext<Arena, Logger, TreeType, T>
433{
434public:
439
441 typedef typename MemCtx::size_type size_type;
443 typedef typename MemCtx::difference_type difference_type;
445 typedef typename MemCtx::value_type value_type;
447 typedef typename MemCtx::pointer pointer;
449 typedef typename MemCtx::const_pointer const_pointer;
450
451public:
464
477 : Container (),
480 other.getPaddingSize ())
481 {
482 }
483
484 virtual ~SimpleMemContext ()
485 {
486 }
487};
488
492template<class Arena, class Logger>
494{
501
503 : arena (),
505 logger ()
506 {
507 }
508
509 virtual ~CachedMemContainer ()
510 {
511 }
512};
513
521template<class Arena = MmapArena, class Logger = NoActionMemLogger, class TreeType = PtrRBTree, class T = void>
522class CachedMemContext : private CachedMemContainer<Arena, Logger>, public MemContext<CachedArena<Arena>, Logger, TreeType, T>
523{
524public:
529
531 typedef typename MemCtx::size_type size_type;
533 typedef typename MemCtx::difference_type difference_type;
535 typedef typename MemCtx::value_type value_type;
537 typedef typename MemCtx::pointer pointer;
539 typedef typename MemCtx::const_pointer const_pointer;
540
541public:
554
568 : Container (),
571 other.getPaddingSize ())
572 {
573 }
574
575 virtual ~CachedMemContext ()
576 {
577 }
578};
579
580} // namespace cookmem
581
582#endif // COOK_MEM_CONTEXT_H
Definition context.h:523
MemCtx::const_pointer const_pointer
Definition context.h:539
MemCtx::pointer pointer
Definition context.h:537
MemContext< CachedArena< Arena >, Logger, TreeType, T > MemCtx
Definition context.h:528
MemCtx::size_type size_type
Definition context.h:531
CachedMemContainer< Arena, Logger > Container
Definition context.h:526
CachedMemContext(std::uint8_t paddingSize=DEFAULT_PADDING_SIZE)
Definition context.h:549
CachedMemContext(CachedMemContext &other, bool shareArena)
Definition context.h:567
MemCtx::difference_type difference_type
Definition context.h:533
MemCtx::value_type value_type
Definition context.h:535
Definition allocator.h:39
Definition context.h:38
MemPool< Arena, Logger, TreeType, T > Pool
Definition context.h:43
void setImmediateReleaseThreshold(size_type threshold)
Definition context.h:305
size_type getMaxFootprint() const
Definition context.h:260
size_type getTrimEmptySegmentsInterval() const
Definition context.h:285
void releaseAllToSystem()
Definition context.h:221
size_type getSize(T *ptr)
Definition context.h:203
Arena & getArena()
Definition context.h:378
bool contains(T *ptr, bool checkUsed=false)
Definition context.h:186
void setStoringExactSize(bool b)
Definition context.h:337
T * allocateAligned(size_type size, size_type alignment)
Definition context.h:126
MemContext< Arena, Logger, TreeType, T > MemCtx
Definition context.h:41
std::uint8_t getPaddingByte() const
Definition context.h:361
Pool::pointer pointer
Definition context.h:52
Pool & getPool()
Definition context.h:394
void validate()
Definition context.h:170
void deallocate(T *ptr, size_type size=0)
Definition context.h:164
T * reallocate(T *ptr, size_type size)
Definition context.h:140
Pool::value_type value_type
Definition context.h:50
void setFootprintLimit(size_type footprintLimit)
Definition context.h:244
Pool::size_type size_type
Definition context.h:46
size_type getImmediateReleaseThreshold() const
Definition context.h:317
T * callocate(size_type num, size_type size)
Definition context.h:153
void releaseAll()
Definition context.h:209
size_type getFootprint() const
Definition context.h:252
size_type getFootprintLimit() const
Definition context.h:233
Pool::difference_type difference_type
Definition context.h:48
Logger & getLogger()
Definition context.h:386
std::uint8_t getPaddingSize() const
Definition context.h:353
MemContext(MemCtx &other)
Definition context.h:87
bool isPadding() const
Definition context.h:347
void setPaddingByte(std::uint8_t paddingByte)
Definition context.h:370
void setTrimEmptySegmentsInterval(size_type interval)
Definition context.h:276
Pool::const_pointer const_pointer
Definition context.h:54
MemContext(Arena &arena, Logger &logger, std::uint8_t paddingSize=DEFAULT_PADDING_SIZE)
Definition context.h:70
bool isStoringExactSize() const
Definition context.h:328
T * allocate(size_type size)
Definition context.h:107
std::size_t size_type
Definition pool.h:169
Definition context.h:433
SimpleMemContext(std::uint8_t paddingSize=DEFAULT_PADDING_SIZE)
Definition context.h:459
MemCtx::pointer pointer
Definition context.h:447
MemContext< Arena, Logger, TreeType, T > MemCtx
Definition context.h:438
MemCtx::const_pointer const_pointer
Definition context.h:449
MemCtx::size_type size_type
Definition context.h:441
MemCtx::value_type value_type
Definition context.h:445
MemCtx::difference_type difference_type
Definition context.h:443
SimpleMemContainer< Arena, Logger > Container
Definition context.h:436
SimpleMemContext(SimpleMemContext &other, bool shareArena)
Definition context.h:476
Definition allocator.h:29
const std::uint8_t DEFAULT_PADDING_SIZE
Definition config.h:56
Definition context.h:494
Logger logger
Definition context.h:500
CachedArena< Arena > cachedArena
Definition context.h:498
Arena arena
Definition context.h:496
Definition context.h:407
Logger logger
Definition context.h:411
Arena arena
Definition context.h:409