Ryan Bloom wrote:

On Saturday 08 September 2001 15:25, Brian Pane wrote:

Ryan Bloom wrote:

The latter.  Having two API's to the same functions should only be done
as a stop-gap.

I disagree.  It's inevitable to have two APIs, as long as we have two
'table' types with very different semantics.

apr_table_t is statically typed (uses char*), and apr_hash_t isn't (uses
void*).
If we did a direct replacement of apr_table_t with apr_hash_t in the
httpd, we'd be sacrificing static type-safety for a lot of code.

So create a simple set of prototypes and macros for a char * version of
the hash code, the same way we did for ap_strchr and ap_strchr_c.  If you
do that, you will be adding probably two or three new functions to APR.\

Yes, macro wrappers would work.  But if we use that approach, it would
be advantageous to use macro names like "apr_table_get" so that all
the existing httpd code and 3rd party modules can be used without
modification.
This would be functionally equivalent to the "implement apr_table_t using
apr_hash_t" approach that I prefer.


That would make tables a hash again, which is what I disagree with. Yes, creating a new API will require module authors to modify their code to take advantage of the hash table performance. But, it keeps the table API refering to tables, instead of hashes. This will also require more modifications to httpd, but in the end, it keeps the code easier to read and understand.

To me, a table, even if implemented using apr_hash_t, is different from
an apr_hash_t.  The apr_table_t, as it's been used in the httpd, isn't a
general-purpose set-of-strings.  Rather, it's a set-of-strings-with-special-
support-for-concatenation-and-merging-that-works-well-for-http-headers.
Operations that are essential on tables, like apr_table_merge() and the
corresponding support in apr_table_overlap(), don't make sense for the
general-purpose, type-neutral apr_hash_t.

I'm also opposed to having a declaration like:
apr_hash_t *headers_in;
apr_hash_t *headers_out;
in the request_rec. Architecturally, those objects need to be unordered sets with
fast access and the aforementioned merge support. They don't need to be hash tables
specifically. The implementation could just as well be a balanced tree; all the code
in the httpd that uses the httpd shouldn't know or care about how the "unordered set"
object is implemented.


--Brian




Reply via email to