typedef struct yumei_mem_buf_s yumei_mem_buf_t;
typedef struct yumei_mem_pool_s yumei_mem_pool_t;
struct yumei_mem_buf_s
{
int size;
char *pos;
char *data;
yumei_mem_pool_t *pool;
};
struct yumei_mem_pool_s
{
int size;
char *data;
char *last;
yumei_mem_pool_t *next;
yumei_mem_pool_t *current;
};
yumei_mem_pool_t* yumei_mem_pool_create( int block_size, int block_num );
int yumei_mem_pool_free( yumei_mem_pool_t *pool );
yumei_mem_buf_t* yumei_mem_malloc( yumei_mem_pool_t *pool, int size );
int yumei_mem_buf_free( yumei_mem_buf_t *buf );
在每個連接開始的時候,創建連接唯一的內存池,存放IO數據,當要創建新業務時,創建業務內存池,業務處理完畢時釋放內存池:
typedef struct yumei_busi_s yumei_busi_t;
struct yumei_busi_s
{
yumei_mem_pool_t *pool;
...
...
}
#define yumei_BUSI_MEM_BLOCL_SIZE 512
#define yumei_BUSI_MEM_BLOCK_NUM 32
yumei_busi_t* yumei_busi_create()
{
yumei_busi_t* busi;
yumei_pool_t* pool;
yumei_mem_buf_t* buf;
int size;
pool = yumei_mem_pool_create( yumei_BUSI_MEM_BLOCL_SIZE, yumei_BUSI_MEM_BLOCK_NUM );
if( !pool ){
return 0;
}
size = sizeof( yumei_busi_t );
buf = yumei_mem_buf_malloc( pool, size );
if( !buf ){
yumei_mem_pool_free( pool );
return 0;
}
busi = buf->data;
return busi;
}
#define YUMEI_BUSI_ERROR -1
#define YUMEI_BUSI_OK 0
int yumei_busi_free( yumei_busi_t* busi )
{
if( !busi ){
return YUMEI_BUSI_ERROR;
}
yumei_mem_pool_free( busi->pool );
return YUMEI_BUSI_OK;
}
有些時候業務比較簡單,一個連接僅對應一個業務或多個業務不是並行執行,這樣的情況下,就不再需要業務內存池了,可以直接用連接內存池:
yumei_busi_t* yumei_busi_create( yumei_conn_t* conn )
{
yumei_busi_t* busi;
yumei_pool_t* pool;
yumei_mem_buf_t* buf;
int size;
pool = conn->pool;
if( !pool ){
retur 0;
}
size = sizeof( yumei_busi_t );
buf = yumei_mem_buf_malloc( pool, size );
if( !buf ){
yumei_mem_pool_free( pool );
return 0;
}
busi = buf->data;
return busi;
}
#define YUMEI_CONN_ERROR -1
#define YUMEI_CONN_OK 0
int yumei_conn_close( yumei_conn_t* conn )
{
if( !conn ){
return YUMEI_CONN_ERROR;
}
yumei_mem_pool_free( conn->pool );
return YUMEI_CONN_OK;
}
typedef struct yumei_mem_large_s yumei_mem_large_t;
struct yumei_mem_large_s
{
char *data;
int size;
yumei_mem_large_t *next;
}
struct yumei_mem_pool_s
{
int size;
char *data;
char *last;
yumei_mem_pool_t *next;
yumei_mem_pool_t *current;
yumei_mem_large_t *large;
};