From commits-return-9384-apmail-apr-commits-archive=apr.apache.org@apr.apache.org Sat Apr 12 06:36:43 2008 Return-Path: Delivered-To: apmail-apr-commits-archive@www.apache.org Received: (qmail 71506 invoked from network); 12 Apr 2008 06:36:42 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 12 Apr 2008 06:36:42 -0000 Received: (qmail 95566 invoked by uid 500); 12 Apr 2008 06:36:43 -0000 Delivered-To: apmail-apr-commits-archive@apr.apache.org Received: (qmail 95516 invoked by uid 500); 12 Apr 2008 06:36:42 -0000 Mailing-List: contact commits-help@apr.apache.org; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: Reply-To: dev@apr.apache.org List-Id: Delivered-To: mailing list commits@apr.apache.org Received: (qmail 95505 invoked by uid 99); 12 Apr 2008 06:36:42 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 11 Apr 2008 23:36:42 -0700 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO eris.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 12 Apr 2008 06:35:58 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id D87721A9832; Fri, 11 Apr 2008 23:36:15 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r647384 - in /apr/apr/trunk: CHANGES include/apr_pools.h memory/unix/apr_pools.c Date: Sat, 12 Apr 2008 06:36:15 -0000 To: commits@apr.apache.org From: mturk@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20080412063616.D87721A9832@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: mturk Date: Fri Apr 11 23:36:14 2008 New Revision: 647384 URL: http://svn.apache.org/viewvc?rev=647384&view=rev Log: Introduce apr_pool_create_core_ex Modified: apr/apr/trunk/CHANGES apr/apr/trunk/include/apr_pools.h apr/apr/trunk/memory/unix/apr_pools.c Modified: apr/apr/trunk/CHANGES URL: http://svn.apache.org/viewvc/apr/apr/trunk/CHANGES?rev=647384&r1=647383&r2=647384&view=diff ============================================================================== --- apr/apr/trunk/CHANGES [utf-8] (original) +++ apr/apr/trunk/CHANGES [utf-8] Fri Apr 11 23:36:14 2008 @@ -1,6 +1,14 @@ -*- coding: utf-8 -*- Changes for APR 1.3.0 + *) Introduce apr_pool_create_core_ex() for creation of standalone + pools without parent. This function should be used for short + living pools, usually ones that are created and destroyed + either in a loop or inside function call. Since the pools + created with this function doesn't have a parent they must + be explicitly destroyed when done. + [Mladen Turk] + *) Fix return value when apr_pollset_poll interrupted. PR 42580 [Basant Kumar Kukreja ] Modified: apr/apr/trunk/include/apr_pools.h URL: http://svn.apache.org/viewvc/apr/apr/trunk/include/apr_pools.h?rev=647384&r1=647383&r2=647384&view=diff ============================================================================== --- apr/apr/trunk/include/apr_pools.h (original) +++ apr/apr/trunk/include/apr_pools.h Fri Apr 11 23:36:14 2008 @@ -189,6 +189,17 @@ apr_allocator_t *allocator); /** + * Create a new pool. + * @param newpool The pool we have just created. + * @param abort_fn A function to use if the pool cannot allocate more memory. + * @param allocator The allocator to use with the new pool. If NULL the + * new allocator will be crated with newpool as owner. + */ +APR_DECLARE(apr_status_t) apr_pool_create_core_ex(apr_pool_t **newpool, + apr_abortfunc_t abort_fn, + apr_allocator_t *allocator); + +/** * Debug version of apr_pool_create_ex. * @param newpool @see apr_pool_create. * @param parent @see apr_pool_create. @@ -217,6 +228,32 @@ #endif /** + * Debug version of apr_pool_create_core_ex. + * @param newpool @see apr_pool_create. + * @param abort_fn @see apr_pool_create. + * @param allocator @see apr_pool_create. + * @param file_line Where the function is called from. + * This is usually APR_POOL__FILE_LINE__. + * @remark Only available when APR_POOL_DEBUG is defined. + * Call this directly if you have you apr_pool_create_core_ex + * calls in a wrapper function and wish to override + * the file_line argument to reflect the caller of + * your wrapper function. If you do not have + * apr_pool_create_core_ex in a wrapper, trust the macro + * and don't call apr_pool_create_core_ex_debug directly. + */ +APR_DECLARE(apr_status_t) apr_pool_create_ex_core_debug(apr_pool_t **newpool, + apr_abortfunc_t abort_fn, + apr_allocator_t *allocator, + const char *file_line); + +#if APR_POOL_DEBUG +#define apr_pool_create_core_ex(newpool, abort_fn, allocator) \ + apr_pool_create_core_ex_debug(newpool, abort_fn, allocator, \ + APR_POOL__FILE_LINE__) +#endif + +/** * Create a new pool. * @param newpool The pool we have just created. * @param parent The parent pool. If this is NULL, the new pool is a root @@ -235,6 +272,23 @@ #else #define apr_pool_create(newpool, parent) \ apr_pool_create_ex(newpool, parent, NULL, NULL) +#endif +#endif + +/** + * Create a new pool. + * @param newpool The pool we have just created. + */ +#if defined(DOXYGEN) +APR_DECLARE(apr_status_t) apr_pool_create_core(apr_pool_t **newpool); +#else +#if APR_POOL_DEBUG +#define apr_pool_create_core(newpool) \ + apr_pool_create_core_ex_debug(newpool, NULL, NULL, \ + APR_POOL__FILE_LINE__) +#else +#define apr_pool_create_core(newpool) \ + apr_pool_create_core_ex(newpool, NULL, NULL) #endif #endif Modified: apr/apr/trunk/memory/unix/apr_pools.c URL: http://svn.apache.org/viewvc/apr/apr/trunk/memory/unix/apr_pools.c?rev=647384&r1=647383&r2=647384&view=diff ============================================================================== --- apr/apr/trunk/memory/unix/apr_pools.c (original) +++ apr/apr/trunk/memory/unix/apr_pools.c Fri Apr 11 23:36:14 2008 @@ -893,6 +893,64 @@ return APR_SUCCESS; } +APR_DECLARE(apr_status_t) apr_pool_create_core_ex(apr_pool_t **newpool, + apr_abortfunc_t abort_fn, + apr_allocator_t *allocator) +{ + apr_pool_t *pool; + apr_memnode_t *node; + apr_allocator_t *pool_allocator; + + *newpool = NULL; + + if (!apr_pools_initialized) + return APR_ENOPOOL; + if ((pool_allocator = allocator) == NULL) { + if ((pool_allocator = malloc(SIZEOF_ALLOCATOR_T)) == NULL) { + if (abort_fn) + abort_fn(APR_ENOMEM); + + return APR_ENOMEM; + } + memset(pool_allocator, 0, SIZEOF_ALLOCATOR_T); + pool_allocator->max_free_index = APR_ALLOCATOR_MAX_FREE_UNLIMITED; + } + if ((node = allocator_alloc(pool_allocator, + MIN_ALLOC - APR_MEMNODE_T_SIZE)) == NULL) { + if (abort_fn) + abort_fn(APR_ENOMEM); + + return APR_ENOMEM; + } + + node->next = node; + node->ref = &node->next; + + pool = (apr_pool_t *)node->first_avail; + node->first_avail = pool->self_first_avail = (char *)pool + SIZEOF_POOL_T; + + pool->allocator = pool_allocator; + pool->active = pool->self = node; + pool->abort_fn = abort_fn; + pool->child = NULL; + pool->cleanups = NULL; + pool->free_cleanups = NULL; + pool->subprocesses = NULL; + pool->user_data = NULL; + pool->tag = NULL; + pool->parent = NULL; + pool->sibling = NULL; + pool->ref = NULL; + +#ifdef NETWARE + pool->owner_proc = (apr_os_proc_t)getnlmhandle(); +#endif /* defined(NETWARE) */ + if (!allocator) + pool_allocator->owner = pool; + *newpool = pool; + + return APR_SUCCESS; +} /* * "Print" functions @@ -1647,6 +1705,75 @@ return APR_SUCCESS; } +APR_DECLARE(apr_status_t) apr_pool_create_core_ex_debug(apr_pool_t **newpool, + apr_abortfunc_t abort_fn, + apr_allocator_t *allocator, + const char *file_line) +{ + apr_pool_t *pool; + apr_allocator_t *pool_allocator; + + *newpool = NULL; + + if ((pool = malloc(SIZEOF_POOL_T)) == NULL) { + if (abort_fn) + abort_fn(APR_ENOMEM); + + return APR_ENOMEM; + } + + memset(pool, 0, SIZEOF_POOL_T); + + pool->abort_fn = abort_fn; + pool->tag = file_line; + pool->file_line = file_line; + +#if APR_HAS_THREADS + pool->owner = apr_os_thread_current(); +#endif /* APR_HAS_THREADS */ +#ifdef NETWARE + pool->owner_proc = (apr_os_proc_t)getnlmhandle(); +#endif /* defined(NETWARE) */ + + if ((pool_allocator = allocator) == NULL) { + apr_status_t rv; + if ((rv = apr_allocator_create(&pool_allocator)) != APR_SUCCESS) { + if (abort_fn) + abort_fn(rv); + return rv; + } + pool_allocator->owner = pool; + } + pool->allocator = pool_allocator; + + if (pool->allocator != allocator) { +#if APR_HAS_THREADS + apr_status_t rv; + + /* No matter what the creation flags say, always create + * a lock. Without it integrity_check and apr_pool_num_bytes + * blow up (because they traverse pools child lists that + * possibly belong to another thread, in combination with + * the pool having no lock). However, this might actually + * hide problems like creating a child pool of a pool + * belonging to another thread. + */ + if ((rv = apr_thread_mutex_create(&pool->mutex, + APR_THREAD_MUTEX_NESTED, pool)) != APR_SUCCESS) { + free(pool); + return rv; + } +#endif /* APR_HAS_THREADS */ + } + + *newpool = pool; + +#if (APR_POOL_DEBUG & APR_POOL_DEBUG_VERBOSE) + apr_pool_log_event(pool, "CREATE", file_line, 1); +#endif /* (APR_POOL_DEBUG & APR_POOL_DEBUG_VERBOSE) */ + + return APR_SUCCESS; +} /* * "Print" functions (debug) @@ -2288,6 +2415,14 @@ return apr_pool_create_ex(newpool, parent, abort_fn, allocator); } +APR_DECLARE(apr_status_t) apr_pool_create_core_ex_debug(apr_pool_t **newpool, + apr_abortfunc_t abort_fn, + apr_allocator_t *allocator, + const char *file_line) +{ + return apr_pool_create_core_ex(newpool, abort_fn, allocator); +} + #else /* APR_POOL_DEBUG */ #undef apr_palloc @@ -2336,6 +2471,19 @@ return apr_pool_create_ex_debug(newpool, parent, abort_fn, allocator, "undefined"); +} + +#undef apr_pool_create_core_ex +APR_DECLARE(apr_status_t) apr_pool_create_core_ex(apr_pool_t **newpool, + apr_abortfunc_t abort_fn, + apr_allocator_t *allocator); + +APR_DECLARE(apr_status_t) apr_pool_create_core_ex(apr_pool_t **newpool, + apr_abortfunc_t abort_fn, + apr_allocator_t *allocator) +{ + return apr_pool_create_core_ex_debug(newpool, abort_fn, + allocator, "undefined"); } #endif /* APR_POOL_DEBUG */