summaryrefslogtreecommitdiff
path: root/buckets
diff options
context:
space:
mode:
authorStefan Fritsch <sf@apache.org>2013-01-19 17:04:50 +0000
committerStefan Fritsch <sf@apache.org>2013-01-19 17:04:50 +0000
commit3b87c3b9d7254467d8f3e8da3591bcddbf00582f (patch)
tree9b77c80daa2772c9c369a043a27297dea431a668 /buckets
parent880b63861c28d20d680cfe19597e0c912bb19f20 (diff)
downloadapr-3b87c3b9d7254467d8f3e8da3591bcddbf00582f.tar.gz
Revert r789061, r758414, and r758398 which are leftovers of the palloc uses
malloc experiment that were forgotten when reverting to the old code in r795598. This fixes the apr_allocator created by apr_bucket_alloc_create() being leaked by apr_bucket_alloc_destroy. git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@1435605 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'buckets')
-rw-r--r--buckets/apr_buckets_alloc.c36
1 files changed, 28 insertions, 8 deletions
diff --git a/buckets/apr_buckets_alloc.c b/buckets/apr_buckets_alloc.c
index 8cdf703dd..c73c7db35 100644
--- a/buckets/apr_buckets_alloc.c
+++ b/buckets/apr_buckets_alloc.c
@@ -47,22 +47,37 @@ static apr_status_t alloc_cleanup(void *data)
apr_allocator_free(list->allocator, list->blocks);
- apr_allocator_destroy(list->allocator);
+#if APR_POOL_DEBUG
+ if (list->pool && list->allocator != apr_pool_allocator_get(list->pool)) {
+ apr_allocator_destroy(list->allocator);
+ }
+#endif
return APR_SUCCESS;
}
APR_DECLARE_NONSTD(apr_bucket_alloc_t *) apr_bucket_alloc_create(apr_pool_t *p)
{
- apr_allocator_t *allocator;
+ apr_allocator_t *allocator = apr_pool_allocator_get(p);
apr_bucket_alloc_t *list;
- if (apr_allocator_create(&allocator) != APR_SUCCESS
- || (list = apr_bucket_alloc_create_ex(allocator)) == NULL) {
- apr_abortfunc_t fn = apr_pool_abort_get(p);
- if (fn)
- (fn)(APR_ENOMEM);
- abort();
+#if APR_POOL_DEBUG
+ /* may be NULL for debug mode. */
+ if (allocator == NULL) {
+ if (apr_allocator_create(&allocator) != APR_SUCCESS) {
+ apr_abortfunc_t fn = apr_pool_abort_get(p);
+ if (fn)
+ (fn)(APR_ENOMEM);
+ abort();
+ }
+ }
+#endif
+ list = apr_bucket_alloc_create_ex(allocator);
+ if (list == NULL) {
+ apr_abortfunc_t fn = apr_pool_abort_get(p);
+ if (fn)
+ (fn)(APR_ENOMEM);
+ abort();
}
list->pool = p;
apr_pool_cleanup_register(list->pool, list, alloc_cleanup,
@@ -99,6 +114,11 @@ APR_DECLARE_NONSTD(void) apr_bucket_alloc_destroy(apr_bucket_alloc_t *list)
apr_allocator_free(list->allocator, list->blocks);
+#if APR_POOL_DEBUG
+ if (list->pool && list->allocator != apr_pool_allocator_get(list->pool)) {
+ apr_allocator_destroy(list->allocator);
+ }
+#endif
}
APR_DECLARE_NONSTD(void *) apr_bucket_alloc(apr_size_t size,