`
liuzhaomin
  • 浏览: 204251 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论
文章列表
5.5.5 挂钩函数(APR_IMPLEMENT_EXTERNAL_HOOK_BASE) 从宏的名字我们就可以大体看出该宏实际上是实现了具体的挂钩注册函数,如果将其展开后我们会更加一目了然。该宏的定义也是冗长的很,如下所示: #define APR_IMPLEMENT_EXTERNAL_HOOK_BASE(ns,link,name) \ link##_DECLARE(void) ns##_hook_##name(ns##_HOOK_##name##_t *pf, \ const char * const *aszPre, const char * const *aszSucc,int n ...
5.5 挂钩(HOOK) 5.5.1 为什么引入挂钩 在Apache1.3版本中,对HTTP请求的处理包括若干个固定阶段,比如地址转换阶段、身份确认阶段、身份认证阶段、权限确认阶段、MIME类型识别阶段等等,这也意味着Apache1.3中的挂钩数目是有限的,固定的。这个反映在模块结构中就是针对每个HOOK都对应一个函数指针。比如如果需要检查用户的身份是否合法则只需要调用ap_check_user_i;如果需要核查用户的权限是否满足则只需要调用auth_checker;而如果需要记录日志,则只需要调用logger函数即可。这种对请求的处理策略非常清晰明了。不过这种方法也有明显的局限性,首先就是 ...
4.4 打开文件 文件打开应该是使用的最多的文件操作了,任何文件在使用之前都必须首先打开。ANSI C标准库和Unix系统库函数都提供对“打开文件”这个操作语义的支持。他们提供的接口很相似,参数一般都为“文件名+打开标志位+权限标志位”,Apache中提供了apr_file_open函数来支持文件打开操作,该函数只是在原有的标准库的基础上进行了少许的封装。apr_file_open无法忽略习惯的巨大力量,它提供了与ANSI C以及Unix系统库函数类似的接口如下: APR_DECLARE(apr_status_t) apr_file_open(apr_file_t **new, cons ...
4.1 文件概述 文件I/O在Unix下占据着非常重要的地位,曾有一句经典语句绝对可以说明file在Unix下的重要性, "In UNIX, everything is a file",APR就是本着这个思想对Unix文件I/O进行了再一次的抽象封装,以提供更为强大和友善的文件I/O接口。 APR File I/O源代码的位置在$(APR_HOME)/file_io目录下针对不同类型的操作系统,file_io下又进一步细分为四个目录:netware,os2,unix和win32。每个目录中又包含多个.c文件,每个.c文件对应一种文件操作,比如 open.c -- 封装了 ...
APR中的线性表,包括表格,环形链表,哈西表,队列四种,这四种都是建立在数组的基础之上。估计年前是不能发上来了,因为要过年回家了。不过年后应该很快就搞定。 论文忙的紧,没有太多时间啊!!
3.1数组 3.1.1数组概述 数组是Apache中最经常也是最普通的数据结构,尽管C语言中已经提供了一定的数组功能,但是C语言数组运用到Apache中还存在下面的一些问题: (1)、C语言中的数组在定义的时候就必须确定维数目,一旦确定,其长度就不可更改。但是Apache中很多情况并不知道数组中能够保存的最大数目,如果预定义的太大,可能会浪费过多的空间;定义的太小又可能不能满足系统要求;因此Apache中需要一种动态的具有弹性伸缩能力的数组,这样实际需要多少元素就分配多少元素; (2)、C语言中提供了另外一种数组动态伸缩的方案,即就是使用malloc分配空间,将空间看作数组进行处理。不过 ...
5.1环型链表概述 Apache中很多地方都使用到了环形链表的数据结构,比如存储段组中就是使用环形链表保存所有的存储段数据。为了能够简化对该环形链表的操作,Apache中定义了一系列的宏来方便对链表的操作。因此在继续分析存储段之间的关系之前,我们首先来看一下Apache中环形结构的实现。 Apache中环形结构的实现采用了大量的宏,其实现参考了4.4FreeBSD中队列<sys/queue.h>和Dean Gaudet的”splim/ring.h”的实现。这两个具体的实现可以http://www.freebsd.org/cgi/cvsweb/cgi/src/sys/sys ...
2.4.5内存池的销毁 由于Apache中所有的内存都来自内存池,因此当内存池被销毁的时候,所有从内存池中分配的空间都将受到直接的影响——被释放。但是不同的数据类型可能导致不同的释放结果,目前Apache中支持三种不同的数据 ...
2.4.4内存池的内存分配 从内存池中分配内存通过两个函数实现:apr_pcalloc和apr_palloc,这两个函数唯一的区别就是apr_pcalloc分配后的内存全部自动清零,而apr_palloc则省去了这一步的工作。 apr_palloc的函数原型如下所示: APR_DECLARE ...
2.4.3内存池的创建 勿庸置疑,内存池的创建是内存池的核心操作之一。内存池创建函数的原型如下所示: APR_DECLARE(apr_status_t) apr_pool_create_ex(apr_pool_t **newpool, apr_pool_t *parent, apr_abortfunc_t abort_fn, apr_allocator_t *allocator) 其中,newpool是需要创建的新的内存池,并且创建后的内存池通过该参数返回。parent则是当前创建的内存池的父亲;abort_fn指明了当创建失败的时候所调用的处理函数;allocator则是真正 ...
2.4 内存池 2.4.1内存池概述 在了解了内存分配子的概念之后,我们其实已经了解了Apache中内存分配的细节了。不过Apache中内存的层次结构关系则是由内存池负责组织,其数据结构apr_pool_t定义在apr_pools.c中,定义如下: struct apr_pool_t { apr_pool_t *parent; apr_pool_t *child; apr_pool_t *sibling; apr_pool_t **ref; //用于指向内存池本身 cleanup_t *cleanups; apr_allocator_t *allocator; struct ...
2.3.3分配子内存分配 使用分配子分配内存是最终的目的。Apache对外提供的使用分配子分配内存的函数是apr_allocator_alloc,然而实际在内部,该接口函数调用的则是allocator_alloc。 allocator_alloc函数原型声明如下: apr_memnode_t *allocator_ ...
2.3 内存池分配子allocator 2.3.1分配子概述 尽管我们可以通过malloc函数直接分配apr_memnode_t类型的结点,不过Apache中并不推荐这种做法。事实上Apache中的大部分的内存的分配都是由内存分配子allocator完成的。它隐藏了内部的实际的分配细节,对外提供了几个简单的接口供内存池函数调用。内存分配子属于内部数据结构,外部程序不能直接调用。内存分配子(以后简称为分配子)在文件apr_pools.c中进行定义如下: struct apr_allocator_t { apr_uint32_t max_index; apr_uint32_t max_fr ...
对于APR中的所有的对象中,内存池对象应该是其余对象内存分配的基础,不仅是APR中的对象,而且对于整个Apache中的大部分对象的内存都是从内存池中进行分配的,因此我们将把内存池作为整个APR的基础。 2.1 内存池概述 在C语 ...
Global site tag (gtag.js) - Google Analytics