■
/srclib/apr-util/include/apr_buckets.h
からbucket操作関数の概要
メモリ確保開放用関数
APU_DECLARE_NONSTD(apr_bucket_alloc_t *) apr_bucket_alloc_create(apr_pool_t *p); APU_DECLARE_NONSTD(void) apr_bucket_alloc_destroy(apr_bucket_alloc_t *list); APU_DECLARE_NONSTD(void *) apr_bucket_alloc(apr_size_t size, apr_bucket_alloc_t *list); APU_DECLARE_NONSTD(void) apr_bucket_free(void *block);
操作関数
#define apr_bucket_destroy(e) do { \ (e)->type->destroy((e)->data); \ (e)->free(e); \ } while (0) #define apr_bucket_delete(e) do { \ APR_BUCKET_REMOVE(e); \ apr_bucket_destroy(e); \ } while (0) bucketの削除関数APR_BUCKET_REMOVEは以下のようになっている #define APR_BUCKET_REMOVE(e) APR_RING_REMOVE((e), link) これはbucket「e」が連結されているbrigadeから「e」を削除してその後そのメモリを開放している
apr_bucket_type_tに登録されている4つの関数の呼び出し
#define apr_bucket_read(e,str,len,block) (e)->type->read(e, str, len, block) #define apr_bucket_setaside(e,p) (e)->type->setaside(e,p) #define apr_bucket_split(e,point) (e)->type->split(e, point) #define apr_bucket_copy(e,c) (e)->type->copy(e, c) e->typeはstruct apr_bucket_type_tでread、setaside、split、copyはそこに登録されている関数ポインタ。
setaside、copy、splitといった関数が実装されているかのチェック(apr_bucket_xxx_notimpl)(ただAPR_ENOTIMPLを返す)をする。
APU_DECLARE_NONSTD(apr_status_t) apr_bucket_setaside_noop(apr_bucket *data, apr_pool_t *pool); APU_DECLARE_NONSTD(apr_status_t) apr_bucket_setaside_notimpl(apr_bucket *data, apr_pool_t *pool); APU_DECLARE_NONSTD(apr_status_t) apr_bucket_copy_notimpl(apr_bucket *e, apr_bucket **c); APU_DECLARE_NONSTD(void) apr_bucket_destroy_noop(void *data);
apr_bucket_destroy_notimplとapr_bucket_read_notimplは無い。実装を要求されてるので。
bucket typeの種類
extern const apr_bucket_type_t apr_bucket_type_flush extern const apr_bucket_type_t apr_bucket_type_eos; extern const apr_bucket_type_t apr_bucket_type_file; extern const apr_bucket_type_t apr_bucket_type_heap; extern const apr_bucket_type_t apr_bucket_type_mmap; extern const apr_bucket_type_t apr_bucket_type_pool; extern const apr_bucket_type_t apr_bucket_type_pipe; extern const apr_bucket_type_t apr_bucket_type_immortal; extern const apr_bucket_type_t apr_bucket_type_transient; extern const apr_bucket_type_t apr_bucket_type_socket;
simple bucket
APU_DECLARE_NONSTD(apr_status_t) apr_bucket_simple_split(apr_bucket *b, apr_size_t point); APU_DECLARE_NONSTD(apr_status_t) apr_bucket_simple_copy(apr_bucket *a, apr_bucket **b);
その他
apr_bucket_xxx_create
apr_bucket_xxx_make
などの関数群が用意されている
xxxはeos,immortal,transient,flush,heap,pool,mmap,socket,file