Chinaunix首页 | 论坛 | 博客
  • 博客访问: 81339
  • 博文数量: 31
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 380
  • 用 户 组: 普通用户
  • 注册时间: 2014-02-24 22:04
文章分类

全部博文(31)

文章存档

2014年(31)

我的朋友

分类: C/C++

2014-07-24 09:17:18


iniLoadFromFile    
    |-----
iniInitContext

    |            |-----hash_init_ex
    |                    |-----_has_alloc_buckets
    |-----iniDoLoadFormFile
    |       |-----get_url_content
    |       |-----getFileContent
    |       |-----iniDoLoadItemsFromBuffer
    |               |-----iniDoloadFromFile
    |               |-----hash_find
    |                       |-----_chain_find_entry
    |               |-----hash_insert
    |                       |-----hash_insert_ex
    |-----iniSortItems
    |        |-----hash_walk


点击(此处)折叠或打开

  1. static void iniSortItems(IniContext *pContext)//对所有的items按照name进行排序
  2. {
  3.     if (pContext->global.count > 1)
  4.     {
  5.         qsort(pContext->global.items, pContext->global.count, \
  6.             sizeof(IniItem), iniCompareByItemName);//对global section中的item进行按照名字排序
  7.     }

  8.     hash_walk(&pContext->sections, iniSortHashData, NULL);//遍历hash中的所有的hashdata
  9. }
iniSortItems函数所做的事情包括,对global section中的item按照name进行排序,对hash表中的hashdata中的section中的item按照name进行排序

点击(此处)折叠或打开

  1. //对hash表中的每个元素调用函数指针walkFunc
  2. int hash_walk(HashArray *pHash, HashWalkFunc walkFunc, void *args)
  3. {
  4.     HashData **ppBucket;
  5.     HashData **bucket_end;
  6.     HashData *hash_data;
  7.     int index;
  8.     int result;

  9.     index = 0;
  10.     bucket_end = pHash->buckets + (*pHash->capacity);//获取指针数组最后一个元素
  11.     for (ppBucket=pHash->buckets; ppBucket<bucket_end; ppBucket++)
  12.     {
  13.         hash_data = *ppBucket;
  14.         while (hash_data != NULL)
  15.         {
  16.             result = walkFunc(index, hash_data, args);//调用函数指针,这里的walkFunc执行的函数是iniSortHashData
  17.             if (result != 0)
  18.             {
  19.                 return result;
  20.             }

  21.             index++;
  22.             hash_data = hash_data->next;
  23.         }
  24.     }

  25.     return 0;
  26. }

点击(此处)折叠或打开

  1. //对hashdata中的数据进行排序,按照item中的name从小到大,index与args并未使用
  2. static int iniSortHashData(const int index, const HashData *data, void *args)
  3. {
  4.     IniSection *pSection;

  5.     pSection = (IniSection *)data->value;//获取data中的section
  6.     if (pSection->count > 1)
  7.     {
  8.         qsort(pSection->items, pSection->count, \
  9.             sizeof(IniItem), iniCompareByItemName);
  10.     }

  11.     return 0;
  12. }

最后,释放pContext结构的空间

点击(此处)折叠或打开

  1. //释放pContext的空间
  2. void iniFreeContext(IniContext *pContext)
  3. {
  4.     if (pContext == NULL)//首先判空
  5.     {
  6.         return;
  7.     }

  8.     if (pContext->global.items != NULL)//如果global item不为空
  9.     {
  10.         free(pContext->global.items); //释放item空间
  11.         memset(&pContext->global, 0, sizeof(IniSection)); //把global全部置0
  12.     }

  13.     hash_walk(&pContext->sections, iniFreeHashData, NULL);//遍历hash表,对每个hashdata执行iniFreeHashData函数
  14.     hash_destroy(&pContext->sections);//释放hash表空间
  15. }
hash_walk在上面进行说明解释,hash_walk遍历所有的hashdata,对每个hashdata执行iniFreeHashData函数

点击(此处)折叠或打开

  1. //释放hashdata中的section的空间
  2. static int iniFreeHashData(const int index, const HashData *data, void *args)
  3. {
  4.     IniSection *pSection;

  5.     pSection = (IniSection *)data->value;//获取section
  6.     if (pSection == NULL)
  7.     {
  8.         return 0;
  9.     }

  10.     if (pSection->items != NULL)
  11.     {
  12.         free(pSection->items);//释放items
  13.         memset(pSection, 0, sizeof(IniSection));
  14.     }

  15.     free(pSection);//释放section
  16.     ((HashData *)data)->value = NULL;
  17.     return 0;
  18. }

iniFreeHashData函数释放hashdata中的value的空间,包括value中的items的空间,但是并不释放该hashdata的空间

点击(此处)折叠或打开

  1. //释放hash表空间
  2. void hash_destroy(HashArray *pHash)
  3. {
  4.     HashData **ppBucket;
  5.     HashData **bucket_end;
  6.     HashData *pNode;
  7.     HashData *pDelete;

  8.     if (pHash == NULL || pHash->buckets == NULL)
  9.     {
  10.         return;
  11.     }

  12.     bucket_end = pHash->buckets + (*pHash->capacity);
  13.     for (ppBucket=pHash->buckets; ppBucket<bucket_end; ppBucket++)
  14.     {
  15.         pNode = *ppBucket;
  16.         while (pNode != NULL)//依次释放所有的hashdata
  17.         {
  18.             pDelete = pNode;//保留需要删除的节点
  19.             pNode = pNode->next;//指向下一个节点
  20.             free(pDelete);
  21.         }
  22.     }

  23.     free(pHash->buckets);//释放指针数组
  24.     pHash->buckets = NULL;
  25.     if (pHash->is_malloc_capacity)//如果capacity也是分配的空间,这里也释放空间
  26.     {
  27.         free(pHash->capacity);
  28.         pHash->capacity = NULL;
  29.         pHash->is_malloc_capacity = false;
  30.     }

  31.     pHash->item_count = 0;
  32.     pHash->bytes_used = 0;
  33. }

hash_destroy函数释放hash表中的每个hashdata的空间,并释放hash的指针数组buckets的空间,如果capacity也是分配的,同时也需要释放capacity的空间

至此,tracker从配置文件中读取数据,并保存到pContext结构中了,在tracker_load_from_conf_file后的步骤是从pContext结构中读取数据,并初始化全局变量。这不完成以后,下一步的操作是从状态文件中读取group与server的状态信息,并初始化到相应全局变量中。


阅读(442) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~