在上文中,对mBlk三元组的原理进行了简单的介绍。下面将简单介绍三元组的实现,对其部分代码进行分析。
mBlk是用C语言实现的,因此其中包含了大量复杂的指针操作和函数指针。
1、函数表poolFunc
poolFunc是一个结构体,其中定义了多个函数指针,用来操作存储池,包括初始化netPool,申请和归还mBlk、ClBlk和Cluster等。
系统定义的默认函数表如下:
LOCAL POOL_FUNC dfltFuncTbl = /* default pool function table */
{
_poolInit,
_mBlkFree,
_clBlkFree,
_clFree,
_mBlkClFree,
_mBlkGet,
_clBlkGet,
_clusterGet,
_mClGet,
_clPoolIdGet, //由于存在多个Cluster子池,因此申请Cluster时,必须先得到其对应的Cluster池
};
2、存储池netPool的初始化
通过函数表中的函数指针 STATUS (*pInitRtn) (NET_POOL_ID pNetPool, M_CL_CONFIG * pMclBlkConfig, CL_DESC * pClDescTbl, int clDescTblNumEnt, BOOL fromKheap);来完成存储池的初始化。
默认情况下,函数指针指向_poolInit()函数。
LOCAL STATUS _poolInit
(
NET_POOL_ID pNetPool, /* pointer to a net pool */
M_CL_CONFIG * pMclBlkConfig, /* pointer to mBlk,clBlk config */
CL_DESC * pClDescTbl, /* pointer to cluster desc table */
int clDescTblNumEnt, /* number of cluster desc entries */
BOOL fromKheap /* 1:KHEAP_ALLOC 0:malloc/calloc */
)
_poolInit()通过传入的配置参数来完成初始化。
pMclBlkConfig结构体中存储着mBlk和ClBlk的配置信息:
typedef struct
{
int mBlkNum; /* number of mBlks */
int clBlkNum; /* number of cluster Blocks */
char * memArea; /* pre allocated memory area */
int memSize; /* pre allocated memory size */
} M_CL_CONFIG;
其中保存着mBlk、ClBlk的个数,并为mBlk和ClBlk预分配了一定内存。
pClDescTbl则保存着各个Cluster池的配置信息:
typedef struct clDesc
{
int clSize; /* cluster type */
int clNum; /* number of clusters */
char * memArea; /* pre allocated memory area */
int memSize; /* pre allocated memory size */
} CL_DESC;
pClDescTbl中的每一个元素都保存着对应的Cluster池的信息,包括Cluster的大小、个数,以及为当前Cluster池中所有Cluster预先分配的内存空间。
在_poolInit()函数中,则根据相应的配置信息,来将存储池中各个子池中元素链接成链表,并将相关信息存储在结构体netPool中,然后即可通过netPool来管理所有元素。
3、示例
一个简单的使用示例如下:
M_CL_CONFIG mClBlkConfig;
CL_DESC clDescTbl[1]; //数组大小为1,说明只分配一个Cluster池
int clDescTblNumEnt = 1;
NetPoolPtr = (NET_POOL_ID)malloc(sizeof(NET_POOL));
mClBlkConfig.mBlkNum = 2000;//2000个mBlk
mClBlkConfig.clBlkN