APR 池
来自:APACHE模块开发指南
APR池为资源管理提供了一个可选的模型。和垃圾回收类似,APR池将程序员从各种可能的情况下进行清理操作的复杂性中解放出来。
池最基本的应用就是内存管理。
可采用如下方式:
myType *myvar = apr_palloc(pool, sizeof (myType));
不管在此期间发生了什么,池将自动地负责释放这个资源(在请求介绍时)。
APR提供了用来进行内存管理内建的函数,以及一些其他的基本资源,程序员也可不使用这些APR内建的函数和资源。
如:
myType *myvar = malloc(sizeof(myType));
apr_pool_cleanup_register(pool, myvar, free, apr_pool_cleanup_null);
如果集成c++的析构函数做资源释放,APR提供下面的方法:
假设我们定义了一个类:
class myclass{
public:
virtual ~myclass() { /* do cleanup */ }
};
我们定义一个C的封装,用于delete
void myclassCleanup(void *ptr) {delete (myclass*)ptr;}
然后我们在分配myclass时通过池注册这个封装:
myclass *myobj = new myclass();
apr_pool_cleanup_register(pool, (void *)myobj, myclassCeanup, apr_pool_cleanup_null);
则当请求介绍时,清理池时会调用封装函数。
隐士和显示地清除
class poolclass{
private:
apr_pool_t *pool;
public:
poolclasss(apr_pool_t* p) : poll(p){
apr_pool_cleanup_register(pool, (void *)this, myclassCleanup, apr_pool_cleanup_null);
};
virtual ~poolclass(){
apr_pool_cleanup_kill(pool, (void *)this, myclassCleanup);
};
}
如果你使用C++开发Apache,你可以从poolclass类继承。大部分的APR函数做的和这个一样,随时在资源被分配或者清除时进行注册和清理操作。
生命周期
请求池(request pool),生命周期为HTTP请求的生命周期
进程池(process pool),生命周期为一个服务进程的生命周期
连接池(connection pool),生命周期为一个TCP连接的生命周期