ウォンツテック

そでやまのーと

/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