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);                     //把内存交给系统

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值