|
HOME
SIP/media Features
High Performance SIP
Small Footprint SIP
Symbian Port
FAQ
Documentation
Licensing
Download
Development (Trac)
Projects using pjsip
Mailing List
Open Source Links
About: PJLIB, PJLIB-UTIL, PJSIP, and PJMEDIA are created by: Benny Prijono <bennylp pjsip.org>
|
|
Home --> Documentations --> PJLIB Reference
pool.hGo 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 #include <pj/list.h>
00021
00022
00023
00024
00025 #if PJ_HAS_POOL_ALT_API
00026 # include <pj/pool_alt.h>
00027 #endif
00028
00029
00030 #ifndef __PJ_POOL_H__
00031 #define __PJ_POOL_H__
00032
00038 PJ_BEGIN_DECL
00039
00293 typedef void pj_pool_callback(pj_pool_t *pool, pj_size_t size);
00294
00299 typedef struct pj_pool_block
00300 {
00301 PJ_DECL_LIST_MEMBER(struct pj_pool_block);
00302 unsigned char *buf;
00303 unsigned char *cur;
00304 unsigned char *end;
00305 } pj_pool_block;
00306
00307
00312 struct pj_pool_t
00313 {
00314 PJ_DECL_LIST_MEMBER(struct pj_pool_t);
00317 char obj_name[PJ_MAX_OBJ_NAME];
00318
00320 pj_pool_factory *factory;
00321
00323 void *factory_data;
00324
00326 pj_size_t capacity;
00327
00329 pj_size_t increment_size;
00330
00332 pj_pool_block block_list;
00333
00335 pj_pool_callback *callback;
00336
00337 };
00338
00339
00343 #define PJ_POOL_SIZE (sizeof(struct pj_pool_t))
00344
00348 #ifndef PJ_POOL_ALIGNMENT
00349 # define PJ_POOL_ALIGNMENT 4
00350 #endif
00351
00379 PJ_IDECL(pj_pool_t*) pj_pool_create(pj_pool_factory *factory,
00380 const char *name,
00381 pj_size_t initial_size,
00382 pj_size_t increment_size,
00383 pj_pool_callback *callback);
00384
00390 PJ_IDECL(void) pj_pool_release( pj_pool_t *pool );
00391
00399 PJ_IDECL(const char *) pj_pool_getobjname( const pj_pool_t *pool );
00400
00410 PJ_DECL(void) pj_pool_reset( pj_pool_t *pool );
00411
00412
00423 PJ_IDECL(pj_size_t) pj_pool_get_capacity( pj_pool_t *pool );
00424
00432 PJ_IDECL(pj_size_t) pj_pool_get_used_size( pj_pool_t *pool );
00433
00446 PJ_IDECL(void*) pj_pool_alloc( pj_pool_t *pool, pj_size_t size);
00447
00459 PJ_IDECL(void*) pj_pool_calloc( pj_pool_t *pool, pj_size_t count,
00460 pj_size_t elem);
00461
00462
00473 PJ_INLINE(void*) pj_pool_zalloc(pj_pool_t *pool, pj_size_t size)
00474 {
00475 return pj_pool_calloc(pool, 1, size);
00476 }
00477
00478
00490 #define PJ_POOL_ALLOC_T(pool,type) \
00491 ((type*)pj_pool_alloc(pool, sizeof(type)))
00492
00504 #define PJ_POOL_ZALLOC_T(pool,type) \
00505 ((type*)pj_pool_zalloc(pool, sizeof(type)))
00506
00507
00508
00509
00510 PJ_IDECL(void*) pj_pool_alloc_from_block(pj_pool_block *block, pj_size_t size);
00511 PJ_DECL(void*) pj_pool_allocate_find(pj_pool_t *pool, unsigned size);
00512
00513
00514
00519
00568
00569
00570
00571
00572
00573
00574
00575
00579 typedef struct pj_pool_factory_policy
00580 {
00590 void* (*block_alloc)(pj_pool_factory *factory, pj_size_t size);
00591
00599 void (*block_free)(pj_pool_factory *factory, void *mem, pj_size_t size);
00600
00604 pj_pool_callback *callback;
00605
00609 unsigned flags;
00610
00611 } pj_pool_factory_policy;
00612
00620 PJ_DECL_DATA(int) PJ_NO_MEMORY_EXCEPTION;
00621
00625 PJ_DECL(int) pj_NO_MEMORY_EXCEPTION(void);
00626
00636 PJ_DECL_DATA(pj_pool_factory_policy) pj_pool_factory_default_policy;
00637
00638
00644 PJ_DECL(const pj_pool_factory_policy*) pj_pool_factory_get_default_policy(void);
00645
00646
00650 struct pj_pool_factory
00651 {
00655 pj_pool_factory_policy policy;
00656
00681 pj_pool_t* (*create_pool)( pj_pool_factory *factory,
00682 const char *name,
00683 pj_size_t initial_size,
00684 pj_size_t increment_size,
00685 pj_pool_callback *callback);
00686
00693 void (*release_pool)( pj_pool_factory *factory, pj_pool_t *pool );
00694
00700 void (*dump_status)( pj_pool_factory *factory, pj_bool_t detail );
00701
00714 pj_bool_t (*on_block_alloc)(pj_pool_factory *factory, pj_size_t size);
00715
00725 void (*on_block_free)(pj_pool_factory *factory, pj_size_t size);
00726
00727 };
00728
00738 PJ_DECL(pj_pool_t*) pj_pool_create_int( pj_pool_factory *factory,
00739 const char *name,
00740 pj_size_t initial_size,
00741 pj_size_t increment_size,
00742 pj_pool_callback *callback);
00743
00751 PJ_DECL(void) pj_pool_init_int( pj_pool_t *pool,
00752 const char *name,
00753 pj_size_t increment_size,
00754 pj_pool_callback *callback);
00755
00760 PJ_DECL(void) pj_pool_destroy_int( pj_pool_t *pool );
00761
00762
00768 PJ_INLINE(void) pj_pool_factory_dump( pj_pool_factory *pf,
00769 pj_bool_t detail )
00770 {
00771 (*pf->dump_status)(pf, detail);
00772 }
00773
00778
00779
00799 #define PJ_CACHING_POOL_ARRAY_SIZE 16
00800
00807 struct pj_caching_pool
00808 {
00810 pj_pool_factory factory;
00811
00818 pj_size_t capacity;
00819
00825 pj_size_t max_capacity;
00826
00832 pj_size_t used_count;
00833
00837 pj_size_t used_size;
00838
00843 pj_size_t peak_used_size;
00844
00848 pj_list free_list[PJ_CACHING_POOL_ARRAY_SIZE];
00849
00853 pj_list used_list;
00854
00858 char pool_buf[256 * (sizeof(long) / 4)];
00859
00863 pj_lock_t *lock;
00864 };
00865
00866
00867
00879 PJ_DECL(void) pj_caching_pool_init( pj_caching_pool *ch_pool,
00880 const pj_pool_factory_policy *policy,
00881 pj_size_t max_capacity);
00882
00883
00889 PJ_DECL(void) pj_caching_pool_destroy( pj_caching_pool *ch_pool );
00890
00895 # if PJ_FUNCTIONS_ARE_INLINED
00896 # include "pool_i.h"
00897 # endif
00898
00899 PJ_END_DECL
00900
00901 #endif
00902
PJLIB Open Source, high performance, small footprint, and very very portable framework
(C)2001-2008 Benny Prijono
|
|