1#ifndef MULTIHEAP_INCLUDED
2#define MULTIHEAP_INCLUDED
3typedef unsigned size_t32;
4typedef unsigned size_t32;
11#define GUARD_BITS 0x600DB1D5
12#define MAX_BUFFER32_SIZE 16*1024*1024/4
37 unsigned CheckGuardBits(){
38 if (guardInfoBits0!=GUARD_BITS){
41 if (guardInfoBits1!=GUARD_BITS){
46 if ((*pFinalGuardBits)!=GUARD_BITS){
49 if (*(pFinalGuardBits+1)!=GUARD_BITS){
79 C_Heap (
void* addrHeap, size_t32 size32Heap){
80 Create(addrHeap,size32Heap);
84 void Create(
void* addrHeap, size_t32 size32Heap){
94 pHeapEnd = (
int*)addrHeap+size32Heap;
120 if (size32Between>size32Max)
121 size32Max=size32Between;
125 if (size32Between>size32Max)
126 size32Max=size32Between;
137 size32Buffer+=(size32Buffer&1);
144 if (size32Between>=size32Buffer+
sizeof(
S_BufferInfo)/
sizeof(int)){
155 pAllocateBuffer->guardInfoBits0=GUARD_BITS;
156 pAllocateBuffer->guardInfoBits1=GUARD_BITS;
158 *guardEndBits =GUARD_BITS;
159 *(guardEndBits+1)=GUARD_BITS;
170 if (size32Between>=size32Buffer+
sizeof(
S_BufferInfo)/
sizeof(int)){
179 pAllocateBuffer->guardInfoBits0=GUARD_BITS;
180 pAllocateBuffer->guardInfoBits1=GUARD_BITS;
182 *guardEndBits =GUARD_BITS;
183 *(guardEndBits+1)=GUARD_BITS;
286 int AllocatedMemory=0;
289 for(
int i=0;i<100;i++){
299 if (status=pBuffer->CheckGuardBits()){
310 if (AllocatedMemory>MaxHeapSize){
325#define ALLOCATE_FORWARD 1
326#define ALLOCATE_BACKWARD 2
327#define ALLOCATE_RANDOM 4
328#define ALLOCATE_CUSTOM 8
329#define MAX_NUM_BANKS 6
345 unsigned idxAllocateLegend;
346 long long allocateHistory;
360 void Mode(
int mode,
void** legend=0){
370 m_z = 36969 * (m_z & 0xFFFF) + (m_z >> 16);
371 m_w = 18000 * (m_w & 0xFFFF) + (m_w >> 16);
372 return (m_z << 16) + m_w;
374 unsigned Rand(
unsigned min,
unsigned max){
376 r=(r-min)%(max-min+1)+min;
381 C_Heap& operator [](
int idxHeap){
382 return pHeap[idxHeap];
403 case ALLOCATE_FORWARD:
421 case ALLOCATE_BACKWARD:
440 case ALLOCATE_RANDOM:{
441 unsigned mapAllocateFails=0;
442 unsigned mapNoMemory=0xFFFFFFFF>>(32-
numHeaps);
443 while(mapAllocateFails!=mapNoMemory){
445 mapAllocateFails|=(1<<i);
462 case ALLOCATE_CUSTOM:{
479 void*
Allocate(size_t32 size32Buffer,
int nPriorHeap0,
int nPriorHeap1=-1,
int nPriorHeap2=-1,
int nPriorHeap3=-1,
int nPriorHeap4=-1,
int nPriorHeap5=-1){
491 if (nPriorHeap1!=-1){
501 if (nPriorHeap2!=-1){
512 if (nPriorHeap3!=-1){
522 if (nPriorHeap4!=-1){
533 if (nPriorHeap5!=-1){
550 if (
pHeap[i].IsMine(addrInTheSameHeap)){
567 if (
pHeap[i].IsMine(addr))
573 void Lock(
void* addr){
578 int Unlock(
void* addr){
596 int Release(
void* addr){
601 if (
pHeap[i].IsMine(addr)){
625 if (
pHeap[i].Check())
626 return pHeap[i].status;
653 C_BoxVec(T* Data,
int SizeData,
int SizeBorder=0){
655 Assign(Data, SizeData, SizeBorder);
666 return nmppsAddr_(pData,idx);
669 int Assign (T* Data,
int SizeData,
int SizeBorder=0){
671 pBox =nmppsAddr_(pData,-SizeBorder);
673 sizeBox =SizeData+2*SizeBorder;
675 T* Allocate(
C_MultiHeap& MultiHeap,
int SizeData,
int Border=0){
684 sizeBox =sizeData+2*nBorder;
685 int sizeBox32=(int)nmppsAddr_((T*)0,sizeBox)/
sizeof(
int);
686 pBox =(T*)MultiHeap.
Allocate(sizeBox32);
688 pData=nmppsAddr_(pBox,(sizeBox-sizeData)/2);
696 pHeap->Release(pBox);
705 pHeap->Release(pBox);
712#define BOX_nmppiFILL_NONE 0xF111DEAD
713#define BOX_nmppiFILL_RAND 0xF1110123
714#define BOX_nmppiFILL_00 0
715#define BOX_nmppiFILL_01 1
716#define BOX_nmppiFILL_FF -1
742 C_BoxImg(
C_MultiHeap& MultiHeap,
int Width,
int Height,
int BorderHeight=0,
int FillMode=BOX_nmppiFILL_FF){
745 nBorder=BorderHeight;
747 pData=(T*)0xcbcbcbcb;
749 if (Allocate(MultiHeap))
760 void Fill(
int FillMode){
761 if (FillMode==BOX_nmppiFILL_NONE)
763 if (FillMode==BOX_nmppiFILL_RAND){
764 nmppsRandUniform_(pBox,sizeBox);
767 nmppsSet_(pBox,FillMode,sizeBox);
770 C_BoxImg(T* Data,
int Width,
int Height,
int BorderHeight=0){
775 nBorder =BorderHeight;
776 pBox =nmppsAddr_(pData,-nBorder*nWidth);
777 sizeData=nWidth*nHeight;
778 sizeBox =sizeData+2*nBorder*nWidth;
780 void Init(T* Data,
int Width,
int Height,
int BorderHeight=0){
785 nBorder =BorderHeight;
786 pBox =nmppsAddr_(pData,-nBorder*nWidth);
787 sizeData=nWidth*nHeight;
788 sizeBox =sizeData+2*nBorder*nWidth;
790 T* Addr(
int y,
int x){
791 return nmppsAddr_(pData,y*nWidth+x);
794 T* Allocate(
C_MultiHeap& MultiHeap,
int Width,
int Height,
int BorderHeight=0){
797 nBorder=BorderHeight;
798 return Allocate(MultiHeap);
803 if (MultiHeap.Check())
807 sizeData=nWidth*nHeight;
808 sizeBox =sizeData+2*nBorder*nWidth;
809 int sizeBox32=(int)nmppsAddr_((T*)0,sizeBox)/
sizeof(
int);
810 pBox=(T*)MultiHeap.
Allocate(sizeBox32);
812 pData=nmppsAddr_(pBox,(sizeBox-sizeData)/2);
818 pHeap->Release(pBox);
826 __INLINE__ T* operator [] (
int idx){
827 return nmppsAddr_(pData,idx);
832 pHeap->Release(pBox);
Definition: multiheap.h:330
Definition: multiheap.h:718
Definition: multiheap.h:635
класс - куча
Definition: multiheap.h:64
int * Allocate(size_t32 size32Buffer)
Выделяет буфер в куче
Definition: multiheap.h:132
C_Heap(void *addrHeap, size_t32 size32Heap)
конструктор - создает кучу в указанной памяти
Definition: multiheap.h:79
void UnlockAll()
разблокирует все указатели для удаления через Release
Definition: multiheap.h:233
void Unlock(void *p)
разблокирует все указатели для удаления через Release
Definition: multiheap.h:242
int IsMine(void *addr)
устанавливает принадлежность к куче
Definition: multiheap.h:99
void ReleaseAll()
удаляет все указатели из кучи
Definition: multiheap.h:249
void LockHeap()
Запрещает операции с кучей
Definition: multiheap.h:261
void Lock(void *p)
блокирует указатель от удаления через Release
Definition: multiheap.h:219
int size32HeapAvail
< размер общей свободной памяти в куче
Definition: multiheap.h:68
int Release(void *p)
осообождат память по адресу
Definition: multiheap.h:211
size_t32 AllocateMaxAvail()
Возвращает объем свободной памяти в пуле в 32р. словах
Definition: multiheap.h:115
int ReleaseBuffer(S_BufferInfo *pDelBuffer)
удаляет структуру буфера из списка
Definition: multiheap.h:194
S_BufferInfo * pZeroBuffer
< указатель на нулевой буфер в списке (c нулевым размером)
Definition: multiheap.h:66
void LockAll()
блокирует все указатели от удаления через Release
Definition: multiheap.h:225
void Create(void *addrHeap, size_t32 size32Heap)
создает кучу в указанной памяти
Definition: multiheap.h:84
void UnlockHeap()
Разрещает операции с кучей
Definition: multiheap.h:265
int * pHeapEnd
< указатель на слово следуюшее за концом кучи
Definition: multiheap.h:67
bool isHeapLocked
< запрещает операции с кучей
Definition: multiheap.h:69
Definition: multiheap.h:336
void ReleaseAll()
Удваляет все назаблокированные указатели из куч
Definition: multiheap.h:609
int CreateHeap(void *addrHeap, size_t32 size32Heap)
создает кучу по адресууказанного размера (полный размер со служебными данными)
Definition: multiheap.h:386
int Which(void *addr)
Возвращает номер кучи к которой принадлежит адрес
Definition: multiheap.h:565
void ** pAllocateLegend
история номеров куч использованных в последних 8 Allocate
Definition: multiheap.h:344
unsigned AllocateMode
порядок обхода куч при поиске свободного места
Definition: multiheap.h:343
void UnlockHeap(int idxHeap)
Разрещает операции Allocate и Release с кучей
Definition: multiheap.h:620
unsigned numAllocateFails
число ошибок выделения куч
Definition: multiheap.h:342
void LockHeap(int idxHeap)
Запрещает операции Allocate и Release с кучей
Definition: multiheap.h:616
void * Allocate(size_t32 size32Buffer)
обходит кучи в заднном в AllocateMode порядке и выделяет память заданного размера
Definition: multiheap.h:397
unsigned Rand()
Генератор случайных чисел
Definition: multiheap.h:368
C_Heap pHeap[MAX_NUM_BANKS]
массив куч
Definition: multiheap.h:340
void * Allocate(size_t32 size32Buffer, int nPriorHeap0, int nPriorHeap1=-1, int nPriorHeap2=-1, int nPriorHeap3=-1, int nPriorHeap4=-1, int nPriorHeap5=-1)
обходит кучи в заднном порядке и выделяет память заданного размера
Definition: multiheap.h:479
void * AllocateWith(size_t32 size32Buffer, void *addrInTheSameHeap)
выделяет массив в той же куче где и указатель
Definition: multiheap.h:548
unsigned numHeaps
число проининицализированных куч
Definition: multiheap.h:341
класс буфер - заголовок в начале выделяемой данамической памяти
Definition: multiheap.h:14
S_BufferInfo * pPrevBuffer
< указатель на предыдущий буфер в списке
Definition: multiheap.h:17
int * EndGuardBits()
Возвращает указатель на конечные защитные поля (2 слова)
Definition: multiheap.h:34
S_BufferInfo * pNextBuffer
< указатель на следующий буфер в списке
Definition: multiheap.h:18
int * DataBegin()
Возвращает указатель на данные в буфере
Definition: multiheap.h:24
int * DataEnd()
Возвращает указатель на конец данных в буфере (следу)
Definition: multiheap.h:29
bool isLocked
< флаг блокировки буфера, запрещаюий его удаление с помощью Release()
Definition: multiheap.h:19
size_t32 size32Buffer
< размер массива данных в буфере в 32-р словах
Definition: multiheap.h:16