/src/pjsip/pjlib/include/pj/pool.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright (C) 2008-2011 Teluu Inc. (http://www.teluu.com) |
3 | | * Copyright (C) 2003-2008 Benny Prijono <benny@prijono.org> |
4 | | * |
5 | | * This program is free software; you can redistribute it and/or modify |
6 | | * it under the terms of the GNU General Public License as published by |
7 | | * the Free Software Foundation; either version 2 of the License, or |
8 | | * (at your option) any later version. |
9 | | * |
10 | | * This program is distributed in the hope that it will be useful, |
11 | | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | | * GNU General Public License for more details. |
14 | | * |
15 | | * You should have received a copy of the GNU General Public License |
16 | | * along with this program; if not, write to the Free Software |
17 | | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
18 | | */ |
19 | | |
20 | | #include <pj/list.h> |
21 | | |
22 | | /* See if we use pool's alternate API. |
23 | | * The alternate API is used e.g. to implement pool debugging. |
24 | | */ |
25 | | #if PJ_HAS_POOL_ALT_API |
26 | | # include <pj/pool_alt.h> |
27 | | #endif |
28 | | |
29 | | |
30 | | #ifndef __PJ_POOL_H__ |
31 | | #define __PJ_POOL_H__ |
32 | | |
33 | | /** |
34 | | * @file pool.h |
35 | | * @brief Memory Pool. |
36 | | */ |
37 | | |
38 | | PJ_BEGIN_DECL |
39 | | |
40 | | /** |
41 | | * @defgroup PJ_POOL_GROUP Fast Memory Pool |
42 | | * @brief |
43 | | * Memory pools allow dynamic memory allocation comparable to malloc or the |
44 | | * new in operator C++. Those implementations are not desirable for very |
45 | | * high performance applications or real-time systems, because of the |
46 | | * performance bottlenecks and it suffers from fragmentation issue. |
47 | | * |
48 | | * \section PJ_POOL_INTRO_SEC PJLIB's Memory Pool |
49 | | * \subsection PJ_POOL_ADVANTAGE_SUBSEC Advantages |
50 | | * |
51 | | * PJLIB's pool has many advantages over traditional malloc/new operator and |
52 | | * over other memory pool implementations, because: |
53 | | * - unlike other memory pool implementation, it allows allocation of |
54 | | * memory chunks of different sizes, |
55 | | * - it's very very fast. |
56 | | * \n |
57 | | * Memory chunk allocation is not only an O(1) |
58 | | * operation, but it's also very simple (just |
59 | | * few pointer arithmetic operations) and it doesn't require locking |
60 | | * any mutex, |
61 | | * - it's memory efficient. |
62 | | * \n |
63 | | * Pool doesn't keep track individual memory chunks allocated by |
64 | | * applications, so there is no additional overhead needed for each |
65 | | * memory allocation (other than possible additional of few bytes, up to |
66 | | * PJ_POOL_ALIGNMENT-1, for aligning the memory). |
67 | | * But see the @ref PJ_POOL_CAVEATS_SUBSEC below. |
68 | | * - it prevents memory leaks. |
69 | | * \n |
70 | | * Memory pool inherently has garbage collection functionality. In fact, |
71 | | * there is no need to free the chunks allocated from the memory pool. |
72 | | * All chunks previously allocated from the pool will be freed once the |
73 | | * pool itself is destroyed. This would prevent memory leaks that haunt |
74 | | * programmers for decades, and it provides additional performance |
75 | | * advantage over traditional malloc/new operator. |
76 | | * |
77 | | * Even more, PJLIB's memory pool provides some additional usability and |
78 | | * flexibility for applications: |
79 | | * - memory leaks are easily traceable, since memory pool is assigned name, |
80 | | * and application can inspect what pools currently active in the system. |
81 | | * - by design, memory allocation from a pool is not thread safe. We assumed |
82 | | * that a pool will be owned by a higher level object, and thread safety |
83 | | * should be handled by that object. This enables very fast pool operations |
84 | | * and prevents unnecessary locking operations, |
85 | | * - by default, the memory pool API behaves more like C++ new operator, |
86 | | * in that it will throw PJ_NO_MEMORY_EXCEPTION exception (see |
87 | | * @ref PJ_EXCEPT) when memory chunk allocation fails. This enables failure |
88 | | * handling to be done on more high level function (instead of checking |
89 | | * the result of pj_pool_alloc() everytime). If application doesn't like |
90 | | * this, the default behavior can be changed on global basis by supplying |
91 | | * different policy to the pool factory. |
92 | | * - any memory allocation backend allocator/deallocator may be used. By |
93 | | * default, the policy uses malloc() and free() to manage the pool's block, |
94 | | * but application may use different strategy, for example to allocate |
95 | | * memory blocks from a globally static memory location. |
96 | | * |
97 | | * |
98 | | * \subsection PJ_POOL_PERFORMANCE_SUBSEC Performance |
99 | | * |
100 | | * The result of PJLIB's memory design and careful implementation is a |
101 | | * memory allocation strategy that can speed-up the memory allocations |
102 | | * and deallocations by up to <b>30 times</b> compared to standard |
103 | | * malloc()/free() (more than 150 million allocations per second on a |
104 | | * P4/3.0GHz Linux machine). |
105 | | * |
106 | | * (Note: your mileage may vary, of course. You can see how much PJLIB's |
107 | | * pool improves the performance over malloc()/free() in your target |
108 | | * system by running pjlib-test application). |
109 | | * |
110 | | * |
111 | | * \subsection PJ_POOL_CAVEATS_SUBSEC Caveats |
112 | | * |
113 | | * There are some caveats though! |
114 | | * |
115 | | * When creating pool, PJLIB requires applications to specify the initial |
116 | | * pool size, and as soon as the pool is created, PJLIB allocates memory |
117 | | * from the system by that size. Application designers MUST choose the |
118 | | * initial pool size carefully, since choosing too big value will result in |
119 | | * wasting system's memory. |
120 | | * |
121 | | * But the pool can grow. Application designer can specify how the |
122 | | * pool will grow in size, by specifying the size increment when creating |
123 | | * the pool. |
124 | | * |
125 | | * The pool, however, <b>cannot</b> shrink! Since there is <b>no</b> |
126 | | * function to deallocate memory chunks, there is no way for the pool to |
127 | | * release back unused memory to the system. |
128 | | * Application designers must be aware that constant memory allocations |
129 | | * from pool that has infinite life-time may cause the memory usage of |
130 | | * the application to grow over time. |
131 | | * |
132 | | * |
133 | | * \section PJ_POOL_USING_SEC Using Memory Pool |
134 | | * |
135 | | * This section describes how to use PJLIB's memory pool framework. |
136 | | * As we hope the readers will witness, PJLIB's memory pool API is quite |
137 | | * straightforward. |
138 | | * |
139 | | * \subsection PJ_POOL_USING_F Create Pool Factory |
140 | | * First, application needs to initialize a pool factory (this normally |
141 | | * only needs to be done once in one application). PJLIB provides |
142 | | * a pool factory implementation called caching pool (see @ref |
143 | | * PJ_CACHING_POOL), and it is initialized by calling #pj_caching_pool_init(). |
144 | | * |
145 | | * \subsection PJ_POOL_USING_P Create The Pool |
146 | | * Then application creates the pool object itself with #pj_pool_create(), |
147 | | * specifying among other thing the pool factory where the pool should |
148 | | * be created from, the pool name, initial size, and increment/expansion |
149 | | * size. |
150 | | * |
151 | | * \subsection PJ_POOL_USING_M Allocate Memory as Required |
152 | | * Then whenever application needs to allocate dynamic memory, it would |
153 | | * call #pj_pool_alloc(), #pj_pool_calloc(), or #pj_pool_zalloc() to |
154 | | * allocate memory chunks from the pool. |
155 | | * |
156 | | * \subsection PJ_POOL_USING_DP Destroy the Pool |
157 | | * When application has finished with the pool, it should call |
158 | | * #pj_pool_release() to release the pool object back to the factory. |
159 | | * Depending on the types of the factory, this may release the memory back |
160 | | * to the operating system. |
161 | | * |
162 | | * \subsection PJ_POOL_USING_Dc Destroy the Pool Factory |
163 | | * And finally, before application quites, it should deinitialize the |
164 | | * pool factory, to make sure that all memory blocks allocated by the |
165 | | * factory are released back to the operating system. After this, of |
166 | | * course no more memory pool allocation can be requested. |
167 | | * |
168 | | * \subsection PJ_POOL_USING_EX Example |
169 | | * Below is a sample complete program that utilizes PJLIB's memory pool. |
170 | | * |
171 | | * \code |
172 | | |
173 | | #include <pjlib.h> |
174 | | |
175 | | #define THIS_FILE "pool_sample.c" |
176 | | |
177 | | static void my_perror(const char *title, pj_status_t status) |
178 | | { |
179 | | PJ_PERROR(1,(THIS_FILE, status, title)); |
180 | | } |
181 | | |
182 | | static void pool_demo_1(pj_pool_factory *pfactory) |
183 | | { |
184 | | unsigned i; |
185 | | pj_pool_t *pool; |
186 | | |
187 | | // Must create pool before we can allocate anything |
188 | | pool = pj_pool_create(pfactory, // the factory |
189 | | "pool1", // pool's name |
190 | | 4000, // initial size |
191 | | 4000, // increment size |
192 | | NULL); // use default callback. |
193 | | if (pool == NULL) { |
194 | | my_perror("Error creating pool", PJ_ENOMEM); |
195 | | return; |
196 | | } |
197 | | |
198 | | // Demo: allocate some memory chunks |
199 | | for (i=0; i<1000; ++i) { |
200 | | void *p; |
201 | | |
202 | | p = pj_pool_alloc(pool, (pj_rand()+1) % 512); |
203 | | |
204 | | // Do something with p |
205 | | ... |
206 | | |
207 | | // Look! No need to free p!! |
208 | | } |
209 | | |
210 | | // Done with silly demo, must free pool to release all memory. |
211 | | pj_pool_release(pool); |
212 | | } |
213 | | |
214 | | int main() |
215 | | { |
216 | | pj_caching_pool cp; |
217 | | pj_status_t status; |
218 | | |
219 | | // Must init PJLIB before anything else |
220 | | status = pj_init(); |
221 | | if (status != PJ_SUCCESS) { |
222 | | my_perror("Error initializing PJLIB", status); |
223 | | return 1; |
224 | | } |
225 | | |
226 | | // Create the pool factory, in this case, a caching pool, |
227 | | // using default pool policy. |
228 | | pj_caching_pool_init(&cp, NULL, 1024*1024 ); |
229 | | |
230 | | // Do a demo |
231 | | pool_demo_1(&cp.factory); |
232 | | |
233 | | // Done with demos, destroy caching pool before exiting app. |
234 | | pj_caching_pool_destroy(&cp); |
235 | | |
236 | | return 0; |
237 | | } |
238 | | |
239 | | \endcode |
240 | | * |
241 | | * More information about pool factory, the pool object, and caching pool |
242 | | * can be found on the Module Links below. |
243 | | */ |
244 | | |
245 | | |
246 | | /** |
247 | | * @defgroup PJ_POOL Memory Pool Object |
248 | | * @ingroup PJ_POOL_GROUP |
249 | | * @brief |
250 | | * The memory pool is an opaque object created by pool factory. |
251 | | * Application uses this object to request a memory chunk, by calling |
252 | | * #pj_pool_alloc(), #pj_pool_calloc(), or #pj_pool_zalloc(). |
253 | | * When the application has finished using |
254 | | * the pool, it must call #pj_pool_release() to free all the chunks previously |
255 | | * allocated and release the pool back to the factory. |
256 | | * |
257 | | * A memory pool is initialized with an initial amount of memory, which is |
258 | | * called a block. Pool can be configured to dynamically allocate more memory |
259 | | * blocks when it runs out of memory. |
260 | | * |
261 | | * The pool doesn't keep track of individual memory allocations |
262 | | * by user, and the user doesn't have to free these indidual allocations. This |
263 | | * makes memory allocation simple and very fast. All the memory allocated from |
264 | | * the pool will be destroyed when the pool itself is destroyed. |
265 | | * |
266 | | * \section PJ_POOL_THREADING_SEC More on Threading Policies |
267 | | * - By design, memory allocation from a pool is not thread safe. We assumed |
268 | | * that a pool will be owned by an object, and thread safety should be |
269 | | * handled by that object. Thus these functions are not thread safe: |
270 | | * - #pj_pool_alloc, |
271 | | * - #pj_pool_calloc, |
272 | | * - and other pool statistic functions. |
273 | | * - Threading in the pool factory is decided by the policy set for the |
274 | | * factory when it was created. |
275 | | * |
276 | | * \section PJ_POOL_EXAMPLES_SEC Examples |
277 | | * |
278 | | * For some sample codes on how to use the pool, please see: |
279 | | * - Pool test: \src{pjlib/src/pjlib-test/pool.c} |
280 | | * |
281 | | * @{ |
282 | | */ |
283 | | |
284 | | /** |
285 | | * The type for function to receive callback from the pool when it is unable |
286 | | * to allocate memory. The elegant way to handle this condition is to throw |
287 | | * exception, and this is what is expected by most of this library |
288 | | * components. |
289 | | */ |
290 | | typedef void pj_pool_callback(pj_pool_t *pool, pj_size_t size); |
291 | | |
292 | | /** |
293 | | * This class, which is used internally by the pool, describes a single |
294 | | * block of memory from which user memory allocations will be allocated from. |
295 | | */ |
296 | | typedef struct pj_pool_block |
297 | | { |
298 | | PJ_DECL_LIST_MEMBER(struct pj_pool_block); /**< List's prev and next. */ |
299 | | unsigned char *buf; /**< Start of buffer. */ |
300 | | unsigned char *cur; /**< Current alloc ptr. */ |
301 | | unsigned char *end; /**< End of buffer. */ |
302 | | } pj_pool_block; |
303 | | |
304 | | |
305 | | /** |
306 | | * This structure describes the memory pool. Only implementors of pool factory |
307 | | * need to care about the contents of this structure. |
308 | | */ |
309 | | struct pj_pool_t |
310 | | { |
311 | | PJ_DECL_LIST_MEMBER(struct pj_pool_t); /**< Standard list elements. */ |
312 | | |
313 | | /** Pool name */ |
314 | | char obj_name[PJ_MAX_OBJ_NAME]; |
315 | | |
316 | | /** Pool factory. */ |
317 | | pj_pool_factory *factory; |
318 | | |
319 | | /** Data put by factory */ |
320 | | void *factory_data; |
321 | | |
322 | | /** Current capacity allocated by the pool. */ |
323 | | pj_size_t capacity; |
324 | | |
325 | | /** Size of memory block to be allocated when the pool runs out of memory */ |
326 | | pj_size_t increment_size; |
327 | | |
328 | | /** List of memory blocks allcoated by the pool. */ |
329 | | pj_pool_block block_list; |
330 | | |
331 | | /** The callback to be called when the pool is unable to allocate memory. */ |
332 | | pj_pool_callback *callback; |
333 | | |
334 | | /** The default alignment of memory block allocated from this pool |
335 | | * (must be power of 2). */ |
336 | | pj_size_t alignment; |
337 | | |
338 | | }; |
339 | | |
340 | | |
341 | | /** |
342 | | * Guidance on how much memory required for initial pool administrative data. |
343 | | */ |
344 | | #define PJ_POOL_SIZE (sizeof(struct pj_pool_t)) |
345 | | |
346 | | /** |
347 | | * Pool memory alignment (must be power of 2). |
348 | | */ |
349 | | #ifndef PJ_POOL_ALIGNMENT |
350 | | # define PJ_POOL_ALIGNMENT 4 |
351 | | #endif |
352 | | |
353 | | /** |
354 | | * Create a new pool from the pool factory. This wrapper will call |
355 | | * pj_pool_aligned_create() with alignment parameter set to 0 |
356 | | * which means use the default alignment (PJ_POOL_ALIGNMENT). |
357 | | * |
358 | | * @param factory The pool factory. |
359 | | * @param name The name to be assigned to the pool. The name should |
360 | | * not be longer than PJ_MAX_OBJ_NAME (32 chars), or |
361 | | * otherwise it will be truncated. |
362 | | * @param initial_size The size of initial memory blocks taken by the pool. |
363 | | * Note that the pool will take 68+20 bytes for |
364 | | * administrative area from this block. |
365 | | * @param increment_size the size of each additional blocks to be allocated |
366 | | * when the pool is running out of memory. If user |
367 | | * requests memory which is larger than this size, then |
368 | | * an error occurs. |
369 | | * Note that each time a pool allocates additional block, |
370 | | * it needs PJ_POOL_SIZE more to store some |
371 | | * administrative info. |
372 | | * @param callback Callback to be called when error occurs in the pool. |
373 | | * If this value is NULL, then the callback from pool |
374 | | * factory policy will be used. |
375 | | * Note that when an error occurs during pool creation, |
376 | | * the callback itself is not called. Instead, NULL |
377 | | * will be returned. |
378 | | * |
379 | | * @return The memory pool, or NULL. |
380 | | */ |
381 | | PJ_IDECL(pj_pool_t*) pj_pool_create(pj_pool_factory *factory, |
382 | | const char *name, |
383 | | pj_size_t initial_size, |
384 | | pj_size_t increment_size, |
385 | | pj_pool_callback *callback); |
386 | | |
387 | | |
388 | | /** |
389 | | * Create a new pool from the pool factory. This wrapper will call create_pool |
390 | | * member of the pool factory. |
391 | | * |
392 | | * @param factory The pool factory. |
393 | | * @param name The name to be assigned to the pool. The name should |
394 | | * not be longer than PJ_MAX_OBJ_NAME (32 chars), or |
395 | | * otherwise it will be truncated. |
396 | | * @param initial_size The size of initial memory blocks taken by the pool. |
397 | | * Note that the pool will take 68+20 bytes for |
398 | | * administrative area from this block. |
399 | | * @param increment_size the size of each additional blocks to be allocated |
400 | | * when the pool is running out of memory. If user |
401 | | * requests memory which is larger than this size, then |
402 | | * an error occurs. |
403 | | * Note that each time a pool allocates additional block, |
404 | | * it needs PJ_POOL_SIZE more to store some |
405 | | * administrative info. |
406 | | * @param alignment the default alignment of memory block allocated |
407 | | * from this pool (must be power of 2). |
408 | | * Value of 0 means use PJ_POOL_ALIGNMENT. |
409 | | * @param callback Callback to be called when error occurs in the pool. |
410 | | * If this value is NULL, then the callback from pool |
411 | | * factory policy will be used. |
412 | | * Note that when an error occurs during pool creation, |
413 | | * the callback itself is not called. Instead, NULL |
414 | | * will be returned. |
415 | | * |
416 | | * @return The memory pool, or NULL. |
417 | | */ |
418 | | PJ_IDECL(pj_pool_t*) pj_pool_aligned_create(pj_pool_factory *factory, |
419 | | const char *name, |
420 | | pj_size_t initial_size, |
421 | | pj_size_t increment_size, |
422 | | pj_size_t alignment, |
423 | | pj_pool_callback *callback); |
424 | | |
425 | | /** |
426 | | * Release the pool back to pool factory. |
427 | | * |
428 | | * @param pool Memory pool. |
429 | | */ |
430 | | PJ_IDECL(void) pj_pool_release( pj_pool_t *pool ); |
431 | | |
432 | | |
433 | | /** |
434 | | * Release the pool back to pool factory and set the pool pointer to zero. |
435 | | * |
436 | | * @param ppool Pointer to memory pool. |
437 | | */ |
438 | | PJ_IDECL(void) pj_pool_safe_release( pj_pool_t **ppool ); |
439 | | |
440 | | |
441 | | /** |
442 | | * Release the pool back to pool factory and set the pool pointer to zero. |
443 | | * The memory pool content will be wiped out first before released. |
444 | | * |
445 | | * @param ppool Pointer to memory pool. |
446 | | */ |
447 | | PJ_IDECL(void) pj_pool_secure_release( pj_pool_t **ppool ); |
448 | | |
449 | | |
450 | | /** |
451 | | * Get pool object name. |
452 | | * |
453 | | * @param pool the pool. |
454 | | * |
455 | | * @return pool name as NULL terminated string. |
456 | | */ |
457 | | PJ_IDECL(const char *) pj_pool_getobjname( const pj_pool_t *pool ); |
458 | | |
459 | | /** |
460 | | * Reset the pool to its state when it was initialized. |
461 | | * This means that if additional blocks have been allocated during runtime, |
462 | | * then they will be freed. Only the original block allocated during |
463 | | * initialization is retained. This function will also reset the internal |
464 | | * counters, such as pool capacity and used size. |
465 | | * |
466 | | * @param pool the pool. |
467 | | */ |
468 | | PJ_DECL(void) pj_pool_reset( pj_pool_t *pool ); |
469 | | |
470 | | |
471 | | /** |
472 | | * Get the pool capacity, that is, the system storage that have been allocated |
473 | | * by the pool, and have been used/will be used to allocate user requests. |
474 | | * There's no guarantee that the returned value represent a single |
475 | | * contiguous block, because the capacity may be spread in several blocks. |
476 | | * |
477 | | * @param pool the pool. |
478 | | * |
479 | | * @return the capacity. |
480 | | */ |
481 | | PJ_IDECL(pj_size_t) pj_pool_get_capacity( pj_pool_t *pool ); |
482 | | |
483 | | /** |
484 | | * Get the total size of user allocation request. |
485 | | * |
486 | | * @param pool the pool. |
487 | | * |
488 | | * @return the total size. |
489 | | */ |
490 | | PJ_IDECL(pj_size_t) pj_pool_get_used_size( pj_pool_t *pool ); |
491 | | |
492 | | /** |
493 | | * Allocate storage with the specified size from the pool. |
494 | | * The allocation will be aligned to the default alignment of the pool. |
495 | | * If there's no storage available in the pool, then the pool can allocate more |
496 | | * blocks if the increment size is larger than the requested size. |
497 | | * This function will call pj_pool_aligned_alloc() with alignment set to 0. |
498 | | * |
499 | | * @param pool the pool. |
500 | | * @param size the requested size. |
501 | | * |
502 | | * @return pointer to the allocated memory. |
503 | | * |
504 | | * @see PJ_POOL_ALLOC_T |
505 | | */ |
506 | | PJ_IDECL(void*) pj_pool_alloc( pj_pool_t *pool, pj_size_t size); |
507 | | |
508 | | |
509 | | /** |
510 | | * Allocate storage with the specified size and alignment from the pool. |
511 | | * If there's no storage available in the pool, then the pool can allocate more |
512 | | * blocks if the increment size is larger than the requested size. |
513 | | * |
514 | | * @param pool the pool. |
515 | | * @param alignment the requested alignment of the allocation. |
516 | | * Value of 0 means use the default alignment of this pool. |
517 | | * @param size the requested size. |
518 | | * |
519 | | * @return pointer to the allocated memory. |
520 | | * |
521 | | * @see PJ_POOL_ALLOC_T |
522 | | */ |
523 | | PJ_IDECL(void *) pj_pool_aligned_alloc(pj_pool_t *pool, pj_size_t alignment, |
524 | | pj_size_t size); |
525 | | |
526 | | /** |
527 | | * Allocate storage from the pool, and initialize it to zero. |
528 | | * This function behaves like pj_pool_alloc(), except that the storage will |
529 | | * be initialized to zero. |
530 | | * |
531 | | * @param pool the pool. |
532 | | * @param count the number of elements in the array. |
533 | | * @param elem the size of individual element. |
534 | | * |
535 | | * @return pointer to the allocated memory. |
536 | | */ |
537 | | PJ_IDECL(void*) pj_pool_calloc( pj_pool_t *pool, pj_size_t count, |
538 | | pj_size_t elem); |
539 | | |
540 | | |
541 | | /** |
542 | | * Allocate storage from the pool and initialize it to zero. |
543 | | * |
544 | | * @param pool The pool. |
545 | | * @param size The size to be allocated. |
546 | | * |
547 | | * @return Pointer to the allocated memory. |
548 | | * |
549 | | * @see PJ_POOL_ZALLOC_T |
550 | | */ |
551 | | PJ_INLINE(void*) pj_pool_zalloc(pj_pool_t *pool, pj_size_t size) |
552 | 0 | { |
553 | 0 | return pj_pool_calloc(pool, 1, size); |
554 | 0 | } Unexecuted instantiation: fuzz-http.c:pj_pool_zalloc Unexecuted instantiation: string.c:pj_pool_zalloc Unexecuted instantiation: os_core_unix.c:pj_pool_zalloc Unexecuted instantiation: ioqueue_select.c:pj_pool_zalloc Unexecuted instantiation: pool_policy_malloc.c:pj_pool_zalloc Unexecuted instantiation: activesock.c:pj_pool_zalloc Unexecuted instantiation: lock.c:pj_pool_zalloc Unexecuted instantiation: pool.c:pj_pool_zalloc Unexecuted instantiation: pool_caching.c:pj_pool_zalloc Unexecuted instantiation: sock_common.c:pj_pool_zalloc Unexecuted instantiation: timer.c:pj_pool_zalloc Unexecuted instantiation: pool_buf.c:pj_pool_zalloc |
555 | | |
556 | | |
557 | | /** |
558 | | * This macro allocates memory from the pool and returns the instance of |
559 | | * the specified type. It provides a stricker type safety than pj_pool_alloc() |
560 | | * since the return value of this macro will be type-casted to the specified |
561 | | * type. |
562 | | * |
563 | | * @param pool The pool |
564 | | * @param type The type of object to be allocated |
565 | | * |
566 | | * @return Memory buffer of the specified type. |
567 | | */ |
568 | | #define PJ_POOL_ALLOC_T(pool,type) \ |
569 | 1.11k | ((type*)pj_pool_alloc(pool, sizeof(type))) |
570 | | |
571 | | /** |
572 | | * This macro allocates memory from the pool, zeroes the buffer, and |
573 | | * returns the instance of the specified type. It provides a stricker type |
574 | | * safety than pj_pool_zalloc() since the return value of this macro will be |
575 | | * type-casted to the specified type. |
576 | | * |
577 | | * @param pool The pool |
578 | | * @param type The type of object to be allocated |
579 | | * |
580 | | * @return Memory buffer of the specified type. |
581 | | */ |
582 | | #define PJ_POOL_ZALLOC_T(pool,type) \ |
583 | 0 | ((type*)pj_pool_zalloc(pool, sizeof(type))) |
584 | | |
585 | | /* |
586 | | * Internal functions |
587 | | */ |
588 | | /** Internal function */ |
589 | | PJ_IDECL(void*) pj_pool_alloc_from_block(pj_pool_block *block, pj_size_t alignment, |
590 | | pj_size_t size); |
591 | | /** Internal function */ |
592 | | PJ_DECL(void*) pj_pool_allocate_find(pj_pool_t *pool, pj_size_t alignment, |
593 | | pj_size_t size); |
594 | | |
595 | | |
596 | | |
597 | | /** |
598 | | * @} // PJ_POOL |
599 | | */ |
600 | | |
601 | | /* **************************************************************************/ |
602 | | /** |
603 | | * @defgroup PJ_POOL_FACTORY Pool Factory and Policy |
604 | | * @ingroup PJ_POOL_GROUP |
605 | | * @brief |
606 | | * A pool object must be created through a factory. A factory not only provides |
607 | | * generic interface functions to create and release pool, but also provides |
608 | | * strategy to manage the life time of pools. One sample implementation, |
609 | | * \a pj_caching_pool, can be set to keep the pools released by application for |
610 | | * future use as long as the total memory is below the limit. |
611 | | * |
612 | | * The pool factory interface declared in PJLIB is designed to be extensible. |
613 | | * Application can define its own strategy by creating it's own pool factory |
614 | | * implementation, and this strategy can be used even by existing library |
615 | | * without recompilation. |
616 | | * |
617 | | * \section PJ_POOL_FACTORY_ITF Pool Factory Interface |
618 | | * The pool factory defines the following interface: |
619 | | * - \a policy: the memory pool factory policy. |
620 | | * - \a create_pool(): create a new memory pool. |
621 | | * - \a release_pool(): release memory pool back to factory. |
622 | | * |
623 | | * \section PJ_POOL_FACTORY_POL Pool Factory Policy. |
624 | | * |
625 | | * A pool factory only defines functions to create and release pool and how |
626 | | * to manage pools, but the rest of the functionalities are controlled by |
627 | | * policy. A pool policy defines: |
628 | | * - how memory block is allocated and deallocated (the default implementation |
629 | | * allocates and deallocate memory by calling malloc() and free()). |
630 | | * - callback to be called when memory allocation inside a pool fails (the |
631 | | * default implementation will throw PJ_NO_MEMORY_EXCEPTION exception). |
632 | | * - concurrency when creating and releasing pool from/to the factory. |
633 | | * |
634 | | * A pool factory can be given different policy during creation to make |
635 | | * it behave differently. For example, caching pool factory can be configured |
636 | | * to allocate and deallocate from a static/contiguous/preallocated memory |
637 | | * instead of using malloc()/free(). |
638 | | * |
639 | | * What strategy/factory and what policy to use is not defined by PJLIB, but |
640 | | * instead is left to application to make use whichever is most efficient for |
641 | | * itself. |
642 | | * |
643 | | * The pool factory policy controls the behaviour of memory factories, and |
644 | | * defines the following interface: |
645 | | * - \a block_alloc(): allocate memory block from backend memory mgmt/system. |
646 | | * - \a block_free(): free memory block back to backend memory mgmt/system. |
647 | | * @{ |
648 | | */ |
649 | | |
650 | | /* We unfortunately don't have support for factory policy options as now, |
651 | | so we keep this commented at the moment. |
652 | | enum PJ_POOL_FACTORY_OPTION |
653 | | { |
654 | | PJ_POOL_FACTORY_SERIALIZE = 1 |
655 | | }; |
656 | | */ |
657 | | |
658 | | /** |
659 | | * This structure declares pool factory interface. |
660 | | */ |
661 | | typedef struct pj_pool_factory_policy |
662 | | { |
663 | | /** |
664 | | * Allocate memory block (for use by pool). This function is called |
665 | | * by memory pool to allocate memory block. |
666 | | * |
667 | | * @param factory Pool factory. |
668 | | * @param size The size of memory block to allocate. |
669 | | * |
670 | | * @return Memory block. |
671 | | */ |
672 | | void* (*block_alloc)(pj_pool_factory *factory, pj_size_t size); |
673 | | |
674 | | /** |
675 | | * Free memory block. |
676 | | * |
677 | | * @param factory Pool factory. |
678 | | * @param mem Memory block previously allocated by block_alloc(). |
679 | | * @param size The size of memory block. |
680 | | */ |
681 | | void (*block_free)(pj_pool_factory *factory, void *mem, pj_size_t size); |
682 | | |
683 | | /** |
684 | | * Default callback to be called when memory allocation fails. |
685 | | */ |
686 | | pj_pool_callback *callback; |
687 | | |
688 | | /** |
689 | | * Option flags. |
690 | | */ |
691 | | unsigned flags; |
692 | | |
693 | | } pj_pool_factory_policy; |
694 | | |
695 | | /** |
696 | | * This constant denotes the exception number that will be thrown by default |
697 | | * memory factory policy when memory allocation fails. |
698 | | * |
699 | | * @see pj_NO_MEMORY_EXCEPTION() |
700 | | */ |
701 | | PJ_DECL_DATA(int) PJ_NO_MEMORY_EXCEPTION; |
702 | | |
703 | | /** |
704 | | * Get #PJ_NO_MEMORY_EXCEPTION constant. |
705 | | */ |
706 | | PJ_DECL(int) pj_NO_MEMORY_EXCEPTION(void); |
707 | | |
708 | | /** |
709 | | * This global variable points to default memory pool factory policy. |
710 | | * The behaviour of the default policy is: |
711 | | * - block allocation and deallocation use malloc() and free(). |
712 | | * - callback will raise PJ_NO_MEMORY_EXCEPTION exception. |
713 | | * - access to pool factory is not serialized (i.e. not thread safe). |
714 | | * |
715 | | * @see pj_pool_factory_get_default_policy |
716 | | */ |
717 | | PJ_DECL_DATA(pj_pool_factory_policy) pj_pool_factory_default_policy; |
718 | | |
719 | | |
720 | | /** |
721 | | * Get the default pool factory policy. |
722 | | * |
723 | | * @return the pool policy. |
724 | | */ |
725 | | PJ_DECL(const pj_pool_factory_policy*) pj_pool_factory_get_default_policy(void); |
726 | | |
727 | | |
728 | | /** |
729 | | * This structure contains the declaration for pool factory interface. |
730 | | */ |
731 | | struct pj_pool_factory |
732 | | { |
733 | | /** |
734 | | * Memory pool policy. |
735 | | */ |
736 | | pj_pool_factory_policy policy; |
737 | | |
738 | | /** |
739 | | * Create a new pool from the pool factory. |
740 | | * |
741 | | * @param factory The pool factory. |
742 | | * @param name the name to be assigned to the pool. The name should |
743 | | * not be longer than PJ_MAX_OBJ_NAME (32 chars), or |
744 | | * otherwise it will be truncated. |
745 | | * @param initial_size the size of initial memory blocks taken by the pool. |
746 | | * Note that the pool will take 68+20 bytes for |
747 | | * administrative area from this block. |
748 | | * @param increment_size the size of each additional blocks to be allocated |
749 | | * when the pool is running out of memory. If user |
750 | | * requests memory which is larger than this size, then |
751 | | * an error occurs. |
752 | | * Note that each time a pool allocates additional block, |
753 | | * it needs 20 bytes (equal to sizeof(pj_pool_block)) to |
754 | | * store some administrative info. |
755 | | * @param alignment the default alignment of memory block allocated |
756 | | * from this pool (must be power of 2). |
757 | | * A value of 0 should result in the pool being created |
758 | | * with alignment equal to PJ_POOL_ALIGNMENT. |
759 | | * @param callback Callback to be called when error occurs in the pool. |
760 | | * Note that when an error occurs during pool creation, |
761 | | * the callback itself is not called. Instead, NULL |
762 | | * will be returned. |
763 | | * |
764 | | * @return the memory pool, or NULL. |
765 | | */ |
766 | | pj_pool_t* (*create_pool)( pj_pool_factory *factory, |
767 | | const char *name, |
768 | | pj_size_t initial_size, |
769 | | pj_size_t increment_size, |
770 | | pj_size_t alignment, |
771 | | pj_pool_callback *callback); |
772 | | |
773 | | /** |
774 | | * Release the pool to the pool factory. |
775 | | * |
776 | | * @param factory The pool factory. |
777 | | * @param pool The pool to be released. |
778 | | */ |
779 | | void (*release_pool)( pj_pool_factory *factory, pj_pool_t *pool ); |
780 | | |
781 | | /** |
782 | | * Dump pool status to log. |
783 | | * |
784 | | * @param factory The pool factory. |
785 | | */ |
786 | | void (*dump_status)( pj_pool_factory *factory, pj_bool_t detail ); |
787 | | |
788 | | /** |
789 | | * This is optional callback to be called by allocation policy when |
790 | | * it allocates a new memory block. The factory may use this callback |
791 | | * for example to keep track of the total number of memory blocks |
792 | | * currently allocated by applications. |
793 | | * |
794 | | * @param factory The pool factory. |
795 | | * @param size Size requested by application. |
796 | | * |
797 | | * @return MUST return PJ_TRUE, otherwise the block |
798 | | * allocation is cancelled. |
799 | | */ |
800 | | pj_bool_t (*on_block_alloc)(pj_pool_factory *factory, pj_size_t size); |
801 | | |
802 | | /** |
803 | | * This is optional callback to be called by allocation policy when |
804 | | * it frees memory block. The factory may use this callback |
805 | | * for example to keep track of the total number of memory blocks |
806 | | * currently allocated by applications. |
807 | | * |
808 | | * @param factory The pool factory. |
809 | | * @param size Size freed. |
810 | | */ |
811 | | void (*on_block_free)(pj_pool_factory *factory, pj_size_t size); |
812 | | |
813 | | }; |
814 | | |
815 | | /** |
816 | | * This function is intended to be used by pool factory implementors. |
817 | | * @param factory Pool factory. |
818 | | * @param name Pool name. |
819 | | * @param initial_size Initial size. |
820 | | * @param increment_size Increment size. |
821 | | * @param alignment Pool alignment. |
822 | | * @param callback Callback. |
823 | | * @return The pool object, or NULL. |
824 | | */ |
825 | | PJ_DECL(pj_pool_t*) pj_pool_create_int( pj_pool_factory *factory, |
826 | | const char *name, |
827 | | pj_size_t initial_size, |
828 | | pj_size_t increment_size, |
829 | | pj_size_t alignment, |
830 | | pj_pool_callback *callback); |
831 | | |
832 | | /** |
833 | | * This function is intended to be used by pool factory implementors. |
834 | | * @param pool The pool. |
835 | | * @param name Pool name. |
836 | | * @param increment_size Increment size. |
837 | | * @param alignment Pool alignment. |
838 | | * @param callback Callback function. |
839 | | */ |
840 | | PJ_DECL(void) pj_pool_init_int( pj_pool_t *pool, |
841 | | const char *name, |
842 | | pj_size_t increment_size, |
843 | | pj_size_t alignment, |
844 | | pj_pool_callback *callback); |
845 | | |
846 | | /** |
847 | | * This function is intended to be used by pool factory implementors. |
848 | | * @param pool The memory pool. |
849 | | */ |
850 | | PJ_DECL(void) pj_pool_destroy_int( pj_pool_t *pool ); |
851 | | |
852 | | |
853 | | /** |
854 | | * Dump pool factory state. |
855 | | * @param pf The pool factory. |
856 | | * @param detail Detail state required. |
857 | | */ |
858 | | PJ_INLINE(void) pj_pool_factory_dump( pj_pool_factory *pf, |
859 | | pj_bool_t detail ) |
860 | 0 | { |
861 | 0 | (*pf->dump_status)(pf, detail); |
862 | 0 | } Unexecuted instantiation: fuzz-http.c:pj_pool_factory_dump Unexecuted instantiation: string.c:pj_pool_factory_dump Unexecuted instantiation: os_core_unix.c:pj_pool_factory_dump Unexecuted instantiation: ioqueue_select.c:pj_pool_factory_dump Unexecuted instantiation: pool_policy_malloc.c:pj_pool_factory_dump Unexecuted instantiation: activesock.c:pj_pool_factory_dump Unexecuted instantiation: lock.c:pj_pool_factory_dump Unexecuted instantiation: pool.c:pj_pool_factory_dump Unexecuted instantiation: pool_caching.c:pj_pool_factory_dump Unexecuted instantiation: sock_common.c:pj_pool_factory_dump Unexecuted instantiation: timer.c:pj_pool_factory_dump Unexecuted instantiation: pool_buf.c:pj_pool_factory_dump |
863 | | |
864 | | /** |
865 | | * @} // PJ_POOL_FACTORY |
866 | | */ |
867 | | |
868 | | /* **************************************************************************/ |
869 | | |
870 | | /** |
871 | | * @defgroup PJ_CACHING_POOL Caching Pool Factory |
872 | | * @ingroup PJ_POOL_GROUP |
873 | | * @brief |
874 | | * Caching pool is one sample implementation of pool factory where the |
875 | | * factory can reuse memory to create a pool. Application defines what the |
876 | | * maximum memory the factory can hold, and when a pool is released the |
877 | | * factory decides whether to destroy the pool or to keep it for future use. |
878 | | * If the total amount of memory in the internal cache is still within the |
879 | | * limit, the factory will keep the pool in the internal cache, otherwise the |
880 | | * pool will be destroyed, thus releasing the memory back to the system. |
881 | | * |
882 | | * @{ |
883 | | */ |
884 | | |
885 | | /** |
886 | | * Number of unique sizes, to be used as index to the free list. |
887 | | * Each pool in the free list is organized by it's size. |
888 | | */ |
889 | 21.2k | #define PJ_CACHING_POOL_ARRAY_SIZE 16 |
890 | | |
891 | | /** |
892 | | * Declaration for caching pool. Application doesn't normally need to |
893 | | * care about the contents of this struct, it is only provided here because |
894 | | * application need to define an instance of this struct (we can not allocate |
895 | | * the struct from a pool since there is no pool factory yet!). |
896 | | */ |
897 | | struct pj_caching_pool |
898 | | { |
899 | | /** Pool factory interface, must be declared first. */ |
900 | | pj_pool_factory factory; |
901 | | |
902 | | /** Current factory's capacity, i.e. number of bytes that are allocated |
903 | | * and available for application in this factory. The factory's |
904 | | * capacity represents the size of all pools kept by this factory |
905 | | * in it's free list, which will be returned to application when it |
906 | | * requests to create a new pool. |
907 | | */ |
908 | | pj_size_t capacity; |
909 | | |
910 | | /** Maximum size that can be held by this factory. Once the capacity |
911 | | * has exceeded @a max_capacity, further #pj_pool_release() will |
912 | | * flush the pool. If the capacity is still below the @a max_capacity, |
913 | | * #pj_pool_release() will save the pool to the factory's free list. |
914 | | */ |
915 | | pj_size_t max_capacity; |
916 | | |
917 | | /** |
918 | | * Number of pools currently held by applications. This number gets |
919 | | * incremented everytime #pj_pool_create() is called, and gets |
920 | | * decremented when #pj_pool_release() is called. |
921 | | */ |
922 | | pj_size_t used_count; |
923 | | |
924 | | /** |
925 | | * Total size of memory currently used by application. |
926 | | * |
927 | | * This field is deprecated. |
928 | | */ |
929 | | pj_size_t used_size; |
930 | | |
931 | | /** |
932 | | * The maximum size of memory used by application throughout the life |
933 | | * of the caching pool. |
934 | | * |
935 | | * This field is deprecated. |
936 | | */ |
937 | | pj_size_t peak_used_size; |
938 | | |
939 | | /** |
940 | | * Lists of pools in the cache, indexed by pool size. |
941 | | */ |
942 | | pj_list free_list[PJ_CACHING_POOL_ARRAY_SIZE]; |
943 | | |
944 | | /** |
945 | | * List of pools currently allocated by applications. |
946 | | */ |
947 | | pj_list used_list; |
948 | | |
949 | | /** |
950 | | * Internal pool. |
951 | | */ |
952 | | char pool_buf[256 * (sizeof(size_t) / 4)]; |
953 | | |
954 | | /** |
955 | | * Mutex. |
956 | | */ |
957 | | pj_lock_t *lock; |
958 | | }; |
959 | | |
960 | | |
961 | | |
962 | | /** |
963 | | * Initialize caching pool. |
964 | | * |
965 | | * @param ch_pool The caching pool factory to be initialized. |
966 | | * @param policy Pool factory policy. |
967 | | * @param max_capacity The total capacity to be retained in the cache. When |
968 | | * the pool is returned to the cache, it will be kept in |
969 | | * recycling list if the total capacity of pools in this |
970 | | * list plus the capacity of the pool is still below this |
971 | | * value. |
972 | | */ |
973 | | PJ_DECL(void) pj_caching_pool_init( pj_caching_pool *ch_pool, |
974 | | const pj_pool_factory_policy *policy, |
975 | | pj_size_t max_capacity); |
976 | | |
977 | | |
978 | | /** |
979 | | * Destroy caching pool, and release all the pools in the recycling list. |
980 | | * |
981 | | * @param ch_pool The caching pool. |
982 | | */ |
983 | | PJ_DECL(void) pj_caching_pool_destroy( pj_caching_pool *ch_pool ); |
984 | | |
985 | | /** |
986 | | * @} // PJ_CACHING_POOL |
987 | | */ |
988 | | |
989 | | # if PJ_FUNCTIONS_ARE_INLINED |
990 | | # include "pool_i.h" |
991 | | # endif |
992 | | |
993 | | PJ_END_DECL |
994 | | |
995 | | #endif /* __PJ_POOL_H__ */ |
996 | | |