dgaudet 98/01/30 16:24:33
Modified: src CHANGES src/main alloc.c Log: People are challenging me to write something in assembly... well gcc is so nice that I don't have to do this one in assembly. MAKE_TABLE_PROFILE is a debugging mode that makes it easier to find tables which are created with too small an initial guess. It uses __builtin_return_address() which is a gcc directive that avoids the need for arch specific assembly to find the return address of the function you're in... super ultra cool for debugging. Revision Changes Path 1.608 +6 -0 apache-1.3/src/CHANGES Index: CHANGES =================================================================== RCS file: /export/home/cvs/apache-1.3/src/CHANGES,v retrieving revision 1.607 retrieving revision 1.608 diff -u -r1.607 -r1.608 --- CHANGES 1998/01/30 19:30:31 1.607 +++ CHANGES 1998/01/31 00:24:29 1.608 @@ -1,5 +1,11 @@ Changes with Apache 1.3b4 + *) Tweaked the headers_out table size, and the subprocess_env + table size guess in rename_original_environment(). Added + MAKE_TABLE_PROFILE which can help discover make_table() + calls that use too small an initial guess, see alloc.c. + [Dean Gaudet] + *) Options and AllowOverrides weren't properly merging in the main server setting inside vhosts (only an issue when you have no <Directory> or other section containing an Options that affects 1.73 +37 -7 apache-1.3/src/main/alloc.c Index: alloc.c =================================================================== RCS file: /export/home/cvs/apache-1.3/src/main/alloc.c,v retrieving revision 1.72 retrieving revision 1.73 diff -u -r1.72 -r1.73 --- alloc.c 1998/01/27 10:04:35 1.72 +++ alloc.c 1998/01/31 00:24:32 1.73 @@ -97,6 +97,17 @@ */ /* #define POOL_DEBUG */ +/* Provide diagnostic information about make_table() calls which are + * possibly too small. This requires a recent gcc which supports + * __builtin_return_address(). The error_log output will be a + * message such as: + * table_push: table created by 0x804d874 hit limit of 10 + * Use "l *0x804d874" to find the source that corresponds to. It + * indicates that a table allocated by a call at that address has + * possibly too small an initial table size guess. + */ +/* #define MAKE_TABLE_PROFILE */ + #ifdef POOL_DEBUG #ifdef ALLOC_USE_MALLOC # error "sorry, no support for ALLOC_USE_MALLOC and POOL_DEBUG at the same time" @@ -113,7 +124,6 @@ #define BLOCK_MINALLOC 0 #endif - /***************************************************************** * * Managing free storage blocks... @@ -890,14 +900,34 @@ * cases they do this for. */ array_header a; +#ifdef MAKE_TABLE_PROFILE + void *creator; +#endif }; +#ifdef MAKE_TABLE_PROFILE +static table_entry *table_push(table *t) +{ + if (t->a.nelts == t->a.nalloc) { + fprintf(stderr, + "table_push: table created by %p hit limit of %u\n", + t->creator, t->a.nalloc); + } + return (table_entry *) push_array(&t->a); +} +#else +#define table_push(t) ((table_entry *) push_array(&(t)->a)) +#endif + API_EXPORT(table *) make_table(pool *p, int nelts) { table *t = palloc(p, sizeof(table)); make_array_core(&t->a, p, nelts, sizeof(table_entry)); +#ifdef MAKE_TABLE_PROFILE + t->creator = __builtin_return_address(0); +#endif return t; } @@ -967,7 +997,7 @@ } if (!done) { - elts = (table_entry *) push_array(&t->a); + elts = (table_entry *) table_push(t); elts->key = pstrdup(t->a.pool, key); elts->val = pstrdup(t->a.pool, val); } @@ -1013,7 +1043,7 @@ } if (!done) { - elts = (table_entry *) push_array(&t->a); + elts = (table_entry *) table_push(t); elts->key = key; elts->val = val; } @@ -1055,7 +1085,7 @@ return; } - elts = (table_entry *) push_array(&t->a); + elts = (table_entry *) table_push(t); elts->key = pstrdup(t->a.pool, key); elts->val = pstrdup(t->a.pool, val); } @@ -1085,7 +1115,7 @@ } } - elts = (table_entry *) push_array(&t->a); + elts = (table_entry *) table_push(t); elts->key = key; elts->val = val; } @@ -1094,7 +1124,7 @@ { table_entry *elts = (table_entry *) t->a.elts; - elts = (table_entry *) push_array(&t->a); + elts = (table_entry *) table_push(t); elts->key = pstrdup(t->a.pool, key); elts->val = pstrdup(t->a.pool, val); } @@ -1116,7 +1146,7 @@ } #endif - elts = (table_entry *) push_array(&t->a); + elts = (table_entry *) table_push(t); elts->key = key; elts->val = val; }