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开发一个线程池. 一. 使用指南 监听服 ...
随机推荐
- VUE使用QRcode或者vue-qr生成二维码
这里介绍两种vue生成二维码的方法 QRcode vue-qr vue-qr比QRcode功能多在可以在中间加logo 下面先介绍QRcode vue里安装qrcodejs的npm包 npm inst ...
- $P2121 拆地毯$
\(problem\) \(kruskal\)的模板题. #ifdef Dubug #endif #include <bits/stdc++.h> using namespace std; ...
- 【BZOJ4241】历史研究(回滚莫队)
题目: BZOJ4241 分析: 本校某些julao乱膜的时候发明了个"回滚邹队",大概意思就是某个姓邹的太菜了进不了省队回滚去文化课 回滚莫队裸题qwq(话说这个名字是不是莫队本 ...
- OI——不后悔的两年
NOI2014,悲惨的考跪,99+170+130 399 Cu滚粗.最终签到了复旦的一本,还算是有点结果吧.(其实我一开始就想读复旦我会说?)回首这两年,就像一场梦一样,从一无所知的小白到进入省队再到 ...
- Unicode ,UTF-8,assic, gbk, latin1编码 的区别
1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte). ...
- win7 硬盘安装suse双系统启动顺序更改
使用win7硬盘安装suse双系统之后,首先面临的问题是,PC默认启动的系统更改的问题,有些人可能想默认启动是win7,只有在使用linux的时候在去选择suse系统,这里我告诉大家更改的办法: 首先 ...
- 控制台——屏蔽Ctrl+C快捷键对窗体的关闭功能
导入SetCtrlHandlerHandler API //定义处理程序委托 public delegate bool ConsoleCtrlDelegate(int ctrlType); //导入S ...
- [Windows Server 2003] 安装IIS6.0及FTP
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:安装IIS6. ...
- SQL Server建库-建表-建约束
----------------------------------------SQL Server建库-建表-建约束创建School数据库------------------------------ ...
- CSS3 background-origin 属性
CSS3 background-origin 属性 padding-box 背景图像相对于内边距框来定位. border-box 背景图像相对于边框盒来定位. content-box 背景图像相对于内 ...