Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <pj/list.h>
00022
00023
00024
00025
00026 #if PJ_HAS_POOL_ALT_API
00027 # include <pj/pool_alt.h>
00028 #endif
00029
00030
00031 #ifndef __PJ_POOL_H__
00032 #define __PJ_POOL_H__
00033
00039 PJ_BEGIN_DECL
00040
00294 typedef void pj_pool_callback(pj_pool_t *pool, pj_size_t size);
00295
00300 typedef struct pj_pool_block
00301 {
00302 PJ_DECL_LIST_MEMBER(struct pj_pool_block);
00303 unsigned char *buf;
00304 unsigned char *cur;
00305 unsigned char *end;
00306 } pj_pool_block;
00307
00308
00313 struct pj_pool_t
00314 {
00315 PJ_DECL_LIST_MEMBER(struct pj_pool_t);
00318 char obj_name[PJ_MAX_OBJ_NAME];
00319
00321 pj_pool_factory *factory;
00322
00324 void *factory_data;
00325
00327 pj_size_t capacity;
00328
00330 pj_size_t increment_size;
00331
00333 pj_pool_block block_list;
00334
00336 pj_pool_callback *callback;
00337
00338 };
00339
00340
00344 #define PJ_POOL_SIZE (sizeof(struct pj_pool_t))
00345
00349 #ifndef PJ_POOL_ALIGNMENT
00350 # define PJ_POOL_ALIGNMENT 4
00351 #endif
00352
00380 PJ_IDECL(pj_pool_t*) pj_pool_create(pj_pool_factory *factory,
00381 const char *name,
00382 pj_size_t initial_size,
00383 pj_size_t increment_size,
00384 pj_pool_callback *callback);
00385
00391 PJ_IDECL(void) pj_pool_release( pj_pool_t *pool );
00392
00400 PJ_IDECL(const char *) pj_pool_getobjname( const pj_pool_t *pool );
00401
00411 PJ_DECL(void) pj_pool_reset( pj_pool_t *pool );
00412
00413
00424 PJ_IDECL(pj_size_t) pj_pool_get_capacity( pj_pool_t *pool );
00425
00433 PJ_IDECL(pj_size_t) pj_pool_get_used_size( pj_pool_t *pool );
00434
00447 PJ_IDECL(void*) pj_pool_alloc( pj_pool_t *pool, pj_size_t size);
00448
00460 PJ_IDECL(void*) pj_pool_calloc( pj_pool_t *pool, pj_size_t count,
00461 pj_size_t elem);
00462
00463
00474 PJ_INLINE(void*) pj_pool_zalloc(pj_pool_t *pool, pj_size_t size)
00475 {
00476 return pj_pool_calloc(pool, 1, size);
00477 }
00478
00479
00491 #define PJ_POOL_ALLOC_T(pool,type) \
00492 ((type*)pj_pool_alloc(pool, sizeof(type)))
00493
00505 #define PJ_POOL_ZALLOC_T(pool,type) \
00506 ((type*)pj_pool_zalloc(pool, sizeof(type)))
00507
00508
00509
00510
00511 PJ_IDECL(void*) pj_pool_alloc_from_block(pj_pool_block *block, pj_size_t size);
00512 PJ_DECL(void*) pj_pool_allocate_find(pj_pool_t *pool, pj_size_t size);
00513
00514
00515
00520
00569
00570
00571
00572
00573
00574
00575
00576
00580 typedef struct pj_pool_factory_policy
00581 {
00591 void* (*block_alloc)(pj_pool_factory *factory, pj_size_t size);
00592
00600 void (*block_free)(pj_pool_factory *factory, void *mem, pj_size_t size);
00601
00605 pj_pool_callback *callback;
00606
00610 unsigned flags;
00611
00612 } pj_pool_factory_policy;
00613
00621 PJ_DECL_DATA(int) PJ_NO_MEMORY_EXCEPTION;
00622
00626 PJ_DECL(int) pj_NO_MEMORY_EXCEPTION(void);
00627
00637 PJ_DECL_DATA(pj_pool_factory_policy) pj_pool_factory_default_policy;
00638
00639
00645 PJ_DECL(const pj_pool_factory_policy*) pj_pool_factory_get_default_policy(void);
00646
00647
00651 struct pj_pool_factory
00652 {
00656 pj_pool_factory_policy policy;
00657
00682 pj_pool_t* (*create_pool)( pj_pool_factory *factory,
00683 const char *name,
00684 pj_size_t initial_size,
00685 pj_size_t increment_size,
00686 pj_pool_callback *callback);
00687
00694 void (*release_pool)( pj_pool_factory *factory, pj_pool_t *pool );
00695
00701 void (*dump_status)( pj_pool_factory *factory, pj_bool_t detail );
00702
00715 pj_bool_t (*on_block_alloc)(pj_pool_factory *factory, pj_size_t size);
00716
00726 void (*on_block_free)(pj_pool_factory *factory, pj_size_t size);
00727
00728 };
00729
00739 PJ_DECL(pj_pool_t*) pj_pool_create_int( pj_pool_factory *factory,
00740 const char *name,
00741 pj_size_t initial_size,
00742 pj_size_t increment_size,
00743 pj_pool_callback *callback);
00744
00752 PJ_DECL(void) pj_pool_init_int( pj_pool_t *pool,
00753 const char *name,
00754 pj_size_t increment_size,
00755 pj_pool_callback *callback);
00756
00761 PJ_DECL(void) pj_pool_destroy_int( pj_pool_t *pool );
00762
00763
00769 PJ_INLINE(void) pj_pool_factory_dump( pj_pool_factory *pf,
00770 pj_bool_t detail )
00771 {
00772 (*pf->dump_status)(pf, detail);
00773 }
00774
00779
00780
00800 #define PJ_CACHING_POOL_ARRAY_SIZE 16
00801
00808 struct pj_caching_pool
00809 {
00811 pj_pool_factory factory;
00812
00819 pj_size_t capacity;
00820
00826 pj_size_t max_capacity;
00827
00833 pj_size_t used_count;
00834
00838 pj_size_t used_size;
00839
00844 pj_size_t peak_used_size;
00845
00849 pj_list free_list[PJ_CACHING_POOL_ARRAY_SIZE];
00850
00854 pj_list used_list;
00855
00859 char pool_buf[256 * (sizeof(long) / 4)];
00860
00864 pj_lock_t *lock;
00865 };
00866
00867
00868
00880 PJ_DECL(void) pj_caching_pool_init( pj_caching_pool *ch_pool,
00881 const pj_pool_factory_policy *policy,
00882 pj_size_t max_capacity);
00883
00884
00890 PJ_DECL(void) pj_caching_pool_destroy( pj_caching_pool *ch_pool );
00891
00896 # if PJ_FUNCTIONS_ARE_INLINED
00897 # include "pool_i.h"
00898 # endif
00899
00900 PJ_END_DECL
00901
00902 #endif
00903