Warning: you were redirected to the latest documentation corresponding to your major release ( 2022.1.16.8522 ). Should you wish to access your specific version's documentation, please download the offline documentation from the Audiokinetic Launcher and check the Offline Documentation option in Wwise Authoring.
Go to the documentation of this file.
27 #ifndef _AKBLOCKPOOL_H
28 #define _AKBLOCKPOOL_H
41 #define AK_DYNA_BLK_SCRUB_MEM
44 #ifdef AK_DYNA_BLK_STATS
45 #define STATS_ALLOC() Stats_Alloc()
46 #define STATS_NEWCHUNK() Stats_NewChunk()
47 #define STATS_FREE() Stats_Free()
48 #define STATS_DELCHUNK() Stats_DelChunk()
51 #define STATS_NEWCHUNK()
53 #define STATS_DELCHUNK()
56 #ifdef AK_DYNA_BLK_SCRUB_MEM
57 #define SCRUB_NEW_CHUNK() memset(&memory, 0xCC, sizeof(T)*uPoolChunkSize)
58 #define SCRUB_NEW_ALLOC(pItem) memset(pItem, 0xAA, sizeof(T))
59 #define SCRUB_FREE_BLOCK(pObj) memset(pObj, 0xDD, sizeof(T))
61 #define SCRUB_NEW_CHUNK()
62 #define SCRUB_NEW_ALLOC(pItem)
63 #define SCRUB_FREE_BLOCK(pObj)
66 template <
typename T, AkUInt32 uPoolChunkSize,
class TAlloc = ArrayPoolDefault>
69 enum { kChunkMemoryBytes =
sizeof(T)*uPoolChunkSize };
74 char padding[
sizeof(T) -
sizeof(FreeBlock*) ];
80 PoolChunk() : pNextLightItem(
NULL)
83 for(
AkUInt32 i=0; i<uPoolChunkSize; ++i )
85 FreeBlock* pBlk =
reinterpret_cast<FreeBlock*
>( &memory ) + i;
86 freeList.AddFirst(pBlk);
90 inline bool BelongsTo( FreeBlock* pMem )
const {
return (
AkUInt8*)pMem >= memory && (
AkUInt8*)pMem < (memory+kChunkMemoryBytes); }
91 inline bool AllFree()
const {
return freeList.Length() == uPoolChunkSize; }
92 inline bool AllAllocd()
const {
return freeList.IsEmpty(); }
94 AkUInt8 memory[ kChunkMemoryBytes ];
95 PoolChunk* pNextLightItem;
109 template<
typename A1>
117 template<
typename A1,
typename A2>
125 template<
typename A1,
typename A2,
typename A3>
126 T*
New(A1 a1, A2 a2, A3 a3)
133 template<
typename A1,
typename A2,
typename A3,
typename A4>
134 T*
New(A1 a1, A2 a2, A3 a3, A4 a4)
150 FreeBlock* pItem =
NULL;
151 PoolChunk* pChunk =
NULL;
153 pChunk = m_chunkList.
First();
154 while (pChunk !=
NULL && pChunk->AllAllocd())
155 pChunk = pChunk->pNextLightItem;
159 pChunk = (PoolChunk *) TAlloc::Alloc(
sizeof( PoolChunk ) );
168 pItem = pChunk->freeList.First();
170 pChunk->freeList.RemoveFirst();
175 return reinterpret_cast<T*
>(pItem);
182 FreeBlock* pItem =
reinterpret_cast<FreeBlock*
>(pObj);
184 PoolChunk* pPrevChunk =
NULL;
185 PoolChunk* pChunk = m_chunkList.
First();
186 while (pChunk !=
NULL && !pChunk->BelongsTo(pItem))
189 pChunk = pChunk->pNextLightItem;
193 pChunk->freeList.AddFirst(pItem);
196 if (pChunk->AllFree())
199 pChunk->~PoolChunk();
205 tChunkList m_chunkList;
207 #ifdef AK_DYNA_BLK_STATS
210 uCurrentUsedBytes +=
sizeof(T);
211 uPeakUsedBytes =
AkMax(uCurrentUsedBytes, uPeakUsedBytes);
213 void Stats_NewChunk()
215 uCurrentAllocdBytes +=
sizeof(PoolChunk);
216 uPeakAllocdBytes =
AkMax(uCurrentAllocdBytes, uPeakAllocdBytes);
220 uCurrentUsedBytes -=
sizeof(T);
222 void Stats_DelChunk()
224 uCurrentAllocdBytes -=
sizeof(PoolChunk);
AkForceInline T * First()
Get first element.
#define SCRUB_FREE_BLOCK(pObj)
AKSOUNDENGINE_API void Free(AkMemPoolId in_poolId, void *in_pMemAddress)
#define SCRUB_NEW_CHUNK()
uint8_t AkUInt8
Unsigned 8-bit integer.
void AddFirst(T *in_pItem)
Add element at the beginning of list.
#define AkPlacementNew(_memory)
#define AKASSERT(Condition)
void RemoveItem(T *in_pItem, T *in_pPrevItem)
Remove an element.
T * New(A1 a1, A2 a2, A3 a3, A4 a4)
T * New(A1 a1, A2 a2, A3 a3)
#define SCRUB_NEW_ALLOC(pItem)
uint32_t AkUInt32
Unsigned 32-bit integer.
Tell us about your project. We're here to help.
Register your project and we'll help you get started with no strings attached!
Get started with Wwise