31#if BIO_CPP_VERSION >= 11
38typedef uint32_t
Index;
40template <
typename TYPE,
bool MEMCPY_SAFE >
43namespace pointer_arena {
47static const Handle NullHandle = 0;
48static const Handle AddressMask = 0x3fffffffu;
49static const Handle GenerationMask = 0xc0000000u;
50static const uint32_t GenerationShift = 30u;
51static const uint32_t GenerationModulo = 3u;
52static const uint16_t ForeignGeneration = 3u;
53static const ::std::size_t WordShift = 3;
54static const ::std::size_t WordSize = (1u << WordShift);
55static const uint32_t NullPageFreeSlot = 0xffffffffu;
56static const uint16_t AllocationFlagFree = 0x0001u;
57static const uint16_t AllocationFlagSpan = 0x0004u;
58static const uint16_t PageFlagSmall = 0x0001u;
82 lhs.mOffsetWords ==
rhs.mOffsetWords &&
83 lhs.mCapacityWords ==
rhs.mCapacityWords &&
84 lhs.mRequestedBytes ==
rhs.mRequestedBytes &&
85 lhs.mGeneration ==
rhs.mGeneration &&
119 lhs.mOffsetWords ==
rhs.mOffsetWords &&
120 lhs.mPageBytes ==
rhs.mPageBytes &&
121 lhs.mSlotBytes ==
rhs.mSlotBytes &&
122 lhs.mFlags ==
rhs.mFlags &&
123 lhs.mFirstFreeWordOffset ==
rhs.mFirstFreeWordOffset &&
124 lhs.mFreeSlots ==
rhs.mFreeSlots &&
125 lhs.mTotalSlots ==
rhs.mTotalSlots &&
126 lhs.mNextFreshSlot ==
rhs.mNextFreshSlot &&
127 lhs.mSlotStates ==
rhs.mSlotStates;
146 ::std::size_t
bytes);
149 ::std::size_t
bytes);
159 ::std::size_t
align);
164 ::std::size_t
align);
167 ::std::size_t
bytes);
173 bool Owns(
const void*
raw)
const;
186 unsigned char* mBase;
187 ::std::size_t mCapacityBytes;
188 ::std::size_t mNextByte;
189 bool mReservedWithMmap;
195 unsigned char* mSlotGenTable;
196 ::std::size_t mSlotGenTableBytes;
197 bool mSlotGenTableMmap;
201 Index* mSmallPageLookup;
202 ::std::size_t mSmallPageLookupCount;
203 ::std::size_t mSmallAllocationCount;
207 ::std::size_t mBytes;
210 struct ForeignCacheEntry
219 struct ForeignMapEntry
224 struct SmallPageCacheEntry
232 static const ::std::size_t FreeBlockInitialCapacity = 4096;
233 static const ::std::size_t ForeignCacheCapacity = 4096;
234 static const ::std::size_t ForeignCacheProbeCount = 8;
235 static const ::std::size_t SmallPageCacheCapacity = 64;
236 static const ::std::size_t SmallPageDirectCacheCapacity = 513;
239 FreeBlock* mFreeBlocks;
240 ForeignCacheEntry mForeignCache[ForeignCacheCapacity];
241 SmallPageCacheEntry mSmallPageCache[SmallPageCacheCapacity];
242 Index mSmallPageDirectCache[SmallPageDirectCacheCapacity];
245 ForeignMapEntry* mForeignMap;
246 ::std::size_t mForeignMapCapacity;
247 ::std::size_t mForeignMapCount;
248 ::std::size_t mFreeBlockCount;
249 ::std::size_t mFreeBlockCapacity;
250 ::std::size_t mForeignCacheVictim;
251 ::std::size_t mSmallPageCacheVictim;
253 void EnsureReserved();
257 ::std::size_t* capacityBytes,
258 uint16_t* generation);
259 void* AllocateSmallBytes(
261 ::std::size_t align);
262 void* AllocateSpanBytes(
264 ::std::size_t align);
265 Index CreateSmallPage(
266 ::std::size_t slotBytes,
267 ::std::size_t align);
269 ::std::size_t slotBytes)
const;
270 Index FindCachedSmallPage(
271 ::std::size_t slotBytes)
const;
272 void RecordSmallPageCache(
273 ::std::size_t slotBytes,
275 bool EnsureSmallPageLookup();
276 void RecordSmallPageLookup(
278 ::std::size_t offsetBytes,
279 ::std::size_t pageBytes);
280 Index LookupSmallPageForRaw(
281 const void* raw)
const;
282 Index FindPageForRaw(
283 const void* raw)
const;
285 ::std::size_t offsetBytes,
286 ::std::size_t capacityBytes,
287 ::std::size_t requestedBytes,
289 uint16_t generation);
290 Index FindAllocationByOffset(
291 ::std::size_t offsetBytes)
const;
292 Index FindAllocationContainingOffset(
293 ::std::size_t offsetBytes)
const;
294 bool RetireAllocation(
295 ::std::size_t offsetBytes,
296 MemoryAllocation* retiredAllocation = NULL);
297 void RecordFreeBlock(
300 uint16_t generation);
301 bool CacheSmallBytes(
303 ::std::size_t bytes);
304 const void* ResolveArena(
Handle handle)
const;
305 Handle AddForeign(
const void* raw);
306 ::std::size_t ForeignCacheIndex(
const void* raw)
const;
307 Handle FindRecentForeign(
const void* raw)
const;
308 void RecordRecentForeign(
313 Handle FindForeignInMap(
const void* raw)
const;
314 void InsertForeignInMap(
317 const void* ResolveForeign(
Handle handle)
const;
325 ::std::size_t align);
328 ::std::size_t oldBytes,
329 ::std::size_t newBytes,
330 ::std::size_t align);
334 ::std::size_t bytes);
338 ::std::size_t bytes);
346bool Owns(
const void* raw);
357#if BIO_COMPACT_POINTER_STORAGE
358extern const unsigned char* gPointerArenaBase;
377 return handle & AddressMask;
382 return static_cast< uint16_t >((
handle & GenerationMask) >> GenerationShift);
414 "BIO_ARENA_CHECKED: dereference of a stale/dangling arena handle 0x%08lx at %s:%d\n",
421#if BIO_COMPACT_POINTER_STORAGE
422inline const void* ResolveFast(
Handle handle)
433 #if BIO_ARENA_CHECKED
442 if (!offsetField || !gPointerArenaBase || !gSlotGenTable)
446 const ::std::size_t wordOffset =
static_cast< ::std::size_t
>(offsetField - 1u);
449 return OnStaleHandle(handle, __FILE__, __LINE__);
451 return gPointerArenaBase + (wordOffset << WordShift);
455 if (!offsetField || !gPointerArenaBase)
459 return gPointerArenaBase + (
static_cast< ::std::size_t
>(offsetField - 1u) << WordShift);
466template <
typename T >
470 #if defined(__GNUC__) || defined(__clang__)
473 return sizeof(
void*);
478template <
typename T >
485template <
typename T >
493#if BIO_CPP_VERSION >= 11
494template <
typename T,
typename...
Args >
498 return new (
storage)
T(::std::forward< Args >(
args)...);
501template <
typename T,
typename A1 >
508template <
typename T,
typename A1,
typename A2 >
515template <
typename T,
typename A1,
typename A2 >
524template <
typename T >
540template <
typename T >
557 #if BIO_CPP_VERSION >= 11
558 template <
typename...
Args >
565 template <
typename A1 >
572 template <
typename A1,
typename A2 >
579 template <
typename A1,
typename A2 >
618#if BIO_COMPACT_POINTER_STORAGE
619 #define BIO_POINTER_ARENA_ALLOCATED(TYPE) \
620 static void* operator new(::std::size_t bytes) \
622 void* storage = ::bio::pointer_arena::Allocate( \
624 ::bio::pointer_arena::AlignmentOf< TYPE >()); \
627 throw ::std::bad_alloc(); \
631 static void* operator new(::std::size_t, void* raw) \
635 static void operator delete(void* raw) \
637 ::bio::pointer_arena::DeleteObjectStorage(raw); \
639 static void operator delete(void*, void*) \
643 #define BIO_POINTER_ARENA_ALLOCATED(TYPE)
double value
Definition Potential.cpp:41
Definition ThreadSafe.h:57
Definition PointerArena.h:542
const T * Get() const
Definition PointerArena.h:602
Object(const T &value)
Definition PointerArena.h:550
Object(const A1 &a1)
Definition PointerArena.h:566
Object()
Definition PointerArena.h:544
Object(const A1 &a1, const A2 &a2)
Definition PointerArena.h:580
Object(const A1 &a1, A2 &a2)
Definition PointerArena.h:573
T * Get()
Definition PointerArena.h:597
~Object()
Definition PointerArena.h:588
Definition PointerArena.h:143
::std::size_t GetSmallAllocationCount() const
Definition PointerArena.cpp:2147
::std::size_t GetAllocationRecordCount() const
Definition PointerArena.cpp:2142
::std::size_t GetPageRecordCount() const
Definition PointerArena.cpp:2152
friend void FreeBytes(void *raw, ::std::size_t bytes)
Definition PointerArena.cpp:2242
PointerArena()
Definition PointerArena.cpp:647
bool IsArenaHandle(Handle handle) const
Definition PointerArena.cpp:2112
const void * GetBase() const
Definition PointerArena.cpp:2122
void * AllocateBytes(::std::size_t bytes, ::std::size_t align)
Definition PointerArena.cpp:1496
::std::size_t GetForeignCount() const
Definition PointerArena.cpp:2137
Handle HandleFor(const void *raw)
Definition PointerArena.cpp:2002
Handle ArenaHandleFor(const void *raw) const
Definition PointerArena.cpp:1768
const void * Resolve(Handle handle) const
Definition PointerArena.cpp:2099
~PointerArena()
Definition PointerArena.cpp:687
::std::size_t GetBytesHandedOut() const
Definition PointerArena.cpp:2132
::std::size_t GetCapacityBytes() const
Definition PointerArena.cpp:2127
friend void DeleteObjectStorage(void *raw, ::std::size_t bytes)
Definition PointerArena.cpp:2204
static PointerArena & Instance()
Definition PointerArena.cpp:641
void * ReallocateBytes(void *raw, ::std::size_t oldBytes, ::std::size_t newBytes, ::std::size_t align)
Definition PointerArena.cpp:1541
bool IsForeignHandle(Handle handle) const
Definition PointerArena.cpp:2117
bool Owns(const void *raw) const
Definition PointerArena.cpp:1758
bool Owns(const void *raw)
Definition PointerArena.cpp:2302
const void * Resolve(Handle handle)
Definition PointerArena.cpp:2307
T * NewWith(const A1 &a1)
Definition PointerArena.h:502
void Delete(T *raw)
Definition PointerArena.h:525
const void * ArenaBase()
Definition PointerArena.cpp:2340
bool IsArenaHandle(Handle handle)
Definition PointerArena.cpp:2330
::std::size_t ArenaBytesHandedOut()
Definition PointerArena.cpp:2345
bool operator==(const MemoryAllocation &lhs, const MemoryAllocation &rhs)
Definition PointerArena.h:77
uint32_t HandleOffsetField(Handle handle)
Definition PointerArena.h:375
bool UseSystemContainerStorage()
Definition PointerArena.cpp:2259
inline ::std::size_t AlignmentOf()
Definition PointerArena.h:467
bool IsForeignHandle(Handle handle)
Definition PointerArena.cpp:2335
void PushSystemContainerStorage()
Definition PointerArena.cpp:2264
T * New()
Definition PointerArena.h:479
Handle MakeHandle(uint32_t wordOffset, uint16_t generation)
Definition PointerArena.h:361
::std::size_t ForeignHandleCount()
Definition PointerArena.cpp:2350
void DeleteObjectStorage(void *raw)
Definition PointerArena.cpp:2188
::std::size_t ArenaPageRecordCount()
Definition PointerArena.cpp:2368
uint16_t HandleGeneration(Handle handle)
Definition PointerArena.h:380
::std::size_t ArenaSmallAllocationCount()
Definition PointerArena.cpp:2362
void PopSystemContainerStorage()
Definition PointerArena.cpp:2269
uint32_t Handle
Definition PointerArena.h:45
uint32_t HandleWordOffset(Handle handle)
Definition PointerArena.h:390
T * NewCopy(const T &value)
Definition PointerArena.h:486
void * Reallocate(void *raw, ::std::size_t oldBytes, ::std::size_t newBytes, ::std::size_t align)
Definition PointerArena.cpp:2178
Handle HandleFor(const void *raw)
Definition PointerArena.cpp:2278
void * Allocate(::std::size_t bytes, ::std::size_t align)
Definition PointerArena.cpp:2157
void FreeBytes(void *raw)
Definition PointerArena.cpp:2226
bool IsForeignHandleValue(Handle handle)
Definition PointerArena.h:385
::std::size_t ArenaAllocationRecordCount()
Definition PointerArena.cpp:2356
Definition FinalCell.h:29
uint32_t Index
Definition common/container/common/Types.h:31
Definition PointerArena.h:61
uint16_t mFlags
Definition PointerArena.h:66
uint16_t mGeneration
Definition PointerArena.h:65
MemoryAllocation()
Definition PointerArena.cpp:57
uint32_t mOffsetWords
Definition PointerArena.h:62
uint32_t mRequestedBytes
Definition PointerArena.h:64
uint32_t mCapacityWords
Definition PointerArena.h:63
Definition PointerArena.h:90
uint32_t mTotalSlots
Definition PointerArena.h:97
uint32_t mNextFreshSlot
Definition PointerArena.h:98
uint32_t mFirstFreeWordOffset
Definition PointerArena.h:95
uint32_t mOffsetWords
Definition PointerArena.h:91
unsigned char * mSlotStates
Definition PointerArena.h:99
uint32_t mPageBytes
Definition PointerArena.h:92
MemoryPage()
Definition PointerArena.cpp:82
uint16_t mFlags
Definition PointerArena.h:94
uint16_t mSlotBytes
Definition PointerArena.h:93
uint32_t mFreeSlots
Definition PointerArena.h:96