dgaudet 99/04/20 09:28:47
Modified: src/main alloc.c
Log:
ALLOC_STATS support... I don't think this hurts anything... but feel
free to remove it if someone objects.
Revision Changes Path
1.108 +51 -0 apache-1.3/src/main/alloc.c
Index: alloc.c
===================================================================
RCS file: /home/cvs/apache-1.3/src/main/alloc.c,v
retrieving revision 1.107
retrieving revision 1.108
diff -u -r1.107 -r1.108
--- alloc.c 1999/04/08 11:36:33 1.107
+++ alloc.c 1999/04/20 16:28:46 1.108
@@ -111,6 +111,11 @@
*/
/* #define MAKE_TABLE_PROFILE */
+/* Provide some statistics on the cost of allocations. It requires a
+ * bit of an understanding of how alloc.c works.
+ */
+/* #define ALLOC_STATS */
+
#ifdef POOL_DEBUG
#ifdef ALLOC_USE_MALLOC
# error "sorry, no support for ALLOC_USE_MALLOC and POOL_DEBUG at the same
time"
@@ -171,6 +176,13 @@
static union block_hdr *global_block_list;
#define FREE_POOL ((struct pool *)(-1))
#endif
+#ifdef ALLOC_STATS
+static unsigned long long num_free_blocks_calls;
+static unsigned long long num_blocks_freed;
+static unsigned max_blocks_in_one_free;
+static unsigned num_malloc_calls;
+static unsigned num_malloc_bytes;
+#endif
#ifdef ALLOC_DEBUG
#define FILL_BYTE ((char)(0xa5))
@@ -208,6 +220,10 @@
*/
size += CLICK_SZ;
#endif
+#ifdef ALLOC_STATS
+ ++num_malloc_calls;
+ num_malloc_bytes += size + sizeof(union block_hdr);
+#endif
blok = (union block_hdr *) malloc(size + sizeof(union block_hdr));
if (blok == NULL) {
fprintf(stderr, "Ouch! malloc failed in malloc_block()\n");
@@ -261,6 +277,9 @@
free(blok);
}
#else
+#ifdef ALLOC_STATS
+ unsigned num_blocks;
+#endif
/* First, put new blocks at the head of the free list ---
* we'll eventually bash the 'next' pointer of the last block
* in the chain to point to the free blocks we already had.
@@ -281,7 +300,13 @@
* now.
*/
+#ifdef ALLOC_STATS
+ num_blocks = 1;
+#endif
while (blok->h.next != NULL) {
+#ifdef ALLOC_STATS
+ ++num_blocks;
+#endif
chk_on_blk_list(blok, old_free_list);
blok->h.first_avail = (char *) (blok + 1);
debug_fill(blok->h.first_avail, blok->h.endp - blok->h.first_avail);
@@ -301,6 +326,15 @@
/* Finally, reset next pointer to get the old free blocks back */
blok->h.next = old_free_list;
+
+#ifdef ALLOC_STATS
+ if (num_blocks > max_blocks_in_one_free) {
+ max_blocks_in_one_free = num_blocks;
+ }
+ ++num_free_blocks_calls;
+ num_blocks_freed += num_blocks;
+#endif
+
(void) ap_release_mutex(alloc_mutex);
#endif
}
@@ -448,6 +482,20 @@
}
#endif
+#ifdef ALLOC_STATS
+static void dump_stats(void)
+{
+ fprintf(stderr,
+ "alloc_stats: [%d] #free_blocks %llu #blocks %llu max %u #malloc %u
#bytes %u\n",
+ (int)getpid(),
+ num_free_blocks_calls,
+ num_blocks_freed,
+ max_blocks_in_one_free,
+ num_malloc_calls,
+ num_malloc_bytes);
+}
+#endif
+
pool *ap_init_alloc(void)
{
#ifdef POOL_DEBUG
@@ -459,6 +507,9 @@
alloc_mutex = ap_create_mutex(NULL);
spawn_mutex = ap_create_mutex(NULL);
permanent_pool = ap_make_sub_pool(NULL);
+#ifdef ALLOC_STATS
+ atexit(dump_stats);
+#endif
return permanent_pool;
}