Apache模块开发指南-APR池
转:原文: http://blog.csdn.net/zmxiangde_88/article/details/8038150
-------------------------------------------------------------------------------
博文主要内容来自APR_POOL的帮助文档
APR的意思是Apache可移植运行库,是Apache portable Run-time Libraries的缩写,主要是为编写上层的应用程序提供一个跨平台使用的接口,在早期的时候,为了应用程序在多个操作系统和平台上能够运行,应用本身需要处理各种具体的细节,针对不同的平台调用不同的处理函数等等,到了今天,这些操作平台之间不同的调用以及细节处理都有一个通用的处理方式,这就是APR库。
在实际的应用程序开发过程中,经常有内存操作,在Apache模块开发时,内存的操作可以通过这个池来完成。就是在需要内存的时候,从这个池上分配,当不再需要使用任何内存时,可以将这个池释放,这样就可以释放这个池上所有的内存(那些被多次分配的,可以一次被释放了,但我们需要为内存注册一个释放内存的操作)。事实上,每个HTTP request结构都有一个apr_pool_t结构实例,后者表示内存池的管理实例,也是Apache中资源管理的核心。
一,三个基本的API
- APR_DECLARE(apr_status_t) apr_pool_create(apr_pool_t **newpool,
- apr_pool_t *parent);
- APR_DECLARE(void *) apr_palloc(apr_pool_t *p, apr_size_t size);
- APR_DECLARE(void) apr_pool_destroy(apr_pool_t *p);
上面三个API分别表示创建一个APR池,从池中分配内存,释放APR池,是一个内存池的最基本的三个操作。
二,一个例子
- #include <stdio.h>
- #include <stdlib.h>
- #include <assert.h>
- #include <apr_general.h>
- #include <apr_pools.h>
- #define MEM_ALLOC_SIZE 1024
- /**
- * memory pool sample code
- * @remark Error checks omitted
- */
- int main(int argc, const char *argv[])
- {
- apr_status_t rv;
- apr_pool_t *mp;
- char *buf1;
- char *buf2;
- /* per-process initialization */
- rv = apr_initialize();
- if (rv != APR_SUCCESS) {
- assert(0);
- return -1;
- }
- /* create a memory pool. */
- apr_pool_create(&mp, NULL);
- /* allocate memory chunks from the memory pool */
- buf1 = apr_palloc(mp, MEM_ALLOC_SIZE);
- buf2 = apr_palloc(mp, MEM_ALLOC_SIZE);
- /* destroy the memory pool. These chunks above are freed by this */
- apr_pool_destroy(mp);
- apr_terminate();
- return 0;
- }
上面例子中的,要注意的是rv=apr_initialize()和apr_terminate(),这两个方法相当于初始化APR内部数据结构和结束APR库的使用,apr_initialize()函数必须是第一个被调用的APR库函数。
三,关于apr_pool_clear函数
这个函数和apr_pool_destory函数类似,但它在调用之后,内存池仍然可以使用。
- apr_pool_t *mp;
- apr_pool_create(&mp, NULL);
- for (i = 0; i < n; ++i) {
- do_operation(..., mp);
- apr_pool_clear(mp);
- }
- apr_pool_destroy(mp);
四,apr_pool_cleanup_register
一般的从池中分配的内存之后,当内存池被释放时,这块内存也会被自动的回收,也可以调用apr_pool_cleanup_register以显式的指定一个回调函数,当指定的内存被释放时。
如:
- int *value=(int*)malloc(sizeof(int));
- apr_pool_cleanup_register(pool,value,free,apr_pool_cleanup_null);
在这个注册之后,我们不用关心内存是否被释放以及什么时候释放的。当apr_pool_destory(pool)释放内存池时,上面的value指向的内存就会被自动的释放,并且调用free来释放。
Apache模块开发指南-APR池的更多相关文章
- Apache模块开发
一.简介 Apache HTTP服务器是一个模块化的软件,使管理者可以选择核心中包含的模块以裁剪功能.可以在编译时选择被静态包含进httpd二进制映象的模块,也可以编译成独立于主httpd二进制映象的 ...
- Apache PDFbox开发指南之PDF文档读取
转载请注明来源:http://blog.csdn.net/loongshawn/article/details/51542309 相关文章: <Apache PDFbox开发指南之PDF文本内容 ...
- ECMALL模板解析机制.MVC架构分析及文件目录说明.二次开发指南手册(转)
ECMALL模板解析语法与机制 http://www.nowamagic.net/architecture/archt_TemplateSyntaxAndAnalysis.php ECMALL模块开发 ...
- 基于Asterisk的VoIP开发指南——Asterisk 模块编写指南(1)
原文:基于Asterisk的VoIP开发指南--Asterisk 模块编写指南(1) 1 开源项目概述 Asterisk是一个开源的软件包,通常运行在Linux操作系统平台上.Asterisk可以用三 ...
- C语言-apache mod(模块开发)-采用apxs开发实战(centos7.2 linux篇)
C语言-apache mod(模块开发)-采用apxs开发实战(centos7.2 linux篇) 名词解释:apxs apxs is a tool for building and installi ...
- C语言-apache mod(模块开发)-采用VS2017开发实战(windows篇)
C语言-apache mod(模块开发)-采用VS2017开发实战(windows篇) 名词解释:apxs apxs is a tool for building and installing ext ...
- 《Apache HttpClient 4.3开发指南》
转载自:http://blog.csdn.net/chszs/article/details/16854747 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chs ...
- 移动IM开发指南3:如何优化登录模块
<移动IM开发指南>系列文章将会介绍一个IM APP的方方面面,包括技术选型.登陆优化等.此外,本文作者会结合他在网易云信多年iOS IM SDK开发的经验,深度分析实际开发中的各种常见问 ...
- 开源项目SMSS开发指南(二)——基于libevent的线程池
libevent是一套轻量级的网络库,基于事件驱动开发.能够实现多线程的多路复用和注册事件响应.本文将介绍libevent的基本功能以及如何利用libevent开发一个线程池. 一. 使用指南 监听服 ...
随机推荐
- leetCode----day01---- 从排序数组中删除重复项
需求: 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. ...
- ZOJ 3666 博弈 SG函数
SG函数: 对于任意状态,定义SG(x)=mex(S),其中S是x的后继状态的SG函数值集合,mex(S)表示不再S内的最小非负整数 SG(X)=0当且仅当x为必败态. 解: 构造一个有向无环图(树) ...
- “浪潮杯”第九届山东省ACM大学生程序设计竞赛重现赛 C-Cities
题目描述:There are n cities in Byteland, and the ith city has a value ai. The cost of building a bidirec ...
- UNIX环境高级编程--7
进程环境main函数: C程序总是从main函数开始执行.main函数原型是: int main(int argc, char *argv[]); 当内核执行C程序时(使用一个exe ...
- [转]Linux命令wc的详细用法
转自:http://blog.hehehehehe.cn/a/17301.htm wc命令用来打印文件的文本行数.单词数.字节数等(print the number of newlines, word ...
- Lua相关回调总结【转】
原文 http://www.zaojiahua.com/lua-callback-functions.html 最近做一个小项目,是用Lua写的,中间用到了很多的回调,基本Cocos中的那几种常用回调 ...
- HTML 网页创建
最简单的方式就是创建一个文本文档,然后将.txt后缀改为.html或者htm. 完成上面的步骤会创建一个完全空白的网页,下面填充一点内容,代码实例如下: <!DOCTYPE html> & ...
- Android基础TOP2:单机按钮改变字体颜色
---恢复内容开始--- Activity: <TextView android:id="@+id/t1" android:textSize="30dp" ...
- MySQL数据库的三大范式定义,作用—------你所期待的最佳答案
第一范式:确保每列的原子性. 如果每列(或者每个属性)都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式. 例如:顾客表(姓名.编号.地址.……)其中"地址"列还可 ...
- html5——动画案例(大海)
太阳的发散效果主要是利用transform: scale(1.3),将物体变大 <!DOCTYPE html> <html lang="en"> <h ...