可选函数由Apache核心统一维护。与可选挂钩类似,Apache核心维护了一个全局的哈希表s_phOptionalFunctions,该哈希表的键为可选函数的名称,而值则是对应的函数指针。为了便于Apache使用,我们必须在s_phOptionalFunctions中登记可选函数。函数的注册通过APR_REGISTER_OPTIONAL_FN进行,APR_REGISTER_OPTIONAL_FN定义如下:
#define APR_REGISTER_OPTIONAL_FN(name) do { \
APR_OPTIONAL_FN_TYPE(name) *apu__opt = name; \
apr_dynamic_fn_register(#name,(apr_opt_fn_t *)apu__opt); \
} while(0)
该宏内部实际调用了函数apr_dynamic_fn_register进行实际的注册。事实上,Apache中提供了相关函数来支持对s_phOptionalFunctions的操作,除了apr_dynamic_fn_register之外,还包括apr_register_optional_fn、apr_dynamic_fn_retrieve、apr_retrieve_optional_fn。不过其中apr_retrieve_optional_fn和apr_register_optional_fn在Apache2.0中已经被废弃,因此不再多说。
apr_dynamic_fn_register的原型如下:
APU_DECLARE_NONSTD(void) apr_dynamic_fn_register(const char *szName,
apr_opt_fn_t *pfn)
参数szName是可选函数的名称,pfn则是实际可选函数的指针。如果s_phOptionalFunctions哈希表存在,函数只是简单的调用apr_hash_set将记录插入表中。
apr_dynamic_fn_retrieve函数原型为
APU_DECLARE(apr_opt_fn_t *) apr_dynamic_fn_retrieve(const char *szName)
该函数根据给定的函数名称获取实际的函数指针。
事实上,这两个函数都不允许直接调用,它们作为Apache的内部函数而存在,对外提供的则是宏APR_REGISTER_OPTIONAL_FN和APR_RETRIEVE_OPTIONAL_FN。
对于optional_fun可选函数,注册语句如下:
APR_REGISTER_OPTIONAL_FN(optional_fun);
当用户想使用可选函数的时候,首先必须获得其函数指针,用法如下:
APR_OPTIONAL_FN_TYPE(some_fn) *pfn;