设为首页 加入收藏

TOP

nginx 学习八 高级数据结构之基数树ngx_radix_tree_t(三)
2015-07-20 17:34:29 来源: 作者: 【 】 浏览:4
Tags:nginx 学习 高级 数据结构 基数 ngx_radix_tree_t
pagesize); if (tree->start == NULL) { return NULL; } tree->size = ngx_pagesize;//修改空闲内存大小 } //分配一个节点的空间 p = tree->start; tree->start += sizeof(ngx_radix_node_t); tree->size -= sizeof(ngx_radix_node_t); return p; } 3测试例子

下面是一个测试ngx_radix_tree_t的例子,在写完这个测试列子运行的时候,出现“核心错误(存储已转移)”,先按老办法调试--直接打印定位错误代码范围,找过了错误是在这个函数里面:ngx_radix32tree_create,尼码,源代码有错误,蒙了,不知到怎么调试下去,因为以前没在linux跟踪代码执行,没法了,直接搜资料学gdb调试程序,单步跟踪调试了整整一个晚上,发现在下面这句代码中出错:

tree->start = ngx_pmemalign(tree->pool, ngx_pagesize, ngx_pagesize);
gdb p ngx_pagesize 竟然是0,晕了很久找到这个ngx_pagesize的定义,是个全局变量没有初始化。

谁能知道系统中的全局变量在哪里用,在哪里初始化?

http://blog.csdn.net/xiaoliangsky/article/details/39695591

测试代码:

/********************************************************
author: smtl
date: 2014-10-01--4:50
*********************************************************/
#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #include 
      
        #include 
       
         #include 
        
          //////////////////////////////////////////////////////////////////////////////////// //不加下面这两个定义编译会出错 volatile ngx_cycle_t *ngx_cycle; void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err, const char *fmt, ...) { } //////////////////////////////////////////////////////////////////////////////////// //先序遍历radix_tree void travel_radix_tree(ngx_radix_node_t *root); int main() { /*基数树节点的数据集:ngx_int_t类型,只是测试,实际上可以为任何类型*/ ngx_int_t data[64]; ngx_int_t i = 0; for (i = 0; i < 64; ++i) { data[i] = rand()%10000; } /*创建内存池对象*/ ngx_pool_t* pool = ngx_create_pool(1024, NULL); if (pool == NULL) { printf("create pool failed!\n"); exit(1); } //printf("xxxxx\n"); //////////////////////////////////////////////////////////////////////////////// //一定要初始化ngx_pagesize这个全局变量,调试了一个晚上 //不初始化,会出现段错误(核心已转储),这也是全局变量的潜在危害: //你不知道你的程序中是否用到这个全局变量,如果用到,这个全局变量初始化了没有 //在一些大的程序中,你根本无法快速知道这些,所以应尽量避免使用全局变量 ngx_pagesize = getpagesize(); printf("pagesize = %d\n", ngx_pagesize); //////////////////////////////////////////////////////////////////////////////// /*创建基数树,prealloc=0时,只创建结构体ngx_radix_tree_t,没有创建任何基数树节点*/ ngx_radix_tree_t *tree = ngx_radix_tree_create(pool, -1); //printf("xxxxxY\n"); if (tree == NULL) { printf("crate radix tree failed!\n"); exit(1); } /*插入data*/ ngx_uint_t deep = 5;//树的最大深度为4 ngx_uint_t mask = 0; ngx_uint_t inc = 0x80000000; ngx_uint_t key = 0; ngx_uint_t cunt = 0;//data数组的索引 while (deep--) { key = 0; mask >>= 1; mask |= 0x80000000; do { if (NGX_OK != ngx_radix32tree_insert(tree, key, mask, &data[cunt])) { printf("insert error\n"); exit(1); } key += inc; ++cunt; if (cunt > 63) { cunt = 63; } }while(key); inc >>= 1; } /*先序打印数据*/ travel_radix_tree(tree->root); printf("\n"); /*查找测试*/ ngx_uint_t tkey = 0x58000000; ngx_int_t* value = ngx_radix32tree_find(tree, 0x58000000); if (value != NGX_RADIX_NO_VALUE) { printf("find the value: %d with the key = %x\n", *value, tkey); } else { printf("not find the the value with the key = %x\n", tkey); } /*删除测试*/ if (NGX_OK == ngx_radix32tree_delete(tree, tkey, mask)) { printf("delete the the value with the key = %x is succeed\n", tkey); } else { printf("delete the the value with the key = %x is failed\n", tkey); } value = ngx_radix32tree_find(tree, 0x58000000); if (value != NGX_RADIX_NO_VALUE) { printf("find the value: %d with the key = %x\n", *value, tkey); } else { printf("not find the the value with the key = %x\n", tkey); } return 0; } void travel_radix_tree(ngx_radix_node_t *root) { if (root->left != NULL) { travel_radix_tree(root->left); } if (root->value != NGX_RADIX_NO_VALUE) { ngx_int_t* value = root->value; printf("%d\n", *value); } if (root->right != NULL) { travel_radix_tree(root->right); } }
        
       
      
     
    
   
  


work hard!


http://blog.csdn.net/xiaoliangsky/article/details/39695591

首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇双向队列(STL做法) 下一篇Codeforces Round #270 A~D

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·PostgreSQL 索引 - (2025-12-25 22:20:43)
·MySQL Node.js 连接 (2025-12-25 22:20:41)
·SQL 撤销索引、表以 (2025-12-25 22:20:38)
·Linux系统简介 (2025-12-25 21:55:25)
·Linux安装MySQL过程 (2025-12-25 21:55:22)