173 lines
4.4 KiB
C++
173 lines
4.4 KiB
C++
|
|
#ifndef _BUFF_ALLOCATOR_H_
|
|||
|
|
#define _BUFF_ALLOCATOR_H_
|
|||
|
|
|
|||
|
|
/************************************************************************
|
|||
|
|
* һ<EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>η<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD>ĵط<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD>Ķ<EFBFBD>ȡ
|
|||
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĺô<EFBFBD><EFBFBD>ǣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ṩ<EFBFBD>ͷ<EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD>ĺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD><EFBFBD><EFBFBD>Ҫһ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD>ֹ<EFBFBD><EFBFBD>ͷţ<EFBFBD>
|
|||
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD>
|
|||
|
|
************************************************************************/
|
|||
|
|
|
|||
|
|
|
|||
|
|
#include "os_def.h"
|
|||
|
|
#include "memory_counter.hpp"
|
|||
|
|
|
|||
|
|
template <typename T, int ONE_TIME_COUNT = 1024>
|
|||
|
|
class MemoryContainer : public AllocatorCounterItem
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
typedef AllocatorCounterItem Inherited;
|
|||
|
|
|
|||
|
|
//<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ṹ<EFBFBD><E1B9B9><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD>ѯ<EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|||
|
|
struct DataBlockDesc
|
|||
|
|
{
|
|||
|
|
const char* addr;//<2F>ڴ<EFBFBD><DAB4><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ַ
|
|||
|
|
size_t block_size; //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>С
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
//<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
|
|||
|
|
struct DataBlock
|
|||
|
|
{
|
|||
|
|
T* free_ptr; //ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD>еĶ<D0B5><C4B6><EFBFBD>
|
|||
|
|
T* end_ptr; //ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD>
|
|||
|
|
DataBlock* prev;
|
|||
|
|
} *data_block_;
|
|||
|
|
|
|||
|
|
public:
|
|||
|
|
|
|||
|
|
#ifndef _MEMORY_TRACE_
|
|||
|
|
T* AllocBuffer(size_t count)
|
|||
|
|
#else
|
|||
|
|
T* _AllocBuffer(size_t count, const char*, int)
|
|||
|
|
#endif
|
|||
|
|
{
|
|||
|
|
T* result;
|
|||
|
|
DataBlock *block_ptr = data_block_;
|
|||
|
|
//<2F><><EFBFBD>Դӵ<D4B4>ǰ<EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>nCount<6E>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>㹻<EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮ǰ<D6AE><C7B0><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㹻<EFBFBD>Ŀ<EFBFBD><C4BF>ж<EFBFBD><D0B6><EFBFBD>
|
|||
|
|
if ( !block_ptr || size_t(block_ptr->end_ptr - block_ptr->free_ptr) < count )
|
|||
|
|
{
|
|||
|
|
//<2F><>֮ǰ<D6AE><C7B0><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㹻<EFBFBD>Ŀ<EFBFBD><C4BF>ж<EFBFBD><D0B6><EFBFBD>
|
|||
|
|
while (block_ptr && (block_ptr = block_ptr->prev))
|
|||
|
|
{
|
|||
|
|
if ( size_t(block_ptr->end_ptr - block_ptr->free_ptr) >= count )
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>ж<EFBFBD>û<EFBFBD><C3BB><EFBFBD>㹻<EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
|
|||
|
|
if ( block_ptr == NULL )
|
|||
|
|
{
|
|||
|
|
size_t alloc_count = __max(count, ONE_TIME_COUNT);
|
|||
|
|
block_ptr = (DataBlock*)malloc(sizeof(DataBlock) + sizeof(T) * alloc_count);
|
|||
|
|
memset(block_ptr, 0, sizeof(DataBlock) + sizeof(T) * alloc_count);
|
|||
|
|
#ifdef _MEMORY_TRACE_
|
|||
|
|
alloc_total_ += alloc_count;
|
|||
|
|
#endif
|
|||
|
|
block_ptr->free_ptr = (T*)(block_ptr + 1);
|
|||
|
|
block_ptr->end_ptr = block_ptr->free_ptr + alloc_count;
|
|||
|
|
block_ptr->prev = data_block_;
|
|||
|
|
data_block_ = block_ptr;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//<2F><><EFBFBD>ض<EFBFBD><D8B6><EFBFBD>ָ<EFBFBD><D6B8>
|
|||
|
|
result = block_ptr->free_ptr;
|
|||
|
|
block_ptr->free_ptr += count;
|
|||
|
|
#ifdef _MEMORY_TRACE_
|
|||
|
|
used_count_ += count;
|
|||
|
|
#endif
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void _FreeBuffer()
|
|||
|
|
{
|
|||
|
|
DataBlock *block_ptr, *prev;
|
|||
|
|
block_ptr = data_block_;
|
|||
|
|
while (block_ptr)
|
|||
|
|
{
|
|||
|
|
prev = block_ptr->prev;
|
|||
|
|
free(block_ptr);
|
|||
|
|
block_ptr = prev;
|
|||
|
|
}
|
|||
|
|
data_block_ = NULL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><>ȡ<EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
inline int blockCount() const
|
|||
|
|
{
|
|||
|
|
int result = 0;
|
|||
|
|
DataBlock *block_ptr = data_block_;
|
|||
|
|
|
|||
|
|
while (block_ptr)
|
|||
|
|
{
|
|||
|
|
result++;
|
|||
|
|
block_ptr = block_ptr->prev;
|
|||
|
|
}
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
/*
|
|||
|
|
* Comments: ö<EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|||
|
|
* Param LPCVOID lpEnumKey: <EFBFBD>ϴ<EFBFBD>ö<EFBFBD>ٵķ<EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊö<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ö<EFBFBD>ٴ<EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪNULL<EFBFBD><EFBFBD>
|
|||
|
|
* Param DataBlockDesc & desc: <EFBFBD><EFBFBD><EFBFBD>ڱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @Return LPCVOID: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><EFBFBD>keyָ<EFBFBD>룬<EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>ö<EFBFBD>١<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵΪNULL<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾö<EFBFBD>ٽ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*
|
|||
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еģ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>ٵ<EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*
|
|||
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-------------------------------------------------
|
|||
|
|
* LPCVOID lpEnumKey = NULL;
|
|||
|
|
* BuffAllocator<T>::DataBlockDesc desc;
|
|||
|
|
* while (lpEnumKey = allocator.enumBlockDesc(lpEnumKey, desc))
|
|||
|
|
* {
|
|||
|
|
* printf("Memory Block Info { Address = %X, Size = %u }",
|
|||
|
|
* desc.lpBaseAddress, desc.dwBlockSize);
|
|||
|
|
* }
|
|||
|
|
* --------------------------------------------------------------
|
|||
|
|
*/
|
|||
|
|
inline void* enumBlockDesc(void* enum_key, DataBlockDesc &desc) const
|
|||
|
|
{
|
|||
|
|
DataBlock *block_ptr = (DataBlock*)enum_key;
|
|||
|
|
if (!block_ptr)
|
|||
|
|
block_ptr = data_block_;
|
|||
|
|
else block_ptr = block_ptr->prev;
|
|||
|
|
|
|||
|
|
if (block_ptr)
|
|||
|
|
{
|
|||
|
|
desc.addr = ((const char*)block_ptr) + sizeof(*block_ptr);
|
|||
|
|
desc.block_size = block_ptr->end_ptr - desc.addr;
|
|||
|
|
return block_ptr;
|
|||
|
|
}
|
|||
|
|
return NULL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
MemoryContainer(const char* namestr) : Inherited(namestr)
|
|||
|
|
{
|
|||
|
|
data_block_ = NULL;
|
|||
|
|
}
|
|||
|
|
virtual ~MemoryContainer()
|
|||
|
|
{
|
|||
|
|
DataBlock *block_ptr, *prev;
|
|||
|
|
block_ptr = data_block_;
|
|||
|
|
while (block_ptr)
|
|||
|
|
{
|
|||
|
|
prev = block_ptr->prev;
|
|||
|
|
free(block_ptr);
|
|||
|
|
block_ptr = prev;
|
|||
|
|
}
|
|||
|
|
data_block_ = NULL;
|
|||
|
|
MemoryCounter::getSingleton().unregist((AllocatorCounterItem*)this);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
inline MemoryContainer& operator = (const MemoryContainer &rhs)
|
|||
|
|
{
|
|||
|
|
Inherited::operator=(rhs);
|
|||
|
|
data_block_ = rhs.data_block_;
|
|||
|
|
return *this;
|
|||
|
|
}
|
|||
|
|
//public:
|
|||
|
|
//#ifdef _MEMORY_TRACE_
|
|||
|
|
// virtual int Log(char* buf, int num){ return sprintf(buf,"alloc total:%d,used:%d",alloc_total_,used_count); }
|
|||
|
|
//#endif
|
|||
|
|
private:
|
|||
|
|
MemoryContainer(const MemoryContainer &rhs);
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
#endif //end _BUFF_ALLOCATOR_H_
|