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链表中的所有的结点归还给该内存池的分配子。