95 lines
2.6 KiB
C
95 lines
2.6 KiB
C
|
|
#ifndef _MSG_ALLOCATOR_H_
|
|||
|
|
#define _MSG_ALLOCATOR_H_
|
|||
|
|
|
|||
|
|
#include "os_def.h"
|
|||
|
|
#include "x_tick.h"
|
|||
|
|
#include "base_allocator.hpp"
|
|||
|
|
#include "x_lock.h"
|
|||
|
|
|
|||
|
|
class BaseAllocator;
|
|||
|
|
|
|||
|
|
using namespace tick64;
|
|||
|
|
using namespace lock;
|
|||
|
|
|
|||
|
|
class BufferAllocator: public BaseAllocator
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
public:
|
|||
|
|
static const unsigned int SmallBufferSize = 64; //С<><D0A1><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>С
|
|||
|
|
static const unsigned int MiddleBufferSize = 256; //<2F>е<EFBFBD><D0B5>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>С
|
|||
|
|
static const unsigned int LargeBufferSize = 1024; //<2F><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>С
|
|||
|
|
|
|||
|
|
#pragma pack(push, 1)
|
|||
|
|
typedef struct tagBuffer
|
|||
|
|
{
|
|||
|
|
size_t size_; //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>ݶδ<DDB6>С
|
|||
|
|
tagBuffer* prev_buffer_;//ָ<><D6B8><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|||
|
|
int64_t free_tick_; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٵ<EFBFBD>ʱ<EFBFBD><CAB1>
|
|||
|
|
#ifdef _MEMORY_TRACE_
|
|||
|
|
tagBuffer* next_buffer_;//ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD>¸<EFBFBD><C2B8>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>룬<EFBFBD><EBA3AC><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>
|
|||
|
|
struct
|
|||
|
|
{
|
|||
|
|
const char* fn_; //<2F><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>λ<EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>
|
|||
|
|
int line_;
|
|||
|
|
} al, fl;
|
|||
|
|
bool used_flag_; //<2F>Ƿ<EFBFBD>ʹ<EFBFBD>õı<C3B5><C4B1><EFBFBD>
|
|||
|
|
#endif
|
|||
|
|
} BUFFER, *PBUFFER;
|
|||
|
|
#pragma pack(pop)
|
|||
|
|
|
|||
|
|
struct BufferStatic
|
|||
|
|
{
|
|||
|
|
size_t alloc_size_;
|
|||
|
|
size_t free_size_;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
typedef struct tagAllocatorMemoryInfo
|
|||
|
|
{
|
|||
|
|
BufferStatic SmallBuffer;
|
|||
|
|
BufferStatic MiddleBuffer;
|
|||
|
|
BufferStatic LargeBuffer;
|
|||
|
|
BufferStatic SuperBuffer;
|
|||
|
|
} ALLOCATOR_MEMORY_INFO;
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
Mutex buffer_lock_; //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
PBUFFER last_small_buffer_; //ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>С<EFBFBD><D0A1><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|||
|
|
PBUFFER last_middle_buffer_; //ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|||
|
|
PBUFFER last_large_buffer_; //ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>еĴ<D0B5><C4B4><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|||
|
|
PBUFFER last_super_buffer_; //ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>еij<D0B5><C4B3><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|||
|
|
#ifdef _MEMORY_TRACE_
|
|||
|
|
PBUFFER last_alloced_buffer_; //ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
|
|||
|
|
#endif
|
|||
|
|
size_t alloced_small_size_; //<2F>ѱ<EFBFBD><D1B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>С
|
|||
|
|
size_t alloced_middle_size_; //<2F>ѱ<EFBFBD><D1B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>С
|
|||
|
|
size_t alloced_large_size_; //<2F>ѱ<EFBFBD><D1B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>С
|
|||
|
|
size_t alloced_super_size_; //<2F>ѱ<EFBFBD><D1B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>С
|
|||
|
|
size_t freed_small_size_; //<2F>ѱ<EFBFBD><D1B1>ͷŵ<CDB7>С<EFBFBD><D0A1><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>С
|
|||
|
|
size_t freed_middle_size_; //<2F>ѱ<EFBFBD><D1B1>ͷŵ<CDB7><C5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>С
|
|||
|
|
size_t freed_large_size_; //<2F>ѱ<EFBFBD><D1B1>ͷŵĴ<C5B5><C4B4><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>С
|
|||
|
|
size_t freed_super_size_; //<2F>ѱ<EFBFBD><D1B1>ͷŵij<C5B5><C4B3><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>С
|
|||
|
|
|
|||
|
|
bool mult_thread_;
|
|||
|
|
public:
|
|||
|
|
BufferAllocator(const char* namestr);
|
|||
|
|
~BufferAllocator();
|
|||
|
|
|
|||
|
|
#ifndef _MEMORY_TRACE_
|
|||
|
|
void* AllocBuffer(size_t size);
|
|||
|
|
void* ReAllocBuffer(void* ptr, size_t new_size);
|
|||
|
|
void FreeBuffer(void* ptr);
|
|||
|
|
#else
|
|||
|
|
void* _AllocBuffer(size_t size, const char* fn, int line);
|
|||
|
|
void* _ReAllocBuffer(void* ptr, size_t new_size, const char* fn, int line);
|
|||
|
|
void _FreeBuffer(void* ptr, const char* fn, int line);
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
void GetMemoryInfo(BufferAllocator::ALLOCATOR_MEMORY_INFO* pMemoryInfo);
|
|||
|
|
void CheckFreeBuffers();
|
|||
|
|
void SetMultiThread(bool flag);
|
|||
|
|
void GC();
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
#endif
|
|||
|
|
|