pjlib中的list用法,节点采用pj内存池动态创建

来源:互联网 发布:丽都时时彩源码 编辑:程序博客网 时间:2024/06/07 14:45
#include <pjlib.h>  
#include <pj/types.h>


struct my_node
{
    //此行必须声明在struct的首行(声明了链表的next,prev指针)
    PJ_DECL_LIST_MEMBER(struct my_node);
    //下面为my_node的真正内容
    pj_str_t value;
};


int param_log_decor = PJ_LOG_HAS_NEWLINE | PJ_LOG_HAS_TIME |PJ_LOG_HAS_MICRO_SEC;


/*
*list用法,节点采用pj内存池动态创建
*/
int main()
{
    pj_status_t rc;
    pj_caching_pool cp;
    pj_pool_t * pool;


    struct my_node list;
    struct my_node *it,*it1;
    int i;
    
    //初始化pjlib,必须!
    rc = pj_init();


    //设置log级别
    pj_log_set_level(5);
    pj_log_set_decor(param_log_decor);


    //创建pool factory,必须!后续内存分配、动态创建,需要
    pj_caching_pool_init(&cp,&pj_pool_factory_default_policy,0);
    //创建内存池,池名称test
    pool=pj_pool_create(&cp.factory,"test",4000,4000,NULL);


    //初始化空的list
    pj_list_init(&list);
    
    //创建10个节点
    for (i=0; i<10; ++i) {
        //内存池动态分配50个字符
        char * buf = pj_pool_alloc(pool, 50);
        memset(buf,0,sizeof(buf));
        sprintf(buf,"Hello %d",i);
        //PJ_LOG(3, ("list1", "buf:%s", buf));
        //内存池动态分配my_node
        struct my_node *newNode=pj_pool_alloc(pool,sizeof(struct my_node));
        newNode->value =pj_str("");
        pj_cstr(&newNode->value,buf);  
        PJ_LOG(3, ("list1", "set value:%.*s",newNode->value.slen,newNode->value.ptr));
        pj_list_insert_before(&list, newNode);
    }
    
    //显示list的各节点内容
    it = list.next;
    while (it != &list) {
        PJ_LOG(3, ("list1", "value = %.*s", it->value.slen, it->value.ptr));
        it = it->next;
    }


    //删除所有节点
    it = list.next;
    while (it != &list) {
        it1=it->next;       //先保存下个节点地址
        pj_list_erase(it);  //删除当前节点
        it=it1;             //指向下个节点
    }
    //list应该为空了
    pj_assert( pj_list_empty(&list) );
    
    //释放内存池
    pj_pool_release( pool );
    pj_caching_pool_destroy( &cp );
    pj_shutdown();


    return 0;
};
0 0