PJLIB代码研读(一)

 

首先要研究一下内存管理

 

pj_pool_factory *mem;
int _tmain(int argc, _TCHAR* argv[])
{
    pj_caching_pool caching_pool;
    int rc = 0;
    pj_pool_t *pool;
    char *p;
    mem = &caching_pool.factory;
    rc = pj_init();
    pj_caching_pool_init( &caching_pool, NULL, 0 );

    pool = pj_pool_create(mem, NULL, 1024 * 1024, 0, NULL);   //这里才真正的完成了从系统申请内存的操作


    p=(char*)pj_pool_alloc(pool, 1024);          //从缓冲区中申请内存

    strcpy(p,"Hello world");
    printf("%s\n",p);
    pj_pool_release(pool);                     //把内存交给系统
    getchar();
   return 0;
}

 

pj_caching_pool是一个内存结构,用来描述内存,结构定义如下

struct pj_caching_pool
{
    pj_pool_factory factory;    //工厂
    pj_size_t     capacity;   //当前容量(应该是使用的容量)
    pj_size_t       max_capacity; //最大的容量
    pj_size_t       used_count;    //内存块的个数
    pj_size_t     used_size;    //没有使用的内存尺寸
    pj_size_t     peak_used_size;    //使用峰值
    pj_list     free_list[PJ_CACHING_POOL_ARRAY_SIZE];   //没有使用的内存块列表
    pj_list     used_list;    //已经使用的内存块列表
    char     pool_buf[256 * (sizeof(long) / 4)]; //内部内存池
    pj_lock_t    *lock;       //锁
}

其中最重要的当然是内存工厂了,结构定义如下


struct pj_pool_factory
{

    pj_pool_factory_policy policy;

    pj_pool_t* (*create_pool)( pj_pool_factory *factory,const char *name,pj_size_t initial_size, pj_size_t increment_size,pj_pool_callback *callback);
    void (*release_pool)( pj_pool_factory *factory, pj_pool_t *pool );
    void (*dump_status)( pj_pool_factory *factory, pj_bool_t detail );
    pj_bool_t (*on_block_alloc)(pj_pool_factory *factory, pj_size_t size);
    void (*on_block_free)(pj_pool_factory *factory, pj_size_t size);

};

该工厂用于挂接内存操作函数

 

pj_caching_pool_init 完成了pj_caching_pool 和pj_pool_factory的初始化,本实例源代码中内存工厂挂载的策略和操作函数都使用了默认的定义。


pool = pj_pool_create(mem, NULL, 1024 * 1024, 0, NULL);   //这里才真正的完成了从系统申请内存的操作
这个函数实际上市调用工厂的创建函数,并根据pj_caching_pool的成员向系统申请了内存,C没有this指针,是如何根据工厂找到pj_caching_pool的呢?原来使用了一个小技巧

pj_caching_pool *cp = (pj_caching_pool*)pf; 其实结构体的第一个成员的地址和结构体的地址是相同的。

 

剩下的代码就好理解了

p=(char*)pj_pool_alloc(pool, 1024);          //从缓冲区中申请内存,我猜测应该有对应的函数,释放内存,还没有找到

pj_pool_release(pool);                     //把内存交给系统

你可能感兴趣的:(PJLIB代码研读(一))