Annotation of win32/apache22/srclib/apr/include/apr_pools.h, revision 1.1

1.1     ! moko        1: /* Licensed to the Apache Software Foundation (ASF) under one or more
        !             2:  * contributor license agreements.  See the NOTICE file distributed with
        !             3:  * this work for additional information regarding copyright ownership.
        !             4:  * The ASF licenses this file to You under the Apache License, Version 2.0
        !             5:  * (the "License"); you may not use this file except in compliance with
        !             6:  * the License.  You may obtain a copy of the License at
        !             7:  *
        !             8:  *     http://www.apache.org/licenses/LICENSE-2.0
        !             9:  *
        !            10:  * Unless required by applicable law or agreed to in writing, software
        !            11:  * distributed under the License is distributed on an "AS IS" BASIS,
        !            12:  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        !            13:  * See the License for the specific language governing permissions and
        !            14:  * limitations under the License.
        !            15:  */
        !            16: 
        !            17: #ifndef APR_POOLS_H
        !            18: #define APR_POOLS_H
        !            19: 
        !            20: /**
        !            21:  * @file apr_pools.h
        !            22:  * @brief APR memory allocation
        !            23:  *
        !            24:  * Resource allocation routines...
        !            25:  *
        !            26:  * designed so that we don't have to keep track of EVERYTHING so that
        !            27:  * it can be explicitly freed later (a fundamentally unsound strategy ---
        !            28:  * particularly in the presence of die()).
        !            29:  *
        !            30:  * Instead, we maintain pools, and allocate items (both memory and I/O
        !            31:  * handlers) from the pools --- currently there are two, one for
        !            32:  * per-transaction info, and one for config info.  When a transaction is
        !            33:  * over, we can delete everything in the per-transaction apr_pool_t without
        !            34:  * fear, and without thinking too hard about it either.
        !            35:  *
        !            36:  * Note that most operations on pools are not thread-safe: a single pool
        !            37:  * should only be accessed by a single thread at any given time. The one
        !            38:  * exception to this rule is creating a subpool of a given pool: one or more
        !            39:  * threads can safely create subpools at the same time that another thread
        !            40:  * accesses the parent pool.
        !            41:  */
        !            42: 
        !            43: #include "apr.h"
        !            44: #include "apr_errno.h"
        !            45: #include "apr_general.h" /* for APR_STRINGIFY */
        !            46: #define APR_WANT_MEMFUNC /**< for no good reason? */
        !            47: #include "apr_want.h"
        !            48: 
        !            49: #ifdef __cplusplus
        !            50: extern "C" {
        !            51: #endif
        !            52: 
        !            53: /**
        !            54:  * @defgroup apr_pools Memory Pool Functions
        !            55:  * @ingroup APR 
        !            56:  * @{
        !            57:  */
        !            58: 
        !            59: /** The fundamental pool type */
        !            60: typedef struct apr_pool_t apr_pool_t;
        !            61: 
        !            62: 
        !            63: /**
        !            64:  * Declaration helper macro to construct apr_foo_pool_get()s.
        !            65:  *
        !            66:  * This standardized macro is used by opaque (APR) data types to return
        !            67:  * the apr_pool_t that is associated with the data type.
        !            68:  *
        !            69:  * APR_POOL_DECLARE_ACCESSOR() is used in a header file to declare the
        !            70:  * accessor function. A typical usage and result would be:
        !            71:  * <pre>
        !            72:  *    APR_POOL_DECLARE_ACCESSOR(file);
        !            73:  * becomes:
        !            74:  *    APR_DECLARE(apr_pool_t *) apr_file_pool_get(apr_file_t *ob);
        !            75:  * </pre>
        !            76:  * @remark Doxygen unwraps this macro (via doxygen.conf) to provide 
        !            77:  * actual help for each specific occurance of apr_foo_pool_get.
        !            78:  * @remark the linkage is specified for APR. It would be possible to expand
        !            79:  *       the macros to support other linkages.
        !            80:  */
        !            81: #define APR_POOL_DECLARE_ACCESSOR(type) \
        !            82:     APR_DECLARE(apr_pool_t *) apr_##type##_pool_get \
        !            83:         (const apr_##type##_t *the##type)
        !            84: 
        !            85: /** 
        !            86:  * Implementation helper macro to provide apr_foo_pool_get()s.
        !            87:  *
        !            88:  * In the implementation, the APR_POOL_IMPLEMENT_ACCESSOR() is used to
        !            89:  * actually define the function. It assumes the field is named "pool".
        !            90:  */
        !            91: #define APR_POOL_IMPLEMENT_ACCESSOR(type) \
        !            92:     APR_DECLARE(apr_pool_t *) apr_##type##_pool_get \
        !            93:             (const apr_##type##_t *the##type) \
        !            94:         { return the##type->pool; }
        !            95: 
        !            96: 
        !            97: /**
        !            98:  * Pool debug levels
        !            99:  *
        !           100:  * <pre>
        !           101:  * | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
        !           102:  * ---------------------------------
        !           103:  * |   |   |   |   |   |   |   | x |  General debug code enabled (useful in
        !           104:  *                                    combination with --with-efence).
        !           105:  *
        !           106:  * |   |   |   |   |   |   | x |   |  Verbose output on stderr (report
        !           107:  *                                    CREATE, CLEAR, DESTROY).
        !           108:  *
        !           109:  * |   |   |   | x |   |   |   |   |  Verbose output on stderr (report
        !           110:  *                                    PALLOC, PCALLOC).
        !           111:  *
        !           112:  * |   |   |   |   |   | x |   |   |  Lifetime checking. On each use of a
        !           113:  *                                    pool, check its lifetime.  If the pool
        !           114:  *                                    is out of scope, abort().
        !           115:  *                                    In combination with the verbose flag
        !           116:  *                                    above, it will output LIFE in such an
        !           117:  *                                    event prior to aborting.
        !           118:  *
        !           119:  * |   |   |   |   | x |   |   |   |  Pool owner checking.  On each use of a
        !           120:  *                                    pool, check if the current thread is the
        !           121:  *                                    pools owner.  If not, abort().  In
        !           122:  *                                    combination with the verbose flag above,
        !           123:  *                                    it will output OWNER in such an event
        !           124:  *                                    prior to aborting.  Use the debug
        !           125:  *                                    function apr_pool_owner_set() to switch
        !           126:  *                                    a pools ownership.
        !           127:  *
        !           128:  * When no debug level was specified, assume general debug mode.
        !           129:  * If level 0 was specified, debugging is switched off
        !           130:  * </pre>
        !           131:  */
        !           132: #if defined(APR_POOL_DEBUG)
        !           133: /* If APR_POOL_DEBUG is blank, we get 1; if it is a number, we get -1. */
        !           134: #if (APR_POOL_DEBUG - APR_POOL_DEBUG -1 == 1)
        !           135: #undef APR_POOL_DEBUG
        !           136: #define APR_POOL_DEBUG 1
        !           137: #endif
        !           138: #else
        !           139: #define APR_POOL_DEBUG 0
        !           140: #endif
        !           141: 
        !           142: /** the place in the code where the particular function was called */
        !           143: #define APR_POOL__FILE_LINE__ __FILE__ ":" APR_STRINGIFY(__LINE__)
        !           144: 
        !           145: 
        !           146: 
        !           147: /** A function that is called when allocation fails. */
        !           148: typedef int (*apr_abortfunc_t)(int retcode);
        !           149: 
        !           150: /*
        !           151:  * APR memory structure manipulators (pools, tables, and arrays).
        !           152:  */
        !           153: 
        !           154: /*
        !           155:  * Initialization
        !           156:  */
        !           157: 
        !           158: /**
        !           159:  * Setup all of the internal structures required to use pools
        !           160:  * @remark Programs do NOT need to call this directly.  APR will call this
        !           161:  *      automatically from apr_initialize.
        !           162:  * @internal
        !           163:  */
        !           164: APR_DECLARE(apr_status_t) apr_pool_initialize(void);
        !           165: 
        !           166: /**
        !           167:  * Tear down all of the internal structures required to use pools
        !           168:  * @remark Programs do NOT need to call this directly.  APR will call this
        !           169:  *      automatically from apr_terminate.
        !           170:  * @internal
        !           171:  */
        !           172: APR_DECLARE(void) apr_pool_terminate(void);
        !           173: 
        !           174: 
        !           175: /*
        !           176:  * Pool creation/destruction
        !           177:  */
        !           178: 
        !           179: #include "apr_allocator.h"
        !           180: 
        !           181: /**
        !           182:  * Create a new pool.
        !           183:  * @param newpool The pool we have just created.
        !           184:  * @param parent The parent pool.  If this is NULL, the new pool is a root
        !           185:  *        pool.  If it is non-NULL, the new pool will inherit all
        !           186:  *        of its parent pool's attributes, except the apr_pool_t will
        !           187:  *        be a sub-pool.
        !           188:  * @param abort_fn A function to use if the pool cannot allocate more memory.
        !           189:  * @param allocator The allocator to use with the new pool.  If NULL the
        !           190:  *        allocator of the parent pool will be used.
        !           191:  * @remark This function is thread-safe, in the sense that multiple threads
        !           192:  *         can safely create subpools of the same parent pool concurrently.
        !           193:  *         Similarly, a subpool can be created by one thread at the same
        !           194:  *         time that another thread accesses the parent pool.
        !           195:  */
        !           196: APR_DECLARE(apr_status_t) apr_pool_create_ex(apr_pool_t **newpool,
        !           197:                                              apr_pool_t *parent,
        !           198:                                              apr_abortfunc_t abort_fn,
        !           199:                                              apr_allocator_t *allocator)
        !           200:                           __attribute__((nonnull(1)));
        !           201: 
        !           202: /**
        !           203:  * Create a new pool.
        !           204:  * @deprecated @see apr_pool_create_unmanaged_ex.
        !           205:  */
        !           206: APR_DECLARE(apr_status_t) apr_pool_create_core_ex(apr_pool_t **newpool,
        !           207:                                                   apr_abortfunc_t abort_fn,
        !           208:                                                   apr_allocator_t *allocator);
        !           209: 
        !           210: /**
        !           211:  * Create a new unmanaged pool.
        !           212:  * @param newpool The pool we have just created.
        !           213:  * @param abort_fn A function to use if the pool cannot allocate more memory.
        !           214:  * @param allocator The allocator to use with the new pool.  If NULL a
        !           215:  *        new allocator will be crated with newpool as owner.
        !           216:  * @remark An unmanaged pool is a special pool without a parent; it will
        !           217:  *         NOT be destroyed upon apr_terminate.  It must be explicitly
        !           218:  *         destroyed by calling apr_pool_destroy, to prevent memory leaks.
        !           219:  *         Use of this function is discouraged, think twice about whether
        !           220:  *         you really really need it.
        !           221:  */
        !           222: APR_DECLARE(apr_status_t) apr_pool_create_unmanaged_ex(apr_pool_t **newpool,
        !           223:                                                    apr_abortfunc_t abort_fn,
        !           224:                                                    apr_allocator_t *allocator)
        !           225:                           __attribute__((nonnull(1)));
        !           226: 
        !           227: /**
        !           228:  * Debug version of apr_pool_create_ex.
        !           229:  * @param newpool @see apr_pool_create.
        !           230:  * @param parent @see apr_pool_create.
        !           231:  * @param abort_fn @see apr_pool_create.
        !           232:  * @param allocator @see apr_pool_create.
        !           233:  * @param file_line Where the function is called from.
        !           234:  *        This is usually APR_POOL__FILE_LINE__.
        !           235:  * @remark Only available when APR_POOL_DEBUG is defined.
        !           236:  *         Call this directly if you have you apr_pool_create_ex
        !           237:  *         calls in a wrapper function and wish to override
        !           238:  *         the file_line argument to reflect the caller of
        !           239:  *         your wrapper function.  If you do not have
        !           240:  *         apr_pool_create_ex in a wrapper, trust the macro
        !           241:  *         and don't call apr_pool_create_ex_debug directly.
        !           242:  */
        !           243: APR_DECLARE(apr_status_t) apr_pool_create_ex_debug(apr_pool_t **newpool,
        !           244:                                                    apr_pool_t *parent,
        !           245:                                                    apr_abortfunc_t abort_fn,
        !           246:                                                    apr_allocator_t *allocator,
        !           247:                                                    const char *file_line)
        !           248:                           __attribute__((nonnull(1)));
        !           249: 
        !           250: #if APR_POOL_DEBUG
        !           251: #define apr_pool_create_ex(newpool, parent, abort_fn, allocator)  \
        !           252:     apr_pool_create_ex_debug(newpool, parent, abort_fn, allocator, \
        !           253:                              APR_POOL__FILE_LINE__)
        !           254: #endif
        !           255: 
        !           256: /**
        !           257:  * Debug version of apr_pool_create_core_ex.
        !           258:  * @deprecated @see apr_pool_create_unmanaged_ex_debug.
        !           259:  */
        !           260: APR_DECLARE(apr_status_t) apr_pool_create_core_ex_debug(apr_pool_t **newpool,
        !           261:                                                    apr_abortfunc_t abort_fn,
        !           262:                                                    apr_allocator_t *allocator,
        !           263:                                                    const char *file_line);
        !           264: 
        !           265: /**
        !           266:  * Debug version of apr_pool_create_unmanaged_ex.
        !           267:  * @param newpool @see apr_pool_create_unmanaged.
        !           268:  * @param abort_fn @see apr_pool_create_unmanaged.
        !           269:  * @param allocator @see apr_pool_create_unmanaged.
        !           270:  * @param file_line Where the function is called from.
        !           271:  *        This is usually APR_POOL__FILE_LINE__.
        !           272:  * @remark Only available when APR_POOL_DEBUG is defined.
        !           273:  *         Call this directly if you have you apr_pool_create_unmanaged_ex
        !           274:  *         calls in a wrapper function and wish to override
        !           275:  *         the file_line argument to reflect the caller of
        !           276:  *         your wrapper function.  If you do not have
        !           277:  *         apr_pool_create_core_ex in a wrapper, trust the macro
        !           278:  *         and don't call apr_pool_create_core_ex_debug directly.
        !           279:  */
        !           280: APR_DECLARE(apr_status_t) apr_pool_create_unmanaged_ex_debug(apr_pool_t **newpool,
        !           281:                                                    apr_abortfunc_t abort_fn,
        !           282:                                                    apr_allocator_t *allocator,
        !           283:                                                    const char *file_line)
        !           284:                           __attribute__((nonnull(1)));
        !           285: 
        !           286: #if APR_POOL_DEBUG
        !           287: #define apr_pool_create_core_ex(newpool, abort_fn, allocator)  \
        !           288:     apr_pool_create_unmanaged_ex_debug(newpool, abort_fn, allocator, \
        !           289:                                   APR_POOL__FILE_LINE__)
        !           290: 
        !           291: #define apr_pool_create_unmanaged_ex(newpool, abort_fn, allocator)  \
        !           292:     apr_pool_create_unmanaged_ex_debug(newpool, abort_fn, allocator, \
        !           293:                                   APR_POOL__FILE_LINE__)
        !           294: 
        !           295: #endif
        !           296: 
        !           297: /**
        !           298:  * Create a new pool.
        !           299:  * @param newpool The pool we have just created.
        !           300:  * @param parent The parent pool.  If this is NULL, the new pool is a root
        !           301:  *        pool.  If it is non-NULL, the new pool will inherit all
        !           302:  *        of its parent pool's attributes, except the apr_pool_t will
        !           303:  *        be a sub-pool.
        !           304:  * @remark This function is thread-safe, in the sense that multiple threads
        !           305:  *         can safely create subpools of the same parent pool concurrently.
        !           306:  *         Similarly, a subpool can be created by one thread at the same
        !           307:  *         time that another thread accesses the parent pool.
        !           308:  */
        !           309: #if defined(DOXYGEN)
        !           310: APR_DECLARE(apr_status_t) apr_pool_create(apr_pool_t **newpool,
        !           311:                                           apr_pool_t *parent);
        !           312: #else
        !           313: #if APR_POOL_DEBUG
        !           314: #define apr_pool_create(newpool, parent) \
        !           315:     apr_pool_create_ex_debug(newpool, parent, NULL, NULL, \
        !           316:                              APR_POOL__FILE_LINE__)
        !           317: #else
        !           318: #define apr_pool_create(newpool, parent) \
        !           319:     apr_pool_create_ex(newpool, parent, NULL, NULL)
        !           320: #endif
        !           321: #endif
        !           322: 
        !           323: /**
        !           324:  * Create a new pool.
        !           325:  * @param newpool The pool we have just created.
        !           326:  */
        !           327: #if defined(DOXYGEN)
        !           328: APR_DECLARE(apr_status_t) apr_pool_create_core(apr_pool_t **newpool);
        !           329: APR_DECLARE(apr_status_t) apr_pool_create_unmanaged(apr_pool_t **newpool);
        !           330: #else
        !           331: #if APR_POOL_DEBUG
        !           332: #define apr_pool_create_core(newpool) \
        !           333:     apr_pool_create_unmanaged_ex_debug(newpool, NULL, NULL, \
        !           334:                                   APR_POOL__FILE_LINE__)
        !           335: #define apr_pool_create_unmanaged(newpool) \
        !           336:     apr_pool_create_unmanaged_ex_debug(newpool, NULL, NULL, \
        !           337:                                   APR_POOL__FILE_LINE__)
        !           338: #else
        !           339: #define apr_pool_create_core(newpool) \
        !           340:     apr_pool_create_unmanaged_ex(newpool, NULL, NULL)
        !           341: #define apr_pool_create_unmanaged(newpool) \
        !           342:     apr_pool_create_unmanaged_ex(newpool, NULL, NULL)
        !           343: #endif
        !           344: #endif
        !           345: 
        !           346: /**
        !           347:  * Find the pool's allocator
        !           348:  * @param pool The pool to get the allocator from.
        !           349:  */
        !           350: APR_DECLARE(apr_allocator_t *) apr_pool_allocator_get(apr_pool_t *pool)
        !           351:                                __attribute__((nonnull(1)));
        !           352: 
        !           353: /**
        !           354:  * Clear all memory in the pool and run all the cleanups. This also destroys all
        !           355:  * subpools.
        !           356:  * @param p The pool to clear
        !           357:  * @remark This does not actually free the memory, it just allows the pool
        !           358:  *         to re-use this memory for the next allocation.
        !           359:  * @see apr_pool_destroy()
        !           360:  */
        !           361: APR_DECLARE(void) apr_pool_clear(apr_pool_t *p) __attribute__((nonnull(1)));
        !           362: 
        !           363: /**
        !           364:  * Debug version of apr_pool_clear.
        !           365:  * @param p See: apr_pool_clear.
        !           366:  * @param file_line Where the function is called from.
        !           367:  *        This is usually APR_POOL__FILE_LINE__.
        !           368:  * @remark Only available when APR_POOL_DEBUG is defined.
        !           369:  *         Call this directly if you have you apr_pool_clear
        !           370:  *         calls in a wrapper function and wish to override
        !           371:  *         the file_line argument to reflect the caller of
        !           372:  *         your wrapper function.  If you do not have
        !           373:  *         apr_pool_clear in a wrapper, trust the macro
        !           374:  *         and don't call apr_pool_destroy_clear directly.
        !           375:  */
        !           376: APR_DECLARE(void) apr_pool_clear_debug(apr_pool_t *p,
        !           377:                                        const char *file_line)
        !           378:                   __attribute__((nonnull(1)));
        !           379: 
        !           380: #if APR_POOL_DEBUG
        !           381: #define apr_pool_clear(p) \
        !           382:     apr_pool_clear_debug(p, APR_POOL__FILE_LINE__)
        !           383: #endif
        !           384: 
        !           385: /**
        !           386:  * Destroy the pool. This takes similar action as apr_pool_clear() and then
        !           387:  * frees all the memory.
        !           388:  * @param p The pool to destroy
        !           389:  * @remark This will actually free the memory
        !           390:  */
        !           391: APR_DECLARE(void) apr_pool_destroy(apr_pool_t *p) __attribute__((nonnull(1)));
        !           392: 
        !           393: /**
        !           394:  * Debug version of apr_pool_destroy.
        !           395:  * @param p See: apr_pool_destroy.
        !           396:  * @param file_line Where the function is called from.
        !           397:  *        This is usually APR_POOL__FILE_LINE__.
        !           398:  * @remark Only available when APR_POOL_DEBUG is defined.
        !           399:  *         Call this directly if you have you apr_pool_destroy
        !           400:  *         calls in a wrapper function and wish to override
        !           401:  *         the file_line argument to reflect the caller of
        !           402:  *         your wrapper function.  If you do not have
        !           403:  *         apr_pool_destroy in a wrapper, trust the macro
        !           404:  *         and don't call apr_pool_destroy_debug directly.
        !           405:  */
        !           406: APR_DECLARE(void) apr_pool_destroy_debug(apr_pool_t *p,
        !           407:                                          const char *file_line)
        !           408:                   __attribute__((nonnull(1)));
        !           409: 
        !           410: #if APR_POOL_DEBUG
        !           411: #define apr_pool_destroy(p) \
        !           412:     apr_pool_destroy_debug(p, APR_POOL__FILE_LINE__)
        !           413: #endif
        !           414: 
        !           415: 
        !           416: /*
        !           417:  * Memory allocation
        !           418:  */
        !           419: 
        !           420: /**
        !           421:  * Allocate a block of memory from a pool
        !           422:  * @param p The pool to allocate from
        !           423:  * @param size The amount of memory to allocate
        !           424:  * @return The allocated memory
        !           425:  */
        !           426: APR_DECLARE(void *) apr_palloc(apr_pool_t *p, apr_size_t size)
        !           427: #if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
        !           428:                     __attribute__((alloc_size(2)))
        !           429: #endif
        !           430:                     __attribute__((nonnull(1)));
        !           431: 
        !           432: /**
        !           433:  * Debug version of apr_palloc
        !           434:  * @param p See: apr_palloc
        !           435:  * @param size See: apr_palloc
        !           436:  * @param file_line Where the function is called from.
        !           437:  *        This is usually APR_POOL__FILE_LINE__.
        !           438:  * @return See: apr_palloc
        !           439:  */
        !           440: APR_DECLARE(void *) apr_palloc_debug(apr_pool_t *p, apr_size_t size,
        !           441:                                      const char *file_line)
        !           442: #if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
        !           443:                     __attribute__((alloc_size(2)))
        !           444: #endif
        !           445:                     __attribute__((nonnull(1)));
        !           446: 
        !           447: #if APR_POOL_DEBUG
        !           448: #define apr_palloc(p, size) \
        !           449:     apr_palloc_debug(p, size, APR_POOL__FILE_LINE__)
        !           450: #endif
        !           451: 
        !           452: /**
        !           453:  * Allocate a block of memory from a pool and set all of the memory to 0
        !           454:  * @param p The pool to allocate from
        !           455:  * @param size The amount of memory to allocate
        !           456:  * @return The allocated memory
        !           457:  */
        !           458: #if defined(DOXYGEN)
        !           459: APR_DECLARE(void *) apr_pcalloc(apr_pool_t *p, apr_size_t size);
        !           460: #elif !APR_POOL_DEBUG
        !           461: #define apr_pcalloc(p, size) memset(apr_palloc(p, size), 0, size)
        !           462: #endif
        !           463: 
        !           464: /**
        !           465:  * Debug version of apr_pcalloc
        !           466:  * @param p See: apr_pcalloc
        !           467:  * @param size See: apr_pcalloc
        !           468:  * @param file_line Where the function is called from.
        !           469:  *        This is usually APR_POOL__FILE_LINE__.
        !           470:  * @return See: apr_pcalloc
        !           471:  */
        !           472: APR_DECLARE(void *) apr_pcalloc_debug(apr_pool_t *p, apr_size_t size,
        !           473:                                       const char *file_line)
        !           474:                     __attribute__((nonnull(1)));
        !           475: 
        !           476: #if APR_POOL_DEBUG
        !           477: #define apr_pcalloc(p, size) \
        !           478:     apr_pcalloc_debug(p, size, APR_POOL__FILE_LINE__)
        !           479: #endif
        !           480: 
        !           481: 
        !           482: /*
        !           483:  * Pool Properties
        !           484:  */
        !           485: 
        !           486: /**
        !           487:  * Set the function to be called when an allocation failure occurs.
        !           488:  * @remark If the program wants APR to exit on a memory allocation error,
        !           489:  *      then this function can be called to set the callback to use (for
        !           490:  *      performing cleanup and then exiting). If this function is not called,
        !           491:  *      then APR will return an error and expect the calling program to
        !           492:  *      deal with the error accordingly.
        !           493:  */
        !           494: APR_DECLARE(void) apr_pool_abort_set(apr_abortfunc_t abortfunc,
        !           495:                                      apr_pool_t *pool)
        !           496:                   __attribute__((nonnull(2)));
        !           497: 
        !           498: /**
        !           499:  * Get the abort function associated with the specified pool.
        !           500:  * @param pool The pool for retrieving the abort function.
        !           501:  * @return The abort function for the given pool.
        !           502:  */
        !           503: APR_DECLARE(apr_abortfunc_t) apr_pool_abort_get(apr_pool_t *pool)
        !           504:                              __attribute__((nonnull(1)));
        !           505: 
        !           506: /**
        !           507:  * Get the parent pool of the specified pool.
        !           508:  * @param pool The pool for retrieving the parent pool.
        !           509:  * @return The parent of the given pool.
        !           510:  */
        !           511: APR_DECLARE(apr_pool_t *) apr_pool_parent_get(apr_pool_t *pool)
        !           512:                           __attribute__((nonnull(1)));
        !           513: 
        !           514: /**
        !           515:  * Determine if pool a is an ancestor of pool b.
        !           516:  * @param a The pool to search
        !           517:  * @param b The pool to search for
        !           518:  * @return True if a is an ancestor of b, NULL is considered an ancestor
        !           519:  *         of all pools.
        !           520:  * @remark if compiled with APR_POOL_DEBUG, this function will also
        !           521:  * return true if A is a pool which has been guaranteed by the caller
        !           522:  * (using apr_pool_join) to have a lifetime at least as long as some
        !           523:  * ancestor of pool B.
        !           524:  */
        !           525: APR_DECLARE(int) apr_pool_is_ancestor(apr_pool_t *a, apr_pool_t *b);
        !           526: 
        !           527: /**
        !           528:  * Tag a pool (give it a name)
        !           529:  * @param pool The pool to tag
        !           530:  * @param tag  The tag
        !           531:  */
        !           532: APR_DECLARE(void) apr_pool_tag(apr_pool_t *pool, const char *tag)
        !           533:                   __attribute__((nonnull(1)));
        !           534: 
        !           535: 
        !           536: /*
        !           537:  * User data management
        !           538:  */
        !           539: 
        !           540: /**
        !           541:  * Set the data associated with the current pool
        !           542:  * @param data The user data associated with the pool.
        !           543:  * @param key The key to use for association
        !           544:  * @param cleanup The cleanup program to use to cleanup the data (NULL if none)
        !           545:  * @param pool The current pool
        !           546:  * @warning The data to be attached to the pool should have a life span
        !           547:  *          at least as long as the pool it is being attached to.
        !           548:  *
        !           549:  *      Users of APR must take EXTREME care when choosing a key to
        !           550:  *      use for their data.  It is possible to accidentally overwrite
        !           551:  *      data by choosing a key that another part of the program is using.
        !           552:  *      Therefore it is advised that steps are taken to ensure that unique
        !           553:  *      keys are used for all of the userdata objects in a particular pool
        !           554:  *      (the same key in two different pools or a pool and one of its
        !           555:  *      subpools is okay) at all times.  Careful namespace prefixing of
        !           556:  *      key names is a typical way to help ensure this uniqueness.
        !           557:  *
        !           558:  */
        !           559: APR_DECLARE(apr_status_t) apr_pool_userdata_set(const void *data,
        !           560:                                                 const char *key,
        !           561:                                                 apr_status_t (*cleanup)(void *),
        !           562:                                                 apr_pool_t *pool)
        !           563:                           __attribute__((nonnull(2,4)));
        !           564: 
        !           565: /**
        !           566:  * Set the data associated with the current pool
        !           567:  * @param data The user data associated with the pool.
        !           568:  * @param key The key to use for association
        !           569:  * @param cleanup The cleanup program to use to cleanup the data (NULL if none)
        !           570:  * @param pool The current pool
        !           571:  * @note same as apr_pool_userdata_set(), except that this version doesn't
        !           572:  *       make a copy of the key (this function is useful, for example, when
        !           573:  *       the key is a string literal)
        !           574:  * @warning This should NOT be used if the key could change addresses by
        !           575:  *       any means between the apr_pool_userdata_setn() call and a
        !           576:  *       subsequent apr_pool_userdata_get() on that key, such as if a
        !           577:  *       static string is used as a userdata key in a DSO and the DSO could
        !           578:  *       be unloaded and reloaded between the _setn() and the _get().  You
        !           579:  *       MUST use apr_pool_userdata_set() in such cases.
        !           580:  * @warning More generally, the key and the data to be attached to the
        !           581:  *       pool should have a life span at least as long as the pool itself.
        !           582:  *
        !           583:  */
        !           584: APR_DECLARE(apr_status_t) apr_pool_userdata_setn(
        !           585:                                 const void *data, const char *key,
        !           586:                                 apr_status_t (*cleanup)(void *),
        !           587:                                 apr_pool_t *pool)
        !           588:                           __attribute__((nonnull(2,4)));
        !           589: 
        !           590: /**
        !           591:  * Return the data associated with the current pool.
        !           592:  * @param data The user data associated with the pool.
        !           593:  * @param key The key for the data to retrieve
        !           594:  * @param pool The current pool.
        !           595:  */
        !           596: APR_DECLARE(apr_status_t) apr_pool_userdata_get(void **data, const char *key,
        !           597:                                                 apr_pool_t *pool)
        !           598:                           __attribute__((nonnull(1,2,3)));
        !           599: 
        !           600: 
        !           601: /**
        !           602:  * @defgroup PoolCleanup  Pool Cleanup Functions
        !           603:  *
        !           604:  * Cleanups are performed in the reverse order they were registered.  That is:
        !           605:  * Last In, First Out.  A cleanup function can safely allocate memory from
        !           606:  * the pool that is being cleaned up. It can also safely register additional
        !           607:  * cleanups which will be run LIFO, directly after the current cleanup
        !           608:  * terminates.  Cleanups have to take caution in calling functions that
        !           609:  * create subpools. Subpools, created during cleanup will NOT automatically
        !           610:  * be cleaned up.  In other words, cleanups are to clean up after themselves.
        !           611:  *
        !           612:  * @{
        !           613:  */
        !           614: 
        !           615: /**
        !           616:  * Register a function to be called when a pool is cleared or destroyed
        !           617:  * @param p The pool register the cleanup with
        !           618:  * @param data The data to pass to the cleanup function.
        !           619:  * @param plain_cleanup The function to call when the pool is cleared
        !           620:  *                      or destroyed
        !           621:  * @param child_cleanup The function to call when a child process is about
        !           622:  *                      to exec - this function is called in the child, obviously!
        !           623:  */
        !           624: APR_DECLARE(void) apr_pool_cleanup_register(
        !           625:                             apr_pool_t *p, const void *data,
        !           626:                             apr_status_t (*plain_cleanup)(void *),
        !           627:                             apr_status_t (*child_cleanup)(void *))
        !           628:                   __attribute__((nonnull(3,4)));
        !           629: 
        !           630: /**
        !           631:  * Register a function to be called when a pool is cleared or destroyed.
        !           632:  *
        !           633:  * Unlike apr_pool_cleanup_register which register a cleanup
        !           634:  * that is called AFTER all subpools are destroyed this function register
        !           635:  * a function that will be called before any of the subpool is destoryed.
        !           636:  *
        !           637:  * @param p The pool register the cleanup with
        !           638:  * @param data The data to pass to the cleanup function.
        !           639:  * @param plain_cleanup The function to call when the pool is cleared
        !           640:  *                      or destroyed
        !           641:  */
        !           642: APR_DECLARE(void) apr_pool_pre_cleanup_register(
        !           643:                             apr_pool_t *p, const void *data,
        !           644:                             apr_status_t (*plain_cleanup)(void *))
        !           645:                   __attribute__((nonnull(3)));
        !           646: 
        !           647: /**
        !           648:  * Remove a previously registered cleanup function.
        !           649:  * 
        !           650:  * The cleanup most recently registered with @a p having the same values of
        !           651:  * @a data and @a cleanup will be removed.
        !           652:  *
        !           653:  * @param p The pool to remove the cleanup from
        !           654:  * @param data The data of the registered cleanup
        !           655:  * @param cleanup The function to remove from cleanup
        !           656:  * @remarks For some strange reason only the plain_cleanup is handled by this
        !           657:  *          function
        !           658:  */
        !           659: APR_DECLARE(void) apr_pool_cleanup_kill(apr_pool_t *p, const void *data,
        !           660:                                         apr_status_t (*cleanup)(void *))
        !           661:                   __attribute__((nonnull(3)));
        !           662: 
        !           663: /**
        !           664:  * Replace the child cleanup function of a previously registered cleanup.
        !           665:  * 
        !           666:  * The cleanup most recently registered with @a p having the same values of
        !           667:  * @a data and @a plain_cleanup will have the registered child cleanup
        !           668:  * function replaced with @a child_cleanup.
        !           669:  *
        !           670:  * @param p The pool of the registered cleanup
        !           671:  * @param data The data of the registered cleanup
        !           672:  * @param plain_cleanup The plain cleanup function of the registered cleanup
        !           673:  * @param child_cleanup The function to register as the child cleanup
        !           674:  */
        !           675: APR_DECLARE(void) apr_pool_child_cleanup_set(
        !           676:                         apr_pool_t *p, const void *data,
        !           677:                         apr_status_t (*plain_cleanup)(void *),
        !           678:                         apr_status_t (*child_cleanup)(void *))
        !           679:                   __attribute__((nonnull(3,4)));
        !           680: 
        !           681: /**
        !           682:  * Run the specified cleanup function immediately and unregister it.
        !           683:  *
        !           684:  * The cleanup most recently registered with @a p having the same values of
        !           685:  * @a data and @a cleanup will be removed and @a cleanup will be called
        !           686:  * with @a data as the argument.
        !           687:  *
        !           688:  * @param p The pool to remove the cleanup from
        !           689:  * @param data The data to remove from cleanup
        !           690:  * @param cleanup The function to remove from cleanup
        !           691:  */
        !           692: APR_DECLARE(apr_status_t) apr_pool_cleanup_run(apr_pool_t *p, void *data,
        !           693:                                                apr_status_t (*cleanup)(void *))
        !           694:                           __attribute__((nonnull(3)));
        !           695: 
        !           696: /**
        !           697:  * An empty cleanup function.
        !           698:  * 
        !           699:  * Passed to apr_pool_cleanup_register() when no cleanup is required.
        !           700:  *
        !           701:  * @param data The data to cleanup, will not be used by this function.
        !           702:  */
        !           703: APR_DECLARE_NONSTD(apr_status_t) apr_pool_cleanup_null(void *data);
        !           704: 
        !           705: /**
        !           706:  * Run all registered child cleanups, in preparation for an exec()
        !           707:  * call in a forked child -- close files, etc., but *don't* flush I/O
        !           708:  * buffers, *don't* wait for subprocesses, and *don't* free any
        !           709:  * memory.
        !           710:  */
        !           711: APR_DECLARE(void) apr_pool_cleanup_for_exec(void);
        !           712: 
        !           713: /** @} */
        !           714: 
        !           715: /**
        !           716:  * @defgroup PoolDebug Pool Debugging functions.
        !           717:  *
        !           718:  * pools have nested lifetimes -- sub_pools are destroyed when the
        !           719:  * parent pool is cleared.  We allow certain liberties with operations
        !           720:  * on things such as tables (and on other structures in a more general
        !           721:  * sense) where we allow the caller to insert values into a table which
        !           722:  * were not allocated from the table's pool.  The table's data will
        !           723:  * remain valid as long as all the pools from which its values are
        !           724:  * allocated remain valid.
        !           725:  *
        !           726:  * For example, if B is a sub pool of A, and you build a table T in
        !           727:  * pool B, then it's safe to insert data allocated in A or B into T
        !           728:  * (because B lives at most as long as A does, and T is destroyed when
        !           729:  * B is cleared/destroyed).  On the other hand, if S is a table in
        !           730:  * pool A, it is safe to insert data allocated in A into S, but it
        !           731:  * is *not safe* to insert data allocated from B into S... because
        !           732:  * B can be cleared/destroyed before A is (which would leave dangling
        !           733:  * pointers in T's data structures).
        !           734:  *
        !           735:  * In general we say that it is safe to insert data into a table T
        !           736:  * if the data is allocated in any ancestor of T's pool.  This is the
        !           737:  * basis on which the APR_POOL_DEBUG code works -- it tests these ancestor
        !           738:  * relationships for all data inserted into tables.  APR_POOL_DEBUG also
        !           739:  * provides tools (apr_pool_find, and apr_pool_is_ancestor) for other
        !           740:  * folks to implement similar restrictions for their own data
        !           741:  * structures.
        !           742:  *
        !           743:  * However, sometimes this ancestor requirement is inconvenient --
        !           744:  * sometimes it's necessary to create a sub pool where the sub pool is
        !           745:  * guaranteed to have the same lifetime as the parent pool.  This is a
        !           746:  * guarantee implemented by the *caller*, not by the pool code.  That
        !           747:  * is, the caller guarantees they won't destroy the sub pool
        !           748:  * individually prior to destroying the parent pool.
        !           749:  *
        !           750:  * In this case the caller must call apr_pool_join() to indicate this
        !           751:  * guarantee to the APR_POOL_DEBUG code.
        !           752:  *
        !           753:  * These functions are only implemented when #APR_POOL_DEBUG is set.
        !           754:  *
        !           755:  * @{
        !           756:  */
        !           757: #if APR_POOL_DEBUG || defined(DOXYGEN)
        !           758: /**
        !           759:  * Guarantee that a subpool has the same lifetime as the parent.
        !           760:  * @param p The parent pool
        !           761:  * @param sub The subpool
        !           762:  */
        !           763: APR_DECLARE(void) apr_pool_join(apr_pool_t *p, apr_pool_t *sub)
        !           764:                   __attribute__((nonnull(2)));
        !           765: 
        !           766: /**
        !           767:  * Find a pool from something allocated in it.
        !           768:  * @param mem The thing allocated in the pool
        !           769:  * @return The pool it is allocated in
        !           770:  */
        !           771: APR_DECLARE(apr_pool_t *) apr_pool_find(const void *mem);
        !           772: 
        !           773: /**
        !           774:  * Report the number of bytes currently in the pool
        !           775:  * @param p The pool to inspect
        !           776:  * @param recurse Recurse/include the subpools' sizes
        !           777:  * @return The number of bytes
        !           778:  */
        !           779: APR_DECLARE(apr_size_t) apr_pool_num_bytes(apr_pool_t *p, int recurse)
        !           780:                         __attribute__((nonnull(1)));
        !           781: 
        !           782: /**
        !           783:  * Lock a pool
        !           784:  * @param pool The pool to lock
        !           785:  * @param flag  The flag
        !           786:  */
        !           787: APR_DECLARE(void) apr_pool_lock(apr_pool_t *pool, int flag);
        !           788: 
        !           789: /* @} */
        !           790: 
        !           791: #else /* APR_POOL_DEBUG or DOXYGEN */
        !           792: 
        !           793: #ifdef apr_pool_join
        !           794: #undef apr_pool_join
        !           795: #endif
        !           796: #define apr_pool_join(a,b)
        !           797: 
        !           798: #ifdef apr_pool_lock
        !           799: #undef apr_pool_lock
        !           800: #endif
        !           801: #define apr_pool_lock(pool, lock)
        !           802: 
        !           803: #endif /* APR_POOL_DEBUG or DOXYGEN */
        !           804: 
        !           805: /** @} */
        !           806: 
        !           807: #ifdef __cplusplus
        !           808: }
        !           809: #endif
        !           810: 
        !           811: #endif /* !APR_POOLS_H */

E-mail: