1
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
* you may not use this file except in compliance with the License.
6
* You may obtain a copy of the License at
8
* http://www.apache.org/licenses/LICENSE-2.0
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.
17
#ifndef APR_ALLOCATOR_H
18
#define APR_ALLOCATOR_H
21
* @file apr_allocator.h
22
* @brief APR Internal Memory Allocation
26
#include "apr_errno.h"
27
#define APR_WANT_MEMFUNC /**< For no good reason? */
35
* @defgroup apr_allocator Internal Memory Allocation
40
/** the allocator structure */
41
typedef struct apr_allocator_t apr_allocator_t;
42
/** the structure which holds information about the allocation */
43
typedef struct apr_memnode_t apr_memnode_t;
45
/** basic memory node structure
46
* @note The next, ref and first_avail fields are available for use by the
47
* caller of apr_allocator_alloc(), the remaining fields are read-only.
48
* The next field has to be used with caution and sensibly set when the
49
* memnode is passed back to apr_allocator_free(). See apr_allocator_free()
51
* The ref and first_avail fields will be properly restored by
52
* apr_allocator_free().
54
struct apr_memnode_t {
55
apr_memnode_t *next; /**< next memnode */
56
apr_memnode_t **ref; /**< reference to self */
57
apr_uint32_t index; /**< size */
58
apr_uint32_t free_index; /**< how much free */
59
char *first_avail; /**< pointer to first free memory */
60
char *endp; /**< pointer to end of free memory */
63
/** The base size of a memory node - aligned. */
64
#define APR_MEMNODE_T_SIZE APR_ALIGN_DEFAULT(sizeof(apr_memnode_t))
66
/** Symbolic constants */
67
#define APR_ALLOCATOR_MAX_FREE_UNLIMITED 0
70
* Create a new allocator
71
* @param allocator The allocator we have just created.
74
APR_DECLARE(apr_status_t) apr_allocator_create(apr_allocator_t **allocator);
77
* Destroy an allocator
78
* @param allocator The allocator to be destroyed
79
* @remark Any memnodes not given back to the allocator prior to destroying
80
* will _not_ be free()d.
82
APR_DECLARE(void) apr_allocator_destroy(apr_allocator_t *allocator);
85
* Allocate a block of mem from the allocator
86
* @param allocator The allocator to allocate from
87
* @param size The size of the mem to allocate (excluding the
90
APR_DECLARE(apr_memnode_t *) apr_allocator_alloc(apr_allocator_t *allocator,
94
* Free a list of blocks of mem, giving them back to the allocator.
95
* The list is typically terminated by a memnode with its next field
97
* @param allocator The allocator to give the mem back to
98
* @param memnode The memory node to return
100
APR_DECLARE(void) apr_allocator_free(apr_allocator_t *allocator,
101
apr_memnode_t *memnode);
103
#include "apr_pools.h"
106
* Set the owner of the allocator
107
* @param allocator The allocator to set the owner for
108
* @param pool The pool that is to own the allocator
109
* @remark Typically pool is the highest level pool using the allocator
112
* XXX: see if we can come up with something a bit better. Currently
113
* you can make a pool an owner, but if the pool doesn't use the allocator
114
* the allocator will never be destroyed.
116
APR_DECLARE(void) apr_allocator_owner_set(apr_allocator_t *allocator,
120
* Get the current owner of the allocator
121
* @param allocator The allocator to get the owner from
123
APR_DECLARE(apr_pool_t *) apr_allocator_owner_get(apr_allocator_t *allocator);
126
* Set the current threshold at which the allocator should start
127
* giving blocks back to the system.
128
* @param allocator The allocator the set the threshold on
129
* @param size The threshold. 0 == unlimited.
131
APR_DECLARE(void) apr_allocator_max_free_set(apr_allocator_t *allocator,
134
#include "apr_thread_mutex.h"
138
* Set a mutex for the allocator to use
139
* @param allocator The allocator to set the mutex for
140
* @param mutex The mutex
142
APR_DECLARE(void) apr_allocator_mutex_set(apr_allocator_t *allocator,
143
apr_thread_mutex_t *mutex);
146
* Get the mutex currently set for the allocator
147
* @param allocator The allocator
149
APR_DECLARE(apr_thread_mutex_t *) apr_allocator_mutex_get(
150
apr_allocator_t *allocator);
152
#endif /* APR_HAS_THREADS */
160
#endif /* !APR_ALLOCATOR_H */