diff options
author | jwoolley <jwoolley@13f79535-47bb-0310-9956-ffa450edef68> | 2003-08-28 02:09:52 +0000 |
---|---|---|
committer | jwoolley <jwoolley@13f79535-47bb-0310-9956-ffa450edef68> | 2003-08-28 02:09:52 +0000 |
commit | d9afa01ad2fcdddbe3806dfe4331024a6df7dbf7 (patch) | |
tree | 18c22e23c5d923cd5a38aa8309d96fbbff702e4a /buckets | |
parent | 2c88093f06cea817a7785535a960da12ca082acd (diff) | |
download | libapr-util-d9afa01ad2fcdddbe3806dfe4331024a6df7dbf7.tar.gz |
bucket debugging. a series of consistency checks for bucket brigades.
to enable, define APR_BUCKET_DEBUG at compile time. it was suggested that
I should have a --enable-bucket-debug configure option instead, but because
of the way we use APR's rules.mk, it's difficult to add extra CPPFLAGS from
apr-util's configure.in.
git-svn-id: http://svn.apache.org/repos/asf/apr/apr-util/trunk@58918 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'buckets')
-rw-r--r-- | buckets/apr_brigade.c | 6 | ||||
-rw-r--r-- | buckets/apr_buckets_alloc.c | 21 |
2 files changed, 27 insertions, 0 deletions
diff --git a/buckets/apr_brigade.c b/buckets/apr_brigade.c index 388b9ae0..eae58f8d 100644 --- a/buckets/apr_brigade.c +++ b/buckets/apr_brigade.c @@ -127,6 +127,10 @@ APU_DECLARE(apr_bucket_brigade *) apr_brigade_split(apr_bucket_brigade *b, APR_RING_UNSPLICE(e, f, link); APR_RING_SPLICE_HEAD(&a->list, e, f, apr_bucket, link); } + + APR_BRIGADE_CHECK_CONSISTENCY(a); + APR_BRIGADE_CHECK_CONSISTENCY(b); + return a; } @@ -148,6 +152,8 @@ APU_DECLARE(apr_status_t) apr_brigade_partition(apr_bucket_brigade *b, return APR_SUCCESS; } + APR_BRIGADE_CHECK_CONSISTENCY(b); + APR_BRIGADE_FOREACH(e, b) { if ((e->length == (apr_size_t)(-1)) && (point > (apr_size_t)(-1))) { /* XXX: point is too far out to simply split this bucket, diff --git a/buckets/apr_buckets_alloc.c b/buckets/apr_buckets_alloc.c index ccad531e..884b5347 100644 --- a/buckets/apr_buckets_alloc.c +++ b/buckets/apr_buckets_alloc.c @@ -151,12 +151,33 @@ APU_DECLARE_NONSTD(void *) apr_bucket_alloc(apr_size_t size, return ((char *)node) + SIZEOF_NODE_HEADER_T; } +#ifdef APR_BUCKET_DEBUG +#if APR_HAVE_STDLIB_H +#include <stdlib.h> +#endif +static void check_not_already_free(node_header_t *node) +{ + apr_bucket_alloc_t *list = node->alloc; + node_header_t *curr = list->freelist; + + while (curr) { + if (node == curr) { + abort(); + } + curr = curr->next; + } +} +#else +#define check_not_already_free(node) +#endif + APU_DECLARE_NONSTD(void) apr_bucket_free(void *mem) { node_header_t *node = (node_header_t *)((char *)mem - SIZEOF_NODE_HEADER_T); apr_bucket_alloc_t *list = node->alloc; if (node->size == SMALL_NODE_SIZE) { + check_not_already_free(node); node->next = list->freelist; list->freelist = node; } |