Files
mir_server/Gateway/srvlib/include/memory/memory_container.hpp

173 lines
4.4 KiB
C++
Raw Normal View History

2025-01-09 17:45:40 +08:00
#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_