29 #ifndef INC_CINOSPARTITIONMEMORY_H
30 #define INC_CINOSPARTITIONMEMORY_H
57 struct SINOSPMClassInfo
60 SINOSPMClassInfo* m_pNext;
71 uint32 i_nCallStackDepth);
73 uint32 m_uCallStackDepth;
91 const char* m_pClassName;
95 uintptr* m_pBackTrace;
105 SINOSPMHeader* m_pNext;
107 SINOSPMHeader* m_pPrevious;
120 eFooterPattern = 0x79811115
125 uint32 m_uPartitionFooterPattern;
138 struct SINOSPMHeaderNoSecure
146 uint8 m_uPadding [16 -
sizeof(m_pPartition) -
sizeof(m_pNext)];
150 static_assert(
sizeof(SINOSPMHeaderNoSecure) % 16 == 0,
151 "sizeof(SINOSPMHeaderNoSecure) must be a multiple of 16 bytes");
153 class CINOSMemoryPool;
158 friend void _INI_0000_CINOSPartitionMemory();
171 static void* OperatorNewDuringCreate(
size_t auSize);
192 const char* apPoolName = 0);
195 const char* apPoolName,
const char* apClass, uint32* apSize=0);
200 void* Alloc(uint32 auSize=0,
const char* apClassName = s_cNoClassNameSpecified,
201 bool abReturnNullOnFailure =
false,
202 uint32 auMinimalReserve = 0);
204 bool Free(
void* apPartition,
const char* apClassName = s_cNoClassNameSpecified);
207 static void* AllocGlobal(
size_t auSize,
208 const char* apClassName = s_cNoClassNameSpecified,
209 bool abReturnNullOnFailure =
false,
210 size_t auMinimalReserve = 0);
217 static void FreeGlobal(
void* apPartition,
218 const char* apClassName = s_cNoClassNameSpecified);
231 CINCOObject* GetRegister();
233 void GetRegisterClass(CINCOObject* apClassObj,
234 const SINOSPMClassInfo* apClassInfo);
240 const char* GetPoolName()
const {
return m_pPoolName;};
242 CINOSMemoryPool* GetPool()
const {
return m_pPool;};
244 void SetPool(CINOSMemoryPool* apPool) { m_pPool = apPool;};
246 uint32 GetPartitionSize()
const {
return m_uPartitionSize;};
248 uint32 GetFreeCount()
const {
return m_uActualSize - m_uUsedSize;};
254 void SetBackTrace(
const uint32 auBackTrace) { m_uBackTrace = auBackTrace; }
256 uint32 GetBackTrace()
const {
return m_uBackTrace; }
258 static void CheckConsistency();
264 friend void InitHeap(
void*);
268 uint32 CalcChecksum(SINOSPMHeader* apPartition)
const;
272 const char* m_pPoolName;
274 CINOSMemoryPool* m_pPool;
278 uint32 m_uPartitionSize;
280 uint32 m_uActualSize;
284 uint32 m_uChecksumSize;
290 SINOSPMHeader* m_pLstFree;
292 SINOSPMHeader* m_pFstUsed;
294 CINCOObject* m_pRegister;
300 SINOSPMClassInfo* m_pFirstCI;
302 static const char* s_cNoClassNameSpecified;
319 #ifdef INOS_CACHE_LOCK_SUPPORT
320 #define INOS_CACHE "Cache"
328 #define DECLARE_DYNAMIC(aClass) DECLARE_DYNAMIC_POOL(aClass,0)
330 #define DECLARE_DYNAMIC_T(aClass,aT) DECLARE_DYNAMIC_POOL_T(aClass,aT,0)
332 #define DECLARE_DYNAMIC_T2(aClass,aT1,aT2) DECLARE_DYNAMIC_POOL_T2(aClass,aT1,aT2,0)
334 #define DECLARE_DYNAMIC_T3(aClass,aT1,aT2,aT3) DECLARE_DYNAMIC_POOL_T3(aClass,aT1,aT2,aT3,0)
336 #define DECLARE_DYNAMIC_T4(aClass,aT1,aT2,aT3,aT4) DECLARE_DYNAMIC_POOL_T4(aClass,aT1,aT2,aT3,aT4,0)
338 #define DECLARE_DYNAMIC_N(aClass,aN) DECLARE_DYNAMIC_POOL_N(aClass,aN,0)
340 #define DECLARE_DYNAMIC_N2(aClass,aN,aM) DECLARE_DYNAMIC_POOL_N2(aClass,aN,aM,0)
342 #define DECLARE_DYNAMIC_CACHE(aClass) DECLARE_DYNAMIC_POOL(aClass,INOS_CACHE)
345 #define DECLARE_DYNAMIC_I(aClass,aInnerClass) DECLARE_DYNAMIC_POOL_T(aClass,aInnerClass,0)
348 #define DECLARE_DYNAMIC_PLACEMENT(aClass) DECLARE_DYNAMIC_POOL_PLACEMENT(aClass)
356 #define DECLARE_DYNAMIC_VARIADIC(aClass) DECLARE_DYNAMIC_POOL_VARIADIC(aClass,0)
361 #define IMPLEMENT_DYNAMIC(aClass) IMPLEMENT_DYNAMIC_POOL(aClass,0)
363 #define IMPLEMENT_DYNAMIC_T(aClass,aT) IMPLEMENT_DYNAMIC_POOL_T(aClass,aT,0)
365 #define IMPLEMENT_DYNAMIC_T2(aClass,aT1,aT2) IMPLEMENT_DYNAMIC_POOL_T2(aClass,aT1,aT2,0)
367 #define IMPLEMENT_DYNAMIC_T3(aClass,aT1,aT2,aT3) IMPLEMENT_DYNAMIC_POOL_T3(aClass,aT1,aT2,aT3,0)
369 #define IMPLEMENT_DYNAMIC_T_S(aClass,aT,aS) IMPLEMENT_DYNAMIC_POOL_T_S(aClass,aT,aS,0)
371 #define IMPLEMENT_DYNAMIC_T4(aClass,aT1,aT2,aT3,aT4) IMPLEMENT_DYNAMIC_POOL_T4(aClass,aT1,aT2,aT3,aT4,0)
373 #define IMPLEMENT_DYNAMIC_N(aClass,aN) IMPLEMENT_DYNAMIC_POOL_N(aClass,aN,0)
375 #define IMPLEMENT_DYNAMIC_N2(aClass,aN,aM) IMPLEMENT_DYNAMIC_POOL_N2(aClass,aN,aM,0)
376 #define IMPLEMENT_DYNAMIC_CACHE(aClass) IMPLEMENT_DYNAMIC_POOL(aClass,INOS_CACHE)
377 #define IMPLEMENT_DYNAMIC_I(aClass,aT) IMPLEMENT_DYNAMIC_POOL_I(aClass,aT,0)
378 #define IMPLEMENT_DYNAMIC_PLACEMENT(aClass) IMPLEMENT_DYNAMIC_POOL_PLACEMENT(aClass)
379 #define IMPLEMENT_DYNAMIC_PLACEMENT_N(aClass,N) IMPLEMENT_DYNAMIC_POOL_PLACEMENT_N(aClass, N)
380 #define IMPLEMENT_DYNAMIC_T2_VARIADIC(aClass,aT1,aT2) IMPLEMENT_DYNAMIC_POOL_T2_VARIADIC(aClass,aT1,aT2,0)
381 #define IMPLEMENT_DYNAMIC_T3_VARIADIC(aClass,aT1,aT2,aT3) IMPLEMENT_DYNAMIC_POOL_T3_VARIADIC(aClass,aT1,aT2,aT3,0)
382 #define IMPLEMENT_DYNAMIC_T4_VARIADIC(aClass,aT1,aT2,aT3,aT4) IMPLEMENT_DYNAMIC_POOL_T4_VARIADIC(aClass,aT1,aT2,aT3,aT4,0)
388 #ifdef INOS_SECURE_PARTITION_MEMORY
389 #define DF_HANDLE_MEMPOOL_CLASSNAME_ARG(i_Arg) \
391 #define DF_HIDE_IF_NO_SECURE_PARTITION_MEMORY(aStatement) \
393 #define DF_HIDE_IF_NO_SECURE_PARTITION_MEMORY_3(aStatement1, aStatement2, aStatement3) \
394 aStatement1, aStatement2, aStatement3
395 #define DF_HIDE_IF_NO_SECURE_PARTITION_MEMORY_4(aStatement1, aStatement2, aStatement3, aStatement4) \
396 aStatement1, aStatement2, aStatement3, aStatement4
397 #define DF_HIDE_IF_NO_SECURE_PARTITION_MEMORY_5(aStatement1, aStatement2, aStatement3, aStatement4, aStatement5) \
398 aStatement1, aStatement2, aStatement3, aStatement4, aStatement5
399 #define DF_HIDE_IF_NO_SECURE_PARTITION_MEMORY_7(aStatement1, aStatement2, aStatement3, aStatement4, aStatement5, aStatement6, aStatement7) \
400 aStatement1, aStatement2, aStatement3, aStatement4, aStatement5, aStatement6, aStatement7
401 #define DF_HIDE_IF_NO_SECURE_PARTITION_MEMORY_10(aStatement1, aStatement2, aStatement3, aStatement4, aStatement5, aStatement6, aStatement7, aStatement8, aStatement9, aStatement10) \
402 aStatement1, aStatement2, aStatement3, aStatement4, aStatement5, aStatement6, aStatement7, aStatement8, aStatement9, aStatement10
404 #define DF_HANDLE_MEMPOOL_CLASSNAME_ARG(i_Arg)
405 #define DF_HIDE_IF_NO_SECURE_PARTITION_MEMORY(i_Statement)
406 #define DF_HIDE_IF_NO_SECURE_PARTITION_MEMORY_3(aStatement1, aStatement2, aStatement3)
407 #define DF_HIDE_IF_NO_SECURE_PARTITION_MEMORY_4(aStatement1, aStatement2, aStatement3, aStatement4)
408 #define DF_HIDE_IF_NO_SECURE_PARTITION_MEMORY_5(aStatement1, aStatement2, aStatement3, aStatement4, aStatement5)
409 #define DF_HIDE_IF_NO_SECURE_PARTITION_MEMORY_10(aStatement1, aStatement2, aStatement3, aStatement4, aStatement5, aStatement6, aStatement7, aStatement8, aStatement9, aStatement10)
414 #define DECLARE_DYNAMIC_POOL(aClass,aPool) \
415 static CINOSPartitionMemory* p##aClass##Memory; \
416 static uint32 u##aClass##Memory; \
417 DF_HIDE_IF_NO_SECURE_PARTITION_MEMORY(static const char* s##aClass##Name;) \
419 void* operator new(size_t aSize); \
420 void operator delete(void* aPtr);
422 #define IMPLEMENT_DYNAMIC_POOL(aClass,aPool) \
423 CINOSPartitionMemory* aClass::p##aClass##Memory = \
424 CINOSPartitionMemory::Create(sizeof(aClass),aPool,#aClass,&aClass::u##aClass##Memory); \
425 uint32 aClass::u##aClass##Memory = 0; \
426 DF_HIDE_IF_NO_SECURE_PARTITION_MEMORY(const char* aClass::s##aClass##Name = #aClass;) \
427 void* aClass::operator new(size_t aSize) \
429 INOS_ADD(aClass::u##aClass##Memory, 1); \
430 return p##aClass##Memory->Alloc((uint32)aSize DF_HANDLE_MEMPOOL_CLASSNAME_ARG(s##aClass##Name));\
432 void aClass::operator delete(void* aPtr) \
434 bool bFreed = p##aClass##Memory->Free(aPtr DF_HANDLE_MEMPOOL_CLASSNAME_ARG(s##aClass##Name)); \
435 if(bFreed) INOS_ADD(aClass::u##aClass##Memory, -1); \
439 #define DECLARE_DYNAMIC_POOL_PLACEMENT(aClass) \
441 void* operator new(size_t aSize, void*);
443 #define IMPLEMENT_DYNAMIC_POOL_PLACEMENT(aClass) \
444 void* aClass::operator new(size_t aSize, void* aAddress) \
448 #define IMPLEMENT_DYNAMIC_POOL_PLACEMENT_N(aClass,N) \
449 template< int aN> void* aClass< aN >::operator new(size_t aSize, void* aAddress)\
456 #define DECLARE_DYNAMIC_POOL_T(aClass, aT, aPool ) \
457 static CINOSPartitionMemory* p##aClass##aT##Memory; \
458 static uint32 u##aClass##aT##Memory; \
459 DF_HIDE_IF_NO_SECURE_PARTITION_MEMORY(static const char* s##aClass##aT##Name;) \
461 void* operator new(size_t aSize) \
463 INOS_ADD_(u##aClass##aT##Memory, 1); \
464 return p##aClass##aT##Memory->Alloc((uint32)aSize DF_HANDLE_MEMPOOL_CLASSNAME_ARG(s##aClass##aT##Name)); \
466 void operator delete(void* aPtr) \
468 bool bFreed = p##aClass##aT##Memory->Free(aPtr DF_HANDLE_MEMPOOL_CLASSNAME_ARG(s##aClass##aT##Name)); \
469 if(bFreed) INOS_ADD_(u##aClass##aT##Memory, -1); \
472 #define IMPLEMENT_DYNAMIC_POOL_T(aClass, aT, aPool) \
473 DF_HIDE_IF_NO_SECURE_PARTITION_MEMORY(template< class aT > const char* aClass< aT >::s##aClass##aT##Name = #aClass#aT;) \
474 template< class aT > CINOSPartitionMemory* aClass< aT >::p##aClass##aT##Memory =\
475 CINOSPartitionMemory::Create(sizeof(aClass< aT >),aPool,#aClass#aT,&aClass< aT >::u##aClass##aT##Memory); \
476 template< class aT > uint32 aClass< aT >::u##aClass##aT##Memory = 0;
478 #define IMPLEMENT_DYNAMIC_POOL_T_S(aClass, aT, aS, aPool) \
479 DF_HIDE_IF_NO_SECURE_PARTITION_MEMORY(const char* aClass< aS >::s##aClass##aT##Name = #aClass#aS;) \
480 CINOSPartitionMemory* aClass< aS >::p##aClass##aT##Memory =\
481 CINOSPartitionMemory::Create(sizeof(aClass< aS >),aPool,#aClass#aS,&aClass< aS >::u##aClass##aT##Memory); \
482 uint32 aClass< aS >::u##aClass##aT##Memory = 0;
485 #define DECLARE_DYNAMIC_POOL_T2(aClass, aT1, aT2, aPool ) \
486 static CINOSPartitionMemory* p##aClass##aT1##aT2##Memory; \
487 static uint32 u##aClass##aT1##aT2##Memory; \
488 DF_HIDE_IF_NO_SECURE_PARTITION_MEMORY(static const char* s##aClass##aT1##aT2##Name;) \
490 void* operator new(size_t aSize) \
492 INOS_ADD_(u##aClass##aT1##aT2##Memory, 1); \
493 return p##aClass##aT1##aT2##Memory->Alloc((uint32)aSize DF_HANDLE_MEMPOOL_CLASSNAME_ARG(s##aClass##aT1##aT2##Name)); \
495 void operator delete(void* aPtr) \
497 bool bFreed = p##aClass##aT1##aT2##Memory->Free(aPtr DF_HANDLE_MEMPOOL_CLASSNAME_ARG(s##aClass##aT1##aT2##Name)); \
498 if(bFreed) INOS_ADD_(u##aClass##aT1##aT2##Memory, -1); \
501 #define IMPLEMENT_DYNAMIC_POOL_T2(aClass, aT1, aT2, aPool) \
502 DF_HIDE_IF_NO_SECURE_PARTITION_MEMORY_3(template< class aT1, class aT2 > const char* aClass< aT1, aT2 >::s##aClass##aT1##aT2##Name = #aClass#aT1#aT2;) \
503 template< class aT1, class aT2 > CINOSPartitionMemory* aClass< aT1, aT2 >::p##aClass##aT1##aT2##Memory =\
504 CINOSPartitionMemory::Create(sizeof(aClass< aT1, aT2 >),aPool,#aClass#aT1#aT2,&aClass< aT1, aT2 >::u##aClass##aT1##aT2##Memory); \
505 template< class aT1, class aT2 > uint32 aClass< aT1, aT2 >::u##aClass##aT1##aT2##Memory = 0;
509 #define DECLARE_DYNAMIC_POOL_T3(aClass, aT1, aT2, aT3, aPool ) \
510 static CINOSPartitionMemory* p##aClass##aT1##aT2##aT3##Memory; \
511 static uint32 u##aClass##aT1##aT2##aT3##Memory; \
512 DF_HIDE_IF_NO_SECURE_PARTITION_MEMORY(static const char* s##aClass##aT1##aT2##aT3##Name;) \
514 void* operator new(size_t aSize) \
516 INOS_ADD_(u##aClass##aT1##aT2##aT3##Memory, 1); \
517 return p##aClass##aT1##aT2##aT3##Memory->Alloc((uint32)aSize DF_HANDLE_MEMPOOL_CLASSNAME_ARG(s##aClass##aT1##aT2##aT3##Name)); \
519 void operator delete(void* aPtr) \
521 bool bFreed = p##aClass##aT1##aT2##aT3##Memory->Free(aPtr DF_HANDLE_MEMPOOL_CLASSNAME_ARG(s##aClass##aT1##aT2##aT3##Name)); \
522 if(bFreed) INOS_ADD_(u##aClass##aT1##aT2##aT3##Memory, -1); \
525 #define IMPLEMENT_DYNAMIC_POOL_T3(aClass, aT1, aT2, aT3, aPool) \
526 DF_HIDE_IF_NO_SECURE_PARTITION_MEMORY_5(template< class aT1, class aT2, class aT3 > const char* aClass< aT1, aT2, aT3 >::s##aClass##aT1##aT2##aT3##Name = #aClass#aT1#aT2#aT3;) \
527 template< class aT1, class aT2, class aT3 > CINOSPartitionMemory* aClass< aT1, aT2, aT3 >::p##aClass##aT1##aT2##aT3##Memory =\
528 CINOSPartitionMemory::Create(sizeof(aClass< aT1, aT2, aT3 >),aPool,#aClass#aT1#aT2#aT3,&aClass< aT1, aT2, aT3 >::u##aClass##aT1##aT2##aT3##Memory); \
529 template< class aT1, class aT2, class aT3 > uint32 aClass< aT1, aT2, aT3 >::u##aClass##aT1##aT2##aT3##Memory = 0;
533 #define DECLARE_DYNAMIC_POOL_T4(aClass, aT1, aT2, aT3, aT4, aPool ) \
534 static CINOSPartitionMemory* p##aClass##aT1##aT2##aT3##aT4##Memory; \
535 static uint32 u##aClass##aT1##aT2##aT3##aT4##Memory; \
536 DF_HIDE_IF_NO_SECURE_PARTITION_MEMORY(static const char* s##aClass##aT1##aT2##aT3##aT4##Name;) \
538 void* operator new(size_t aSize) \
540 INOS_ADD_(u##aClass##aT1##aT2##aT3##aT4##Memory, 1); \
541 return p##aClass##aT1##aT2##aT3##aT4##Memory->Alloc((uint32)aSize DF_HANDLE_MEMPOOL_CLASSNAME_ARG(s##aClass##aT1##aT2##aT3##aT4##Name)); \
543 void operator delete(void* aPtr) \
545 bool bFreed = p##aClass##aT1##aT2##aT3##aT4##Memory->Free(aPtr DF_HANDLE_MEMPOOL_CLASSNAME_ARG(s##aClass##aT1##aT2##aT3##aT4##Name)); \
546 if(bFreed) INOS_ADD_(u##aClass##aT1##aT2##aT3##aT4##Memory, -1); \
549 #define IMPLEMENT_DYNAMIC_POOL_T4(aClass, aT1, aT2, aT3, aT4, aPool) \
550 DF_HIDE_IF_NO_SECURE_PARTITION_MEMORY_7(template< class aT1, class aT2, class aT3, class aT4 > const char* aClass< aT1, aT2, aT3, aT4 >::s##aClass##aT1##aT2##aT3##aT4##Name = #aClass#aT1#aT2#aT3#aT4;) \
551 template< class aT1, class aT2, class aT3, class aT4 > CINOSPartitionMemory* aClass< aT1, aT2, aT3, aT4 >::p##aClass##aT1##aT2##aT3##aT4##Memory =\
552 CINOSPartitionMemory::Create(sizeof(aClass< aT1, aT2, aT3, aT4 >),aPool,#aClass#aT1#aT2#aT3#aT4,&aClass< aT1, aT2, aT3, aT4 >::u##aClass##aT1##aT2##aT3##aT4##Memory); \
553 template< class aT1, class aT2, class aT3, class aT4 > uint32 aClass< aT1, aT2, aT3, aT4 >::u##aClass##aT1##aT2##aT3##aT4##Memory = 0;
556 #define DECLARE_DYNAMIC_POOL_N(aClass, aN, aPool ) \
557 static CINOSPartitionMemory* p##aClass##aN##Memory; \
558 static uint32 u##aClass##aN##Memory; \
559 DF_HIDE_IF_NO_SECURE_PARTITION_MEMORY(static const char* s##aClass##aN##Name;)\
561 void* operator new(size_t aSize) \
563 INOS_ADD_(u##aClass##aN##Memory, 1); \
564 return p##aClass##aN##Memory->Alloc((uint32)aSize DF_HANDLE_MEMPOOL_CLASSNAME_ARG(s##aClass##aN##Name));\
566 void operator delete(void* aPtr) \
568 bool bFreed = p##aClass##aN##Memory->Free(aPtr DF_HANDLE_MEMPOOL_CLASSNAME_ARG(s##aClass##aN##Name));\
569 if(bFreed) INOS_ADD_(u##aClass##aN##Memory, -1); \
571 #define IMPLEMENT_DYNAMIC_POOL_N(aClass, aN, aPool) \
572 DF_HIDE_IF_NO_SECURE_PARTITION_MEMORY(template< int aN> const char* aClass< aN >::s##aClass##aN##Name = #aClass#aN;) \
573 template< int aN> CINOSPartitionMemory* aClass< aN >::p##aClass##aN##Memory = \
574 CINOSPartitionMemory::Create(sizeof(aClass< aN >),aPool,#aClass#aN,&aClass< aN >::u##aClass##aN##Memory);\
575 template< int aN> uint32 aClass< aN >::u##aClass##aN##Memory = 0;
578 #define DECLARE_DYNAMIC_POOL_N2(aClass, aN, aM, aPool ) \
579 static CINOSPartitionMemory* p##aClass##aN##aM##Memory; \
580 static uint32 u##aClass##aN##aM##Memory; \
581 DF_HIDE_IF_NO_SECURE_PARTITION_MEMORY(static const char* s##aClass##aN##aM##Name;)\
583 void* operator new(size_t aSize) \
585 INOS_ADD_(u##aClass##aN##aM##Memory, 1); \
586 return p##aClass##aN##aM##Memory->Alloc((uint32)aSize DF_HANDLE_MEMPOOL_CLASSNAME_ARG(s##aClass##aN##aM##Name));\
588 void operator delete(void* aPtr) \
590 bool bFreed = p##aClass##aN##aM##Memory->Free(aPtr DF_HANDLE_MEMPOOL_CLASSNAME_ARG(s##aClass##aN##aM##Name));\
591 if(bFreed) INOS_ADD_(u##aClass##aN##aM##Memory, -1); \
593 #define IMPLEMENT_DYNAMIC_POOL_N2(aClass, aN, aM, aPool) \
594 DF_HIDE_IF_NO_SECURE_PARTITION_MEMORY_3(template< int aN, int aM > const char* aClass< aN, aM >::s##aClass##aN##aM##Name = #aClass#aN#aM;) \
595 template< int aN, int aM > CINOSPartitionMemory* aClass< aN, aM >::p##aClass##aN##aM##Memory = \
596 CINOSPartitionMemory::Create(sizeof(aClass< aN, aM >),aPool,#aClass#aN#aM,&aClass< aN, aM >::u##aClass##aN##aM##Memory); \
597 template< int aN, int aM > uint32 aClass< aN, aM >::u##aClass##aN##aM##Memory = 0;
599 #define IMPLEMENT_DYNAMIC_POOL_I(aClass, aInnerClass, aPool) \
600 DF_HIDE_IF_NO_SECURE_PARTITION_MEMORY(const char* aClass::aInnerClass::s##aClass##aInnerClass##Name = #aClass#aInnerClass;) \
601 CINOSPartitionMemory* aClass::aInnerClass::p##aClass##aInnerClass##Memory =\
602 CINOSPartitionMemory::Create(sizeof(aClass::aInnerClass),aPool,#aClass#aInnerClass,&aClass::aInnerClass::u##aClass##aInnerClass##Memory); \
603 uint32 aClass::aInnerClass::u##aClass##aInnerClass##Memory = 0;
605 #define DECLARE_DYNAMIC_POOL_VARIADIC(aClass, aPool ) \
606 static CINOSPartitionMemory* pMemory; \
607 static uint32 uMemory; \
608 static const char* sName; \
610 void* operator new(size_t aSize); \
611 void operator delete(void* aPtr);
613 #define IMPLEMENT_DYNAMIC_POOL_T4_VARIADIC(aClass, aT1, aT2, aT3, aT4, aPool) \
614 DF_HIDE_IF_NO_SECURE_PARTITION_MEMORY_7( \
615 template< class aT1, class aT2, class aT3, class ... aT4 > \
616 const char* aClass< aT1, aT2, aT3, aT4 ... >::sName = #aClass"<"#aT1"_"#aT2"_"#aT3"_"#aT4">";) \
617 template< class aT1, class aT2, class aT3, class ... aT4> \
618 CINOSPartitionMemory* aClass< aT1, aT2, aT3, aT4 ... >::pMemory = \
619 CINOSPartitionMemory::Create( \
620 sizeof(aClass< aT1, aT2, aT3, aT4 ... >),aPool,#aClass"<"#aT1"_"#aT2"_"#aT3"_"#aT4">", \
621 &aClass< aT1, aT2, aT3, aT4 ... >::uMemory); \
622 template< class aT1, class aT2, class aT3, class ... aT4> \
623 uint32 aClass< aT1, aT2, aT3, aT4 ... >::uMemory = 0; \
624 template< class aT1, class aT2, class aT3, class ... aT4> \
625 void* aClass< aT1, aT2, aT3, aT4 ... >::operator new(size_t aSize) { \
626 INOS_ADD_(uMemory, 1); \
627 return pMemory->Alloc((uint32)aSize DF_HANDLE_MEMPOOL_CLASSNAME_ARG(sName)); \
629 template< class aT1, class aT2, class aT3, class ... aT4> \
630 void aClass< aT1, aT2, aT3, aT4 ... >::operator delete(void* aPtr) { \
631 bool bFreed = pMemory->Free(aPtr DF_HANDLE_MEMPOOL_CLASSNAME_ARG(sName)); \
632 if(bFreed) INOS_ADD_(uMemory, -1); \
636 #define IMPLEMENT_DYNAMIC_POOL_T3_VARIADIC(aClass, aT1, aT2, aT3, aPool) \
637 DF_HIDE_IF_NO_SECURE_PARTITION_MEMORY_5( \
638 template< class aT1, class aT2, class ... aT3 > \
639 const char* aClass< aT1, aT2, aT3 ... >::sName = #aClass"<"#aT1"_"#aT2"_"#aT3">";) \
640 template< class aT1, class aT2, class ... aT3> \
641 CINOSPartitionMemory* aClass< aT1, aT2, aT3 ... >::pMemory = \
642 CINOSPartitionMemory::Create( \
643 sizeof(aClass< aT1, aT2, aT3 ... >),aPool,#aClass"<"#aT1"_"#aT2"_"#aT3">", \
644 &aClass< aT1, aT2, aT3 ... >::uMemory); \
645 template< class aT1, class aT2, class ... aT3> \
646 uint32 aClass< aT1, aT2, aT3 ... >::uMemory = 0; \
647 template< class aT1, class aT2, class ... aT3> \
648 void* aClass< aT1, aT2, aT3 ... >::operator new(size_t aSize) { \
649 INOS_ADD_(uMemory, 1); \
650 return pMemory->Alloc((uint32)aSize DF_HANDLE_MEMPOOL_CLASSNAME_ARG(sName)); \
652 template< class aT1, class aT2, class ... aT3> \
653 void aClass< aT1, aT2, aT3 ... >::operator delete(void* aPtr) { \
654 bool bFreed = pMemory->Free(aPtr DF_HANDLE_MEMPOOL_CLASSNAME_ARG(sName)); \
655 if(bFreed) INOS_ADD_(uMemory, -1); \
659 #define IMPLEMENT_DYNAMIC_POOL_T2_VARIADIC(aClass, aT1, aT2, aPool) \
660 DF_HIDE_IF_NO_SECURE_PARTITION_MEMORY_3( \
661 template< class aT1, class ... aT2 > \
662 const char* aClass< aT1, aT2 ... >::sName = #aClass"<"#aT1"_"#aT2">";) \
663 template< class aT1, class ... aT2> \
664 CINOSPartitionMemory* aClass< aT1, aT2 ... >::pMemory = \
665 CINOSPartitionMemory::Create( \
666 sizeof(aClass< aT1, aT2 ... >),aPool,#aClass"<"#aT1"_"#aT2">", \
667 &aClass< aT1, aT2 ... >::uMemory); \
668 template< class aT1, class ... aT2> uint32 aClass< aT1, aT2 ... >::uMemory = 0; \
669 template< class aT1, class ... aT2> \
670 void* aClass< aT1, aT2 ... >::operator new(size_t aSize) { \
671 INOS_ADD_(uMemory, 1); \
672 return pMemory->Alloc((uint32)aSize DF_HANDLE_MEMPOOL_CLASSNAME_ARG(sName)); \
674 template< class aT1, class ... aT2> \
675 void aClass< aT1, aT2 ... >::operator delete(void* aPtr) { \
676 bool bFreed = pMemory->Free(aPtr DF_HANDLE_MEMPOOL_CLASSNAME_ARG(sName)); \
677 if(bFreed) INOS_ADD_(uMemory, -1); \
684 #endif // INC_CINOSPARTITIONMEMORY_H