Apache内存池内幕(7)[4]

[入库:2006年2月23日] [更新:2007年3月24日]

本文简介:

        return; /* No work. Whew! */
    for (pc = procs; pc; pc = pc->next) {
        if(pc->kill_how == APR_KILL_AFTER_TIMEOUT)
               处理APR_KILL_AFTER_TIMEOUT策略;
        else if(pc->kill_how == APR_KILL_ALWAYS)
               处理APR_KILL_ALWAYS策略;
        else if(pc->kill_how == APR_KILL_NEVER)
               处理APR_KILL_NEVER策略;
        else if(pc->kill_how == APR_JUST_WAIT)
               处理APR_JUST_WAIT策略;
        else if(pc->kill_how == APR_KILL_ONLY_ONCE)
               处理APR_KILL_ONLY_ONCE策略;
    }
}
2.4.5.3 内存池释放
在了解了cleanup函数之后,我们现在来看内存池的销毁细节。Apache中对内存池的销毁是可以通过两个函数和apr_pool_clear和apr_pool_destroy进行的。我们首先来看apr_pool_clear的细节:
APR_DECLARE(void) apr_pool_clear(apr_pool_t *pool)
{
    apr_memnode_t *active;
内存池的销毁不仅包括当前内存池,而且包括当前内存池的所有的子内存池,对于兄弟内存池,apr_pool_destroy并不处理。销毁按照深度优先的原则,首先从最底层的销毁,依次往上进行。函数中通过递归调用实现深度优先的策略,代码如下:
while (pool->child)
apr_pool_destroy(pool->child);
apr_pool_destroy的细节在下面描述。对于每一个需要销毁的内存池,函数执行的操作都包括下面的几个部分:
    run_cleanups(&pool->cleanups);
    pool->cleanups = NULL;
    pool->free_cleanups = NULL;
(1)、执行run_cleanups函数遍历与内存池关联的所有的cleanup_t结构,并调用各自的cleanup函数执行清除操作。
    free_proc_chain(pool->subprocesses);
    pool->subprocesses = NULL;
    pool->user_data = NULL;
(2)、调用free_proc_chain处理使用当前内存池分配apr_proc_t结构的进程。
    active = pool->active = pool->self;
    active->first_avail = pool->self_first_avail;
 
    if (active->next == active)
        return;
 
    *active->ref = NULL;
    allocator_free(pool->allocator, active->next);
    active->next = active;
    active->ref = &active->next;
(3)、处理与当前内存池关联的active链表,主要的工作就是调用allocator_free将active链表中的所有的结点归还给该内存池的分配子。

本文关键:Apache内存池内幕(7)
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top