Justin Erenkrantz wrote: > On 10/30/06, Issac Goldstand <[EMAIL PROTECTED]> wrote: >> Looking at provider.c, a couple of questions spring to mind: >> 1) Why isn't this part of apr-util? (it seems similar to apr_optional.h >> - just intended for vtables rather than functions, and with this version >> info) > > apr_optional is an ugly hack without a good API. =)
Point still stands, though, that this might still fit there. > > The generic provider code grew out of mod_dav's provider interface. > The aaa modules also uses this same interface as well. Right, I saw those this morning when I looked at provider.c > >> 2) It seems that if trunk would want to use version "1" and fallback to >> "0", the control logic for that would need to be in >> ap_cache_get_providers and would need to check every version string >> mod_cache is interested in (for an exact string match, unless the hash >> function's doing something funky). Wouldn't it be smarter to use a >> numeric version and simply have ap_lookup_provider simply return the >> provider of the requested group/type with the highest id? > > Yes, ap_cache_get_providers() would have the logic for checking "0" > and "1" versions. Note that the APR hash abstraction that the > provider is built on top of only works with strings - not integers. > The general provider API is intended to only return specific versions > that it's asked for. > > Let me explain... > >> It would make >> custom 3rd party modules easier to write too; we could define, say 10000 >> as PROVIDER_ID_CUSTOM, making it easier to write add-ons to modules >> which use the provider interface to just write new providers with that >> ID (or that ID +1 or -1) rather than having to both write the new >> provider and also change the code which calls ap_lookup_provider to >> request the new provider version. Or did I miss the point somewhere? > > Nah, that's not the point - you use the name value of the provider for > third-party modules. The version number is fixed across all providers > (generally). > > If I implement version "0" of the cache interface say in > mod_disk_cache, then I call ap_register_provider() with version "0" > with the name "disk". In a hypothetical mod_large_disk_cache that > implements version "1" of the cache interface, I then register version > "1" with the name "thumper" (say). > > mod_cache is then taught how to handle version "0" and "1" providers. > > The user comes along with the following directive: > > CacheEnable thumper / > > mod_cache will then look up "thumper" version "1" and then "0". It'll > find version "1" of the vtable and use that for its cache. > > However, if we wanted to do so, "thumper" could also register as > "disk" version "1". So, a mod_cache that understands version "1" > would use mod_large_disk_cache instead of mod_disk_cache (which > doesn't implement version "0") if it understands version "1" > providers. > > I hope this makes it a bit clearer. -- justin It did. I think I need to digest it a bit more. I completely understand the logic of using provider names for third-party stuff, but some little voice in the back of my mind is still nagging me about the versioning logic; it's just going to be a pain to repeat the selection code for every module (eg, dav, aaa) that wants to bump a version and would be easier if the API just did it for you. Can't have everything, I guess... Regardless, many thanks for the insight! Issac