geoff 2004/08/03 09:25:21
Modified: . Changes src/modules/perl modperl_apache_compat.c modperl_apache_compat.h Log: removed support for httpd 2.0.46. httpd 2.0.47 is now the minimum supported version Revision Changes Path 1.427 +3 -0 modperl-2.0/Changes Index: Changes =================================================================== RCS file: /home/cvs/modperl-2.0/Changes,v retrieving revision 1.426 retrieving revision 1.427 diff -u -r1.426 -r1.427 --- Changes 2 Aug 2004 18:02:27 -0000 1.426 +++ Changes 3 Aug 2004 16:25:20 -0000 1.427 @@ -12,6 +12,9 @@ =item 1.99_15-dev +removed support for httpd 2.0.46. httpd 2.0.47 is now the minimum +supported version. [Geoffrey Young] + Static builds for httpd >= 2.0.51 available. With the new MP_AP_BUILD option, configure and compile an httpd with mod_perl statically linked in [Gozer] 1.6 +6 -227 modperl-2.0/src/modules/perl/modperl_apache_compat.c Index: modperl_apache_compat.c =================================================================== RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_apache_compat.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- modperl_apache_compat.c 4 Mar 2004 06:01:06 -0000 1.5 +++ modperl_apache_compat.c 3 Aug 2004 16:25:21 -0000 1.6 @@ -19,231 +19,10 @@ * BACK_COMPAT_MARKER: make back compat issues easy to find :) */ -/* pre-APR_0_9_5 (APACHE_2_0_47) - * both 2.0.46 and 2.0.47 shipped with 0.9.4 - - * we need the one that shipped with 2.0.47, - which is major mmn 20020903, minor mmn 4 */ -#if ! AP_MODULE_MAGIC_AT_LEAST(20020903,4) - -/* added in APACHE_2_0_47/APR_0_9_4 - duplicated here for 2.0.46. - * I'd rather not duplicate it, but we use apr_table_compress - * in the directive merge routines, so it's either duplicate it - * here, recode the compress logic there, or drop 2.0.46 support +/* use the following format: + * #if ! AP_MODULE_MAGIC_AT_LEAST(20020903,4) + * [compat code] + * #endif + * and don't forget to insert comments explaining exactly + * which httpd release allows us to remove the compat code */ - -#define TABLE_HASH_SIZE 32 - -struct apr_table_t { - apr_array_header_t a; -#ifdef MAKE_TABLE_PROFILE - /** Who created the array. */ - void *creator; -#endif - apr_uint32_t index_initialized; - int index_first[TABLE_HASH_SIZE]; - int index_last[TABLE_HASH_SIZE]; -}; - -static apr_table_entry_t **table_mergesort(apr_pool_t *pool, - apr_table_entry_t **values, int n) -{ - /* Bottom-up mergesort, based on design in Sedgewick's "Algorithms - * in C," chapter 8 - */ - apr_table_entry_t **values_tmp = - (apr_table_entry_t **)apr_palloc(pool, n * sizeof(apr_table_entry_t*)); - int i; - int blocksize; - - /* First pass: sort pairs of elements (blocksize=1) */ - for (i = 0; i + 1 < n; i += 2) { - if (strcasecmp(values[i]->key, values[i + 1]->key) > 0) { - apr_table_entry_t *swap = values[i]; - values[i] = values[i + 1]; - values[i + 1] = swap; - } - } - - /* Merge successively larger blocks */ - blocksize = 2; - while (blocksize < n) { - apr_table_entry_t **dst = values_tmp; - int next_start; - apr_table_entry_t **swap; - - /* Merge consecutive pairs blocks of the next blocksize. - * Within a block, elements are in sorted order due to - * the previous iteration. - */ - for (next_start = 0; next_start + blocksize < n; - next_start += (blocksize + blocksize)) { - - int block1_start = next_start; - int block2_start = block1_start + blocksize; - int block1_end = block2_start; - int block2_end = block2_start + blocksize; - if (block2_end > n) { - /* The last block may be smaller than blocksize */ - block2_end = n; - } - for (;;) { - - /* Merge the next two blocks: - * Pick the smaller of the next element from - * block 1 and the next element from block 2. - * Once either of the blocks is emptied, copy - * over all the remaining elements from the - * other block - */ - if (block1_start == block1_end) { - for (; block2_start < block2_end; block2_start++) { - *dst++ = values[block2_start]; - } - break; - } - else if (block2_start == block2_end) { - for (; block1_start < block1_end; block1_start++) { - *dst++ = values[block1_start]; - } - break; - } - if (strcasecmp(values[block1_start]->key, - values[block2_start]->key) > 0) { - *dst++ = values[block2_start++]; - } - else { - *dst++ = values[block1_start++]; - } - } - } - - /* If n is not a multiple of 2*blocksize, some elements - * will be left over at the end of the array. - */ - for (i = dst - values_tmp; i < n; i++) { - values_tmp[i] = values[i]; - } - - /* The output array of this pass becomes the input - * array of the next pass, and vice versa - */ - swap = values_tmp; - values_tmp = values; - values = swap; - - blocksize += blocksize; - } - - return values; -} -void apr_table_compress(apr_table_t *t, unsigned flags) -{ - apr_table_entry_t **sort_array; - apr_table_entry_t **sort_next; - apr_table_entry_t **sort_end; - apr_table_entry_t *table_next; - apr_table_entry_t **last; - int i; - int dups_found; - - if (t->a.nelts <= 1) { - return; - } - - /* Copy pointers to all the table elements into an - * array and sort to allow for easy detection of - * duplicate keys - */ - sort_array = (apr_table_entry_t **) - apr_palloc(t->a.pool, t->a.nelts * sizeof(apr_table_entry_t*)); - sort_next = sort_array; - table_next = (apr_table_entry_t *)t->a.elts; - i = t->a.nelts; - do { - *sort_next++ = table_next++; - } while (--i); - - /* Note: the merge is done with mergesort instead of quicksort - * because mergesort is a stable sort and runs in n*log(n) - * time regardless of its inputs (quicksort is quadratic in - * the worst case) - */ - sort_array = table_mergesort(t->a.pool, sort_array, t->a.nelts); - - /* Process any duplicate keys */ - dups_found = 0; - sort_next = sort_array; - sort_end = sort_array + t->a.nelts; - last = sort_next++; - while (sort_next < sort_end) { - if (((*sort_next)->key_checksum == (*last)->key_checksum) && - !strcasecmp((*sort_next)->key, (*last)->key)) { - apr_table_entry_t **dup_last = sort_next + 1; - dups_found = 1; - while ((dup_last < sort_end) && - ((*dup_last)->key_checksum == (*last)->key_checksum) && - !strcasecmp((*dup_last)->key, (*last)->key)) { - dup_last++; - } - dup_last--; /* Elements from last through dup_last, inclusive, - * all have the same key - */ - if (flags == APR_OVERLAP_TABLES_MERGE) { - apr_size_t len = 0; - apr_table_entry_t **next = last; - char *new_val; - char *val_dst; - do { - len += strlen((*next)->val); - len += 2; /* for ", " or trailing null */ - } while (++next <= dup_last); - new_val = (char *)apr_palloc(t->a.pool, len); - val_dst = new_val; - next = last; - for (;;) { - strcpy(val_dst, (*next)->val); - val_dst += strlen((*next)->val); - next++; - if (next > dup_last) { - *val_dst = 0; - break; - } - else { - *val_dst++ = ','; - *val_dst++ = ' '; - } - } - (*last)->val = new_val; - } - else { /* overwrite */ - (*last)->val = (*dup_last)->val; - } - do { - (*sort_next)->key = NULL; - } while (++sort_next <= dup_last); - } - else { - last = sort_next++; - } - } - - /* Shift elements to the left to fill holes left by removing duplicates */ - if (dups_found) { - apr_table_entry_t *src = (apr_table_entry_t *)t->a.elts; - apr_table_entry_t *dst = (apr_table_entry_t *)t->a.elts; - apr_table_entry_t *last_elt = src + t->a.nelts; - do { - if (src->key) { - *dst++ = *src; - } - } while (++src < last_elt); - t->a.nelts -= (last_elt - dst); - } - - /* XXX mod_perl: remove to avoid more code duplication. - * XXX makes us slower on 2.0.46 - */ - /* table_reindex(t); */ -} - -#endif /* pre-APR_0_9_5 (APACHE_2_0_47) */ 1.5 +8 -19 modperl-2.0/src/modules/perl/modperl_apache_compat.h Index: modperl_apache_compat.h =================================================================== RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_apache_compat.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- modperl_apache_compat.h 4 Mar 2004 06:01:06 -0000 1.4 +++ modperl_apache_compat.h 3 Aug 2004 16:25:21 -0000 1.5 @@ -23,27 +23,16 @@ typedef void * apr_thread_mutex_t; #endif -/* XXX: these backcompat macros can be deleted when we bump up the - * minimal supported httpd version to 2.0.47 or higher +/* back compat adjustements for older Apache versions * BACK_COMPAT_MARKER: make back compat issues easy to find :) */ -/* pre-APR_0_9_5 (APACHE_2_0_47) - * both 2.0.46 and 2.0.47 shipped with 0.9.4 - - * we need the one that shipped with 2.0.47, - which is major mmn 20020903, minor mmn 4 */ -#if ! AP_MODULE_MAGIC_AT_LEAST(20020903,4) - -/* added in APACHE_2_0_47/APR_0_9_4 */ -void apr_table_compress(apr_table_t *t, unsigned flags); - -#endif /* pre-APR_0_9_5 (APACHE_2_0_47) */ - -#define modperl_apr_func_not_implemented(func, httpd_ver, apr_ver) \ - { \ - dTHX; \ - Perl_croak(aTHX_ #func "() requires httpd/" #httpd_ver \ - " and apr/" #apr_ver " or higher"); \ - } +/* use the following format: + * #if ! AP_MODULE_MAGIC_AT_LEAST(20020903,4) + * [compat code] + * #endif + * and don't forget to insert comments explaining exactly + * which httpd release allows us to remove the compat code + */ #endif /* MODPERL_APACHE_COMPAT_H */