Apache HTTPD
Classes | Macros | Typedefs | Enumerations | Functions | Variables
Bucket Brigades

Classes

struct  apr_bucket_type_t
 
struct  apr_bucket
 
struct  apr_bucket_brigade
 
struct  apr_bucket_refcount
 
struct  apr_bucket_heap
 
struct  apr_bucket_pool
 
struct  apr_bucket_file
 
union  apr_bucket_structs
 

Macros

#define APR_BUCKET_BUFF_SIZE   8000
 
#define APR_BRIGADE_CHECK_CONSISTENCY(b)
 
#define APR_BUCKET_CHECK_CONSISTENCY(e)
 
#define APR_BRIGADE_SENTINEL(b)   APR_RING_SENTINEL(&(b)->list, apr_bucket, link)
 
#define APR_BRIGADE_EMPTY(b)   APR_RING_EMPTY(&(b)->list, apr_bucket, link)
 
#define APR_BRIGADE_FIRST(b)   APR_RING_FIRST(&(b)->list)
 
#define APR_BRIGADE_LAST(b)   APR_RING_LAST(&(b)->list)
 
#define APR_BRIGADE_INSERT_HEAD(b, e)
 
#define APR_BRIGADE_INSERT_TAIL(b, e)
 
#define APR_BRIGADE_CONCAT(a, b)
 
#define APR_BRIGADE_PREPEND(a, b)
 
#define APR_BUCKET_INSERT_BEFORE(a, b)
 
#define APR_BUCKET_INSERT_AFTER(a, b)
 
#define APR_BUCKET_NEXT(e)   APR_RING_NEXT((e), link)
 
#define APR_BUCKET_PREV(e)   APR_RING_PREV((e), link)
 
#define APR_BUCKET_REMOVE(e)   APR_RING_REMOVE((e), link)
 
#define APR_BUCKET_INIT(e)   APR_RING_ELEM_INIT((e), link)
 
#define APR_BUCKET_IS_METADATA(e)   ((e)->type->is_metadata)
 
#define APR_BUCKET_IS_FLUSH(e)   ((e)->type == &apr_bucket_type_flush)
 
#define APR_BUCKET_IS_EOS(e)   ((e)->type == &apr_bucket_type_eos)
 
#define APR_BUCKET_IS_FILE(e)   ((e)->type == &apr_bucket_type_file)
 
#define APR_BUCKET_IS_PIPE(e)   ((e)->type == &apr_bucket_type_pipe)
 
#define APR_BUCKET_IS_SOCKET(e)   ((e)->type == &apr_bucket_type_socket)
 
#define APR_BUCKET_IS_HEAP(e)   ((e)->type == &apr_bucket_type_heap)
 
#define APR_BUCKET_IS_TRANSIENT(e)   ((e)->type == &apr_bucket_type_transient)
 
#define APR_BUCKET_IS_IMMORTAL(e)   ((e)->type == &apr_bucket_type_immortal)
 
#define APR_BUCKET_IS_POOL(e)   ((e)->type == &apr_bucket_type_pool)
 
#define APR_BUCKET_ALLOC_SIZE   APR_ALIGN_DEFAULT(2*sizeof(apr_bucket_structs))
 
#define apr_bucket_destroy(e)
 
#define apr_bucket_delete(e)
 
#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)
 

Typedefs

typedef struct apr_bucket_brigade apr_bucket_brigade
 
typedef struct apr_bucket apr_bucket
 
typedef struct apr_bucket_alloc_t apr_bucket_alloc_t
 
typedef struct apr_bucket_type_t apr_bucket_type_t
 
typedef apr_status_t(* apr_brigade_flush) (apr_bucket_brigade *bb, void *ctx)
 
typedef struct apr_bucket_refcount apr_bucket_refcount
 
typedef struct apr_bucket_heap apr_bucket_heap
 
typedef struct apr_bucket_pool apr_bucket_pool
 
typedef struct apr_bucket_file apr_bucket_file
 
typedef union apr_bucket_structs apr_bucket_structs
 

Enumerations

enum  apr_read_type_e { APR_BLOCK_READ , APR_NONBLOCK_READ }
 

Functions

 APU_DECLARE (apr_bucket_brigade *) apr_brigade_create(apr_pool_t *p
 
 APU_DECLARE (apr_status_t) apr_brigade_destroy(apr_bucket_brigade *b)
 
 APU_DECLARE_NONSTD (apr_status_t) apr_brigade_putstrs(apr_bucket_brigade *b
 
apr_brigade_flush void apr_brigade_flush void const char __attribute__ ((format(printf, 4, 5)))
 
 APU_DECLARE (apr_bucket *) apr_brigade_insert_file(apr_bucket_brigade *bb
 
 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 (apr_size_t) apr_bucket_alloc_aligned_floor(apr_bucket_alloc_t *list
 
apr_size_t size __attribute__ ((nonnull(1)))
 
 APU_DECLARE_NONSTD (void *) apr_bucket_alloc(apr_size_t size
 

Variables

apr_bucket_alloc_tlist
 
apr_buckete
 
apr_bucket apr_bucket_brigadea
 
apr_off_t point
 
apr_off_t apr_bucket ** after_point
 
int read_all
 
int apr_off_tlength
 
charc
 
char apr_size_tlen
 
char apr_size_t apr_pool_tpool
 
apr_bucket_brigadebbIn
 
apr_bucket_brigade apr_read_type_e block
 
apr_bucket_brigade apr_read_type_e apr_off_t maxbytes
 
struct iovecvec
 
struct iovec intnvec
 
apr_brigade_flush flush
 
apr_brigade_flush void * ctx
 
apr_brigade_flush void va_list va
 
apr_brigade_flush void const charstr
 
apr_brigade_flush void const char apr_size_t nbyte
 
apr_brigade_flush void apr_brigade_flush void const charfmt
 
apr_file_tf
 
apr_file_t apr_off_t start
 
apr_file_t apr_off_t apr_off_t apr_pool_tp
 
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_flush
 
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_eos
 
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_file
 
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_heap
 
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_pool
 
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_pipe
 
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_immortal
 
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_transient
 
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_socket
 
apr_bucket ** b
 
void * data
 
const charbuf
 
apr_size_t void(* free_func )(void *data)
 
apr_socket_tthissock
 
apr_file_tthispipe
 
apr_off_t offset
 
apr_file_tfd
 
int enabled
 
apr_size_t size
 

Detailed Description

Macro Definition Documentation

◆ APR_BRIGADE_CHECK_CONSISTENCY

#define APR_BRIGADE_CHECK_CONSISTENCY (   b)

checks the ring pointers in a bucket brigade for consistency. an abort() will be triggered if any inconsistencies are found. note: this is a no-op unless APR_BUCKET_DEBUG is defined.

Parameters
bThe brigade

Definition at line 304 of file apr_buckets.h.

◆ APR_BRIGADE_CONCAT

#define APR_BRIGADE_CONCAT (   a,
  b 
)
Value:
do { \
} while (0)
apr_size_t size
apr_bucket ** b
apr_bucket apr_bucket_brigade * a
apr_bucket_alloc_t * list

Concatenate brigade b onto the end of brigade a, leaving brigade b empty

Parameters
aThe first brigade
bThe second brigade

Definition at line 380 of file apr_buckets.h.

◆ APR_BRIGADE_EMPTY

#define APR_BRIGADE_EMPTY (   b)    APR_RING_EMPTY(&(b)->list, apr_bucket, link)

Determine if the bucket brigade is empty

Parameters
bThe brigade to check
Returns
true or false

Definition at line 338 of file apr_buckets.h.

◆ APR_BRIGADE_FIRST

#define APR_BRIGADE_FIRST (   b)    APR_RING_FIRST(&(b)->list)

Return the first bucket in a brigade

Parameters
bThe brigade to query
Returns
The first bucket in the brigade

Definition at line 345 of file apr_buckets.h.

◆ APR_BRIGADE_INSERT_HEAD

#define APR_BRIGADE_INSERT_HEAD (   b,
  e 
)
Value:
do { \
} while (0)
apr_bucket * e

Insert a single bucket at the front of a brigade

Parameters
bThe brigade to add to
eThe bucket to insert

Definition at line 358 of file apr_buckets.h.

◆ APR_BRIGADE_INSERT_TAIL

#define APR_BRIGADE_INSERT_TAIL (   b,
  e 
)
Value:

Insert a single bucket at the end of a brigade

Parameters
bThe brigade to add to
eThe bucket to insert

Definition at line 369 of file apr_buckets.h.

◆ APR_BRIGADE_LAST

#define APR_BRIGADE_LAST (   b)    APR_RING_LAST(&(b)->list)

Return the last bucket in a brigade

Parameters
bThe brigade to query
Returns
The last bucket in the brigade

Definition at line 351 of file apr_buckets.h.

◆ APR_BRIGADE_PREPEND

#define APR_BRIGADE_PREPEND (   a,
  b 
)
Value:
do { \
} while (0)

Prepend brigade b onto the beginning of brigade a, leaving brigade b empty

Parameters
aThe first brigade
bThe second brigade

Definition at line 390 of file apr_buckets.h.

◆ APR_BRIGADE_SENTINEL

#define APR_BRIGADE_SENTINEL (   b)    APR_RING_SENTINEL(&(b)->list, apr_bucket, link)

Wrappers around the RING macros to reduce the verbosity of the code that handles bucket brigades. The magic pointer value that indicates the head of the brigade

Remarks
This is used to find the beginning and end of the brigade, eg:
     while (e != APR_BRIGADE_SENTINEL(b)) {
         ...
         e = APR_BUCKET_NEXT(e);
     }
Parameters
bThe brigade
Returns
The magic pointer value

Definition at line 331 of file apr_buckets.h.

◆ APR_BUCKET_ALLOC_SIZE

#define APR_BUCKET_ALLOC_SIZE   APR_ALIGN_DEFAULT(2*sizeof(apr_bucket_structs))

The amount that apr_bucket_alloc() should allocate in the common case. Note: this is twice as big as apr_bucket_structs to allow breathing room for third-party bucket types.

Definition at line 650 of file apr_buckets.h.

◆ APR_BUCKET_BUFF_SIZE

#define APR_BUCKET_BUFF_SIZE   8000

default bucket buffer size - 8KB minus room for memory allocator headers

Definition at line 54 of file apr_buckets.h.

◆ APR_BUCKET_CHECK_CONSISTENCY

#define APR_BUCKET_CHECK_CONSISTENCY (   e)

checks the brigade a bucket is in for ring consistency. an abort() will be triggered if any inconsistencies are found. note: this is a no-op unless APR_BUCKET_DEBUG is defined.

Parameters
eThe bucket

Definition at line 311 of file apr_buckets.h.

◆ apr_bucket_copy

#define apr_bucket_copy (   e,
  c 
)    (e)->type->copy(e, c)

Copy a bucket.

Parameters
eThe bucket to copy
cReturns a pointer to the new bucket

Definition at line 1116 of file apr_buckets.h.

◆ apr_bucket_delete

#define apr_bucket_delete (   e)
Value:

Delete a bucket by removing it from its brigade (if any) and then destroying it.

Remarks
This mainly acts as an aid in avoiding code verbosity. It is the preferred exact equivalent to:
     APR_BUCKET_REMOVE(e);
     apr_bucket_destroy(e);
Parameters
eThe bucket to delete

Definition at line 1016 of file apr_buckets.h.

◆ apr_bucket_destroy

#define apr_bucket_destroy (   e)
Value:
do { \
apr__d->type->destroy(apr__d->data); \
apr__d->free(apr__d); \
} while (0)
void(* destroy)(void *data)
const apr_bucket_type_t * type

Free the resources used by a bucket. If multiple buckets refer to the same resource it is freed when the last one goes away.

See also
apr_bucket_delete()
Parameters
eThe bucket to destroy

Definition at line 999 of file apr_buckets.h.

◆ APR_BUCKET_INIT

#define APR_BUCKET_INIT (   e)    APR_RING_ELEM_INIT((e), link)

Initialize a new bucket's prev/next pointers

Parameters
eThe bucket to initialize

Definition at line 440 of file apr_buckets.h.

◆ APR_BUCKET_INSERT_AFTER

#define APR_BUCKET_INSERT_AFTER (   a,
  b 
)
Value:

Insert a single bucket after a specified bucket

Parameters
aThe bucket to insert after
bThe bucket to insert

Definition at line 411 of file apr_buckets.h.

◆ APR_BUCKET_INSERT_BEFORE

#define APR_BUCKET_INSERT_BEFORE (   a,
  b 
)
Value:

Insert a single bucket before a specified bucket

Parameters
aThe bucket to insert before
bThe bucket to insert

Definition at line 400 of file apr_buckets.h.

◆ APR_BUCKET_IS_EOS

#define APR_BUCKET_IS_EOS (   e)    ((e)->type == &apr_bucket_type_eos)

Determine if a bucket is an EOS bucket

Parameters
eThe bucket to inspect
Returns
true or false

Definition at line 461 of file apr_buckets.h.

◆ APR_BUCKET_IS_FILE

#define APR_BUCKET_IS_FILE (   e)    ((e)->type == &apr_bucket_type_file)

Determine if a bucket is a FILE bucket

Parameters
eThe bucket to inspect
Returns
true or false

Definition at line 467 of file apr_buckets.h.

◆ APR_BUCKET_IS_FLUSH

#define APR_BUCKET_IS_FLUSH (   e)    ((e)->type == &apr_bucket_type_flush)

Determine if a bucket is a FLUSH bucket

Parameters
eThe bucket to inspect
Returns
true or false

Definition at line 455 of file apr_buckets.h.

◆ APR_BUCKET_IS_HEAP

#define APR_BUCKET_IS_HEAP (   e)    ((e)->type == &apr_bucket_type_heap)

Determine if a bucket is a HEAP bucket

Parameters
eThe bucket to inspect
Returns
true or false

Definition at line 485 of file apr_buckets.h.

◆ APR_BUCKET_IS_IMMORTAL

#define APR_BUCKET_IS_IMMORTAL (   e)    ((e)->type == &apr_bucket_type_immortal)

Determine if a bucket is a IMMORTAL bucket

Parameters
eThe bucket to inspect
Returns
true or false

Definition at line 497 of file apr_buckets.h.

◆ APR_BUCKET_IS_METADATA

#define APR_BUCKET_IS_METADATA (   e)    ((e)->type->is_metadata)

Determine if a bucket contains metadata. An empty bucket is safe to arbitrarily remove if and only if this is false.

Parameters
eThe bucket to inspect
Returns
true or false

Definition at line 448 of file apr_buckets.h.

◆ APR_BUCKET_IS_PIPE

#define APR_BUCKET_IS_PIPE (   e)    ((e)->type == &apr_bucket_type_pipe)

Determine if a bucket is a PIPE bucket

Parameters
eThe bucket to inspect
Returns
true or false

Definition at line 473 of file apr_buckets.h.

◆ APR_BUCKET_IS_POOL

#define APR_BUCKET_IS_POOL (   e)    ((e)->type == &apr_bucket_type_pool)

Determine if a bucket is a POOL bucket

Parameters
eThe bucket to inspect
Returns
true or false

Definition at line 511 of file apr_buckets.h.

◆ APR_BUCKET_IS_SOCKET

#define APR_BUCKET_IS_SOCKET (   e)    ((e)->type == &apr_bucket_type_socket)

Determine if a bucket is a SOCKET bucket

Parameters
eThe bucket to inspect
Returns
true or false

Definition at line 479 of file apr_buckets.h.

◆ APR_BUCKET_IS_TRANSIENT

#define APR_BUCKET_IS_TRANSIENT (   e)    ((e)->type == &apr_bucket_type_transient)

Determine if a bucket is a TRANSIENT bucket

Parameters
eThe bucket to inspect
Returns
true or false

Definition at line 491 of file apr_buckets.h.

◆ APR_BUCKET_NEXT

#define APR_BUCKET_NEXT (   e)    APR_RING_NEXT((e), link)

Get the next bucket in the list

Parameters
eThe current bucket
Returns
The next bucket

Definition at line 422 of file apr_buckets.h.

◆ APR_BUCKET_PREV

#define APR_BUCKET_PREV (   e)    APR_RING_PREV((e), link)

Get the previous bucket in the list

Parameters
eThe current bucket
Returns
The previous bucket

Definition at line 428 of file apr_buckets.h.

◆ apr_bucket_read

#define apr_bucket_read (   e,
  str,
  len,
  block 
)    (e)->type->read(e, str, len, block)

Read some data from the bucket.

The apr_bucket_read function returns a convenient amount of data from the bucket provided, writing the address and length of the data to the pointers provided by the caller. The function tries as hard as possible to avoid a memory copy.

Buckets are expected to be a member of a brigade at the time they are read.

In typical application code, buckets are read in a loop, and after each bucket is read and processed, it is moved or deleted from the brigade and the next bucket read.

The definition of "convenient" depends on the type of bucket that is being read, and is decided by APR. In the case of memory based buckets such as heap and immortal buckets, a pointer will be returned to the location of the buffer containing the complete contents of the bucket.

Some buckets, such as the socket bucket, might have no concept of length. If an attempt is made to read such a bucket, the apr_bucket_read function will read a convenient amount of data from the socket. The socket bucket is magically morphed into a heap bucket containing the just-read data, and a new socket bucket is inserted just after this heap bucket.

To understand why apr_bucket_read might do this, consider the loop described above to read and process buckets. The current bucket is magically morphed into a heap bucket and returned to the caller. The caller processes the data, and deletes the heap bucket, moving onto the next bucket, the new socket bucket. This process repeats, giving the illusion of a bucket brigade that contains potentially infinite amounts of data. It is up to the caller to decide at what point to stop reading buckets.

Some buckets, such as the file bucket, might have a fixed size, but be significantly larger than is practical to store in RAM in one go. As with the socket bucket, if an attempt is made to read from a file bucket, the file bucket is magically morphed into a heap bucket containing a convenient amount of data read from the current offset in the file. During the read, the offset will be moved forward on the file, and a new file bucket will be inserted directly after the current bucket representing the remainder of the file. If the heap bucket was large enough to store the whole remainder of the file, no more file buckets are inserted, and the file bucket will disappear completely.

The pattern for reading buckets described above does create the illusion that the code is willing to swallow buckets that might be too large for the system to handle in one go. This however is just an illusion: APR will always ensure that large (file) or infinite (socket) buckets are broken into convenient bite sized heap buckets before data is returned to the caller.

There is a potential gotcha to watch for: if buckets are read in a loop, and aren't deleted after being processed, the potentially large bucket will slowly be converted into RAM resident heap buckets. If the file is larger than available RAM, an out of memory condition could be caused if the application is not careful to manage this.

Parameters
eThe bucket to read from
strThe location to store a pointer to the data in
lenThe location to store the amount of data read
blockWhether the read function blocks

Definition at line 1089 of file apr_buckets.h.

◆ APR_BUCKET_REMOVE

#define APR_BUCKET_REMOVE (   e)    APR_RING_REMOVE((e), link)

Remove a bucket from its bucket brigade

Parameters
eThe bucket to remove

Definition at line 434 of file apr_buckets.h.

◆ apr_bucket_setaside

#define apr_bucket_setaside (   e,
  p 
)    (e)->type->setaside(e,p)

Setaside data so that stack data is not destroyed on returning from the function

Parameters
eThe bucket to setaside
pThe pool to setaside into

Definition at line 1097 of file apr_buckets.h.

◆ apr_bucket_split

#define apr_bucket_split (   e,
  point 
)    (e)->type->split(e, point)

Split one bucket in two at the point provided.

Once split, the original bucket becomes the first of the two new buckets.

(It is assumed that the bucket is a member of a brigade when this function is called).

Parameters
eThe bucket to split
pointThe offset to split the bucket at

Definition at line 1109 of file apr_buckets.h.

Typedef Documentation

◆ apr_brigade_flush

typedef apr_status_t(* apr_brigade_flush) (apr_bucket_brigade *bb, void *ctx)

Function called when a brigade should be flushed

Definition at line 282 of file apr_buckets.h.

◆ apr_bucket

See also
apr_bucket

Definition at line 121 of file apr_buckets.h.

◆ apr_bucket_alloc_t

See also
apr_bucket_alloc_t

Definition at line 123 of file apr_buckets.h.

◆ apr_bucket_brigade

The one-sentence buzzword-laden overview: Bucket brigades represent a complex data stream that can be passed through a layered IO system without unnecessary copying. A longer overview follows...

A bucket brigade is a doubly linked list (ring) of buckets, so we aren't limited to inserting at the front and removing at the end. Buckets are only passed around as members of a brigade, although singleton buckets can occur for short periods of time.

Buckets are data stores of various types. They can refer to data in memory, or part of a file or mmap area, or the output of a process, etc. Buckets also have some type-dependent accessor functions: read, split, copy, setaside, and destroy.

read returns the address and size of the data in the bucket. If the data isn't in memory then it is read in and the bucket changes type so that it can refer to the new location of the data. If all the data doesn't fit in the bucket then a new bucket is inserted into the brigade to hold the rest of it.

split divides the data in a bucket into two regions. After a split the original bucket refers to the first part of the data and a new bucket inserted into the brigade after the original bucket refers to the second part of the data. Reference counts are maintained as necessary.

setaside ensures that the data in the bucket has a long enough lifetime. Sometimes it is convenient to create a bucket referring to data on the stack in the expectation that it will be consumed (output to the network) before the stack is unwound. If that expectation turns out not to be valid, the setaside function is called to move the data somewhere safer.

copy makes a duplicate of the bucket structure as long as it's possible to have multiple references to a single copy of the data itself. Not all bucket types can be copied.

destroy maintains the reference counts on the resources used by a bucket and frees them if necessary.

Note: all of the above functions have wrapper macros (apr_bucket_read(), apr_bucket_destroy(), etc), and those macros should be used rather than using the function pointers directly.

To write a bucket brigade, they are first made into an iovec, so that we don't write too little data at one time. Currently we ignore compacting the buckets into as few buckets as possible, but if we really want good performance, then we need to compact the buckets before we convert to an iovec, or possibly while we are converting to an iovec.

See also
apr_bucket_brigade

Definition at line 119 of file apr_buckets.h.

◆ apr_bucket_file

See also
apr_bucket_file

Definition at line 608 of file apr_buckets.h.

◆ apr_bucket_heap

See also
apr_bucket_heap

Definition at line 539 of file apr_buckets.h.

◆ apr_bucket_pool

See also
apr_bucket_pool

Definition at line 557 of file apr_buckets.h.

◆ apr_bucket_refcount

See also
apr_bucket_refcount

Definition at line 524 of file apr_buckets.h.

◆ apr_bucket_structs

See also
apr_bucket_structs

Definition at line 630 of file apr_buckets.h.

◆ apr_bucket_type_t

See also
apr_bucket_type_t

Definition at line 126 of file apr_buckets.h.

Enumeration Type Documentation

◆ apr_read_type_e

Determines how a bucket or brigade should be read

Enumerator
APR_BLOCK_READ 

block until data becomes available

APR_NONBLOCK_READ 

return immediately if no data is available

Definition at line 57 of file apr_buckets.h.

Function Documentation

◆ __attribute__() [1/2]

apr_brigade_flush void apr_brigade_flush void const char __attribute__ ( (format(printf, 4, 5))  )

◆ __attribute__() [2/2]

apr_size_t size __attribute__ ( (nonnull(1))  )

◆ APU_DECLARE() [1/3]

APU_DECLARE ( apr_bucket )

Utility function to insert a file (or a segment of a file) onto the end of the brigade. The file is split into multiple buckets if it is larger than the maximum size which can be represented by a single bucket.

Parameters
bbthe brigade to insert into
fthe file to insert
startthe offset of the start of the segment
lenthe length of the segment of the file to insert
ppool from which file buckets are allocated
Returns
the last bucket inserted

Initialize a bucket containing reference-counted data that may be shared. The caller must allocate the bucket if necessary and initialize its type-dependent fields, and allocate and initialize its own private data structure. This function should only be called by type-specific bucket creation functions.

Parameters
bThe bucket to initialize
dataA pointer to the private data structure with the reference count at the start
startThe start of the data in the bucket relative to the private base pointer
lengthThe length of the data in the bucket
Returns
The new bucket, or NULL if allocation failed

Create an End of Stream bucket. This indicates that there is no more data coming from down the filter stack. All filters should flush at this point.

Parameters
listThe freelist from which this bucket should be allocated
Returns
The new bucket, or NULL if allocation failed

Make the bucket passed in an EOS bucket. This indicates that there is no more data coming from down the filter stack. All filters should flush at this point.

Parameters
bThe bucket to make into an EOS bucket
Returns
The new bucket, or NULL if allocation failed

Create a flush bucket. This indicates that filters should flush their data. There is no guarantee that they will flush it, but this is the best we can do.

Parameters
listThe freelist from which this bucket should be allocated
Returns
The new bucket, or NULL if allocation failed

Make the bucket passed in a FLUSH bucket. This indicates that filters should flush their data. There is no guarantee that they will flush it, but this is the best we can do.

Parameters
bThe bucket to make into a FLUSH bucket
Returns
The new bucket, or NULL if allocation failed

Create a bucket referring to long-lived data.

Parameters
bufThe data to insert into the bucket
nbyteThe size of the data to insert.
listThe freelist from which this bucket should be allocated
Returns
The new bucket, or NULL if allocation failed

Make the bucket passed in a bucket refer to long-lived data

Parameters
bThe bucket to make into a IMMORTAL bucket
bufThe data to insert into the bucket
nbyteThe size of the data to insert.
Returns
The new bucket, or NULL if allocation failed

Create a bucket referring to data on the stack.

Parameters
bufThe data to insert into the bucket
nbyteThe size of the data to insert.
listThe freelist from which this bucket should be allocated
Returns
The new bucket, or NULL if allocation failed

Make the bucket passed in a bucket refer to stack data

Parameters
bThe bucket to make into a TRANSIENT bucket
bufThe data to insert into the bucket
nbyteThe size of the data to insert.
Returns
The new bucket, or NULL if allocation failed

Create a bucket referring to memory on the heap. If the caller asks for the data to be copied, this function always allocates 4K of memory so that more data can be added to the bucket without requiring another allocation. Therefore not all the data may be put into the bucket. If copying is not requested then the bucket takes over responsibility for free()ing the memory.

Parameters
bufThe buffer to insert into the bucket
nbyteThe size of the buffer to insert.
free_funcFunction to use to free the data; NULL indicates that the bucket should make a copy of the data
listThe freelist from which this bucket should be allocated
Returns
The new bucket, or NULL if allocation failed

Make the bucket passed in a bucket refer to heap data

Parameters
bThe bucket to make into a HEAP bucket
bufThe buffer to insert into the bucket
nbyteThe size of the buffer to insert.
free_funcFunction to use to free the data; NULL indicates that the bucket should make a copy of the data
Returns
The new bucket, or NULL if allocation failed

Create a bucket referring to memory allocated from a pool.

Parameters
bufThe buffer to insert into the bucket
lengthThe number of bytes referred to by this bucket
poolThe pool the memory was allocated from
listThe freelist from which this bucket should be allocated
Returns
The new bucket, or NULL if allocation failed

Make the bucket passed in a bucket refer to pool data

Parameters
bThe bucket to make into a pool bucket
bufThe buffer to insert into the bucket
lengthThe number of bytes referred to by this bucket
poolThe pool the memory was allocated from
Returns
The new bucket, or NULL if allocation failed

Create a bucket referring to a socket.

Parameters
thissockThe socket to put in the bucket
listThe freelist from which this bucket should be allocated
Returns
The new bucket, or NULL if allocation failed

Make the bucket passed in a bucket refer to a socket

Parameters
bThe bucket to make into a SOCKET bucket
thissockThe socket to put in the bucket
Returns
The new bucket, or NULL if allocation failed

Create a bucket referring to a pipe.

Parameters
thispipeThe pipe to put in the bucket
listThe freelist from which this bucket should be allocated
Returns
The new bucket, or NULL if allocation failed

Make the bucket passed in a bucket refer to a pipe

Parameters
bThe bucket to make into a PIPE bucket
thispipeThe pipe to put in the bucket
Returns
The new bucket, or NULL if allocation failed

Create a bucket referring to a file.

Parameters
fdThe file to put in the bucket
offsetThe offset where the data of interest begins in the file
lenThe amount of data in the file we are interested in
pThe pool into which any needed structures should be created while reading from this file bucket
listThe freelist from which this bucket should be allocated
Returns
The new bucket, or NULL if allocation failed
Remarks
If the file is truncated such that the segment of the file referenced by the bucket no longer exists, an attempt to read from the bucket will fail with APR_EOF.
apr_brigade_insert_file() should generally be used to insert files into brigades, since that function can correctly handle large file issues.

Make the bucket passed in a bucket refer to a file

Parameters
bThe bucket to make into a FILE bucket
fdThe file to put in the bucket
offsetThe offset where the data of interest begins in the file
lenThe amount of data in the file we are interested in
pThe pool into which any needed structures should be created while reading from this file bucket
Returns
The new bucket, or NULL if allocation failed

◆ APU_DECLARE() [2/3]

APU_DECLARE ( apr_bucket_brigade )

Create a new bucket brigade. The bucket brigade is originally empty.

Parameters
pThe pool to associate with the brigade. Data is not allocated out of the pool, but a cleanup is registered.
listThe bucket allocator to use
Returns
The empty bucket brigade

Move the buckets from the tail end of the existing brigade b into the brigade a. If a is NULL a new brigade is created. Buckets from e to the last bucket (inclusively) of brigade b are moved from b to the returned brigade a.

Parameters
bThe brigade to split
eThe first bucket to move
aThe brigade which should be used for the result or NULL if a new brigade should be created. The brigade a will be cleared if it is not empty.
Returns
The brigade supplied in a or a new one if a was NULL.
Warning
Note that this function allocates a new brigade if a is NULL so memory consumption should be carefully considered.

Create a new bucket brigade and move the buckets from the tail end of an existing brigade into the new brigade. Buckets from e to the last bucket (inclusively) of brigade b are moved from b to the returned brigade.

Parameters
bThe brigade to split
eThe first bucket to move
Returns
The new brigade
Warning
Note that this function always allocates a new brigade so memory consumption should be carefully considered.

◆ APU_DECLARE() [3/3]

APU_DECLARE ( apr_status_t  )

destroy an entire bucket brigade. This includes destroying all of the buckets within the bucket brigade's bucket list.

Parameters
bThe bucket brigade to destroy

empty out an entire bucket brigade. This includes destroying all of the buckets within the bucket brigade's bucket list. This is similar to apr_brigade_destroy(), except that it does not deregister the brigade's pool cleanup function.

Parameters
dataThe bucket brigade to clean up
Remarks
Generally, you should use apr_brigade_destroy(). This function can be useful in situations where you have a single brigade that you wish to reuse many times by destroying all of the buckets in the brigade and putting new buckets into it later.

Partition a bucket brigade at a given offset (in bytes from the start of the brigade). This is useful whenever a filter wants to use known ranges of bytes from the brigade; the ranges can even overlap.

Parameters
bThe brigade to partition
pointThe offset at which to partition the brigade
after_pointReturns a pointer to the first bucket after the partition
Returns
APR_SUCCESS on success, APR_INCOMPLETE if the contents of the brigade were shorter than point, or an error code.
Remarks
if APR_INCOMPLETE is returned, after_point will be set to the brigade sentinel.

Return the total length of the brigade.

Parameters
bbThe brigade to compute the length of
read_allRead unknown-length buckets to force a size
lengthReturns the length of the brigade (up to the end, or up to a bucket read error), or -1 if the brigade has buckets of indeterminate length and read_all is 0.

Take a bucket brigade and store the data in a flat char*

Parameters
bbThe bucket brigade to create the char* from
cThe char* to write into
lenThe maximum length of the char array. On return, it is the actual length of the char array.

Creates a pool-allocated string representing a flat bucket brigade

Parameters
bbThe bucket brigade to create the char array from
cOn return, the allocated char array
lenOn return, the length of the char array.
poolThe pool to allocate the string from.

Split a brigade to represent one LF line.

Parameters
bbOutThe bucket brigade that will have the LF line appended to.
bbInThe input bucket brigade to search for a LF-line.
blockThe blocking mode to be used to split the line.
maxbytesThe maximum bytes to read. If this many bytes are seen without a LF, the brigade will contain a partial line.

Create an iovec of the elements in a bucket_brigade... return number of elements used. This is useful for writing to a file or to the network efficiently.

Parameters
bThe bucket brigade to create the iovec from
vecThe iovec to create
nvecThe number of elements in the iovec. On return, it is the number of iovec elements actually filled out.

This function writes a list of strings into a bucket brigade.

Parameters
bThe bucket brigade to add to
flushThe flush function to use if the brigade is full
ctxThe structure to pass to the flush function
vaA list of strings to add
Returns
APR_SUCCESS or error code.

This function writes a string into a bucket brigade.

The apr_brigade_write function attempts to be efficient with the handling of heap buckets. Regardless of the amount of data stored inside a heap bucket, heap buckets are a fixed size to promote their reuse.

If an attempt is made to write a string to a brigade that already ends with a heap bucket, this function will attempt to pack the string into the remaining space in the previous heap bucket, before allocating a new heap bucket.

This function always returns APR_SUCCESS, unless a flush function is passed, in which case the return value of the flush function will be returned if used.

Parameters
bThe bucket brigade to add to
flushThe flush function to use if the brigade is full
ctxThe structure to pass to the flush function
strThe string to add
nbyteThe number of bytes to write
Returns
APR_SUCCESS or error code

This function writes multiple strings into a bucket brigade.

Parameters
bThe bucket brigade to add to
flushThe flush function to use if the brigade is full
ctxThe structure to pass to the flush function
vecThe strings to add (address plus length for each)
nvecThe number of entries in iovec
Returns
APR_SUCCESS or error code

This function writes a string into a bucket brigade.

Parameters
bbThe bucket brigade to add to
flushThe flush function to use if the brigade is full
ctxThe structure to pass to the flush function
strThe string to add
Returns
APR_SUCCESS or error code

This function writes a character into a bucket brigade.

Parameters
bThe bucket brigade to add to
flushThe flush function to use if the brigade is full
ctxThe structure to pass to the flush function
cThe character to add
Returns
APR_SUCCESS or error code

Evaluate a printf and put the resulting string at the end of the bucket brigade.

Parameters
bThe brigade to write to
flushThe flush function to use if the brigade is full
ctxThe structure to pass to the flush function
fmtThe format of the string to write
vaThe arguments to fill out the format
Returns
APR_SUCCESS or error code

Decrement the refcount of the data in the bucket. This function should only be called by type-specific bucket destruction functions.

Parameters
dataThe private data pointer from the bucket to be destroyed
Returns
TRUE or FALSE; TRUE if the reference count is now zero, indicating that the shared resource itself can be destroyed by the caller.

Enable or disable memory-mapping for a FILE bucket (default is enabled)

Parameters
bThe bucket
enabledWhether memory-mapping should be enabled
Returns
APR_SUCCESS normally, or an error code if the operation fails

Set the size of the read buffer allocated by a FILE bucket (default is APR_BUCKET_BUFF_SIZE) memory-mapping is disabled only)

Parameters
bThe bucket
sizeSize of the allocated buffers
Returns
APR_SUCCESS normally, or an error code if the operation fails
Remarks
Relevant/used only when memory-mapping is disabled (
See also
apr_bucket_file_enable_mmap)

< Shared lock. More than one process or thread can hold a shared lock at any given time. Essentially, this is a "read lock", preventing writers from establishing an exclusive lock.

< Shared lock. More than one process or thread can hold a shared lock at any given time. Essentially, this is a "read lock", preventing writers from establishing an exclusive lock.

< Exclusive lock. Only one process may hold an exclusive lock at any given time. This is analogous to a "write lock".

< Exclusive lock. Only one process may hold an exclusive lock at any given time. This is analogous to a "write lock".

< Replace

< Insert with duplicates

< Shared lock. More than one process or thread can hold a shared lock at any given time. Essentially, this is a "read lock", preventing writers from establishing an exclusive lock.

< Shared lock. More than one process or thread can hold a shared lock at any given time. Essentially, this is a "read lock", preventing writers from establishing an exclusive lock.

< mask to extract lock type

< Shared lock. More than one process or thread can hold a shared lock at any given time. Essentially, this is a "read lock", preventing writers from establishing an exclusive lock.

< Exclusive lock. Only one process may hold an exclusive lock at any given time. This is analogous to a "write lock".

< Exclusive lock. Only one process may hold an exclusive lock at any given time. This is analogous to a "write lock".

< Size of the file

< Shared lock. More than one process or thread can hold a shared lock at any given time. Essentially, this is a "read lock", preventing writers from establishing an exclusive lock.

< Exclusive lock. Only one process may hold an exclusive lock at any given time. This is analogous to a "write lock".

Definition at line 358 of file apr_brigade.c.

◆ APU_DECLARE_NONSTD() [1/5]

APU_DECLARE_NONSTD ( apr_bucket_alloc_t )

Create a bucket allocator.

Parameters
pThis pool's underlying apr_allocator_t is used to allocate memory for the bucket allocator. When the pool is destroyed, the bucket allocator's cleanup routine will free all memory that has been allocated from it.
Remarks
The reason the allocator gets its memory from the pool's apr_allocator_t rather than from the pool itself is because the bucket allocator will free large memory blocks back to the allocator when it's done with them, thereby preventing memory footprint growth that would occur if we allocated from the pool.
Warning
The allocator must never be used by more than one thread at a time.

Create a bucket allocator.

Parameters
allocatorThis apr_allocator_t is used to allocate both the bucket allocator and all memory handed out by the bucket allocator. The caller is responsible for destroying the bucket allocator and the apr_allocator_t – no automatic cleanups will happen.
Warning
The allocator must never be used by more than one thread at a time.

Definition at line 69 of file apr_buckets_alloc.c.

◆ APU_DECLARE_NONSTD() [2/5]

APU_DECLARE_NONSTD ( apr_size_t  )

Get the aligned size corresponding to the requested size, but minus the allocator(s) overhead such that the allocation would remain in the same boundary.

Parameters
listThe allocator from which to the memory would be allocated.
sizeThe requested size.
Returns
The corresponding aligned/floored size.

◆ APU_DECLARE_NONSTD() [3/5]

APU_DECLARE_NONSTD ( apr_status_t  )

This function writes an unspecified number of strings into a bucket brigade.

Parameters
bThe bucket brigade to add to
flushThe flush function to use if the brigade is full
ctxThe structure to pass to the flush function
...The strings to add
Returns
APR_SUCCESS or error code

Evaluate a printf and put the resulting string at the end of the bucket brigade.

Parameters
bThe brigade to write to
flushThe flush function to use if the brigade is full
ctxThe structure to pass to the flush function
fmtThe format of the string to write
...The arguments to fill out the format
Returns
APR_SUCCESS or error code

This function simply returns APR_SUCCESS to denote that the bucket does not require anything to happen for its setaside() function. This is appropriate for buckets that have "immortal" data – the data will live at least as long as the bucket.

Parameters
dataThe bucket to setaside
poolThe pool defining the desired lifetime of the bucket data
Returns
APR_SUCCESS

A place holder function that signifies that the setaside function was not implemented for this bucket

Parameters
dataThe bucket to setaside
poolThe pool defining the desired lifetime of the bucket data
Returns
APR_ENOTIMPL

A place holder function that signifies that the split function was not implemented for this bucket

Parameters
dataThe bucket to split
pointThe location to split the bucket
Returns
APR_ENOTIMPL

A place holder function that signifies that the copy function was not implemented for this bucket

Parameters
eThe bucket to copy
cReturns a pointer to the new bucket
Returns
APR_ENOTIMPL

Split a simple bucket into two at the given point. Most non-reference counting buckets that allow multiple references to the same block of data (eg transient and immortal) will use this as their split function without any additional type-specific handling.

Parameters
bThe bucket to be split
pointThe offset of the first byte in the new bucket
Returns
APR_EINVAL if the point is not within the bucket; APR_ENOMEM if allocation failed; or APR_SUCCESS

Copy a simple bucket. Most non-reference-counting buckets that allow multiple references to the same block of data (eg transient and immortal) will use this as their copy function without any additional type-specific handling.

Parameters
aThe bucket to copy
bReturns a pointer to the new bucket
Returns
APR_ENOMEM if allocation failed; or APR_SUCCESS

Split a bucket into two at the given point, and adjust the refcount to the underlying data. Most reference-counting bucket types will be able to use this function as their split function without any additional type-specific handling.

Parameters
bThe bucket to be split
pointThe offset of the first byte in the new bucket
Returns
APR_EINVAL if the point is not within the bucket; APR_ENOMEM if allocation failed; or APR_SUCCESS

Copy a refcounted bucket, incrementing the reference count. Most reference-counting bucket types will be able to use this function as their copy function without any additional type-specific handling.

Parameters
aThe bucket to copy
bReturns a pointer to the new bucket
Returns
APR_ENOMEM if allocation failed; or APR_SUCCESS

◆ APU_DECLARE_NONSTD() [4/5]

APU_DECLARE_NONSTD ( void *  )

Allocate memory for use by the buckets.

Parameters
sizeThe amount to allocate.
listThe allocator from which to allocate the memory.

◆ APU_DECLARE_NONSTD() [5/5]

APU_DECLARE_NONSTD ( void  )

Destroy a bucket allocator.

Parameters
listThe allocator to be destroyed

Free memory previously allocated with apr_bucket_alloc().

Parameters
blockThe block of memory to be freed.

A place holder function that signifies that this bucket does not need to do anything special to be destroyed. That's only the case for buckets that either have no data (metadata buckets) or buckets whose data pointer points to something that's not a bucket-type-specific structure, as with simple buckets where data points to a string and pipe buckets where data points directly to the apr_file_t.

Parameters
dataThe bucket data to destroy

Definition at line 43 of file apr_buckets.c.

Variable Documentation

◆ a

Definition at line 700 of file apr_buckets.h.

◆ after_point

apr_off_t apr_bucket** after_point

Definition at line 730 of file apr_buckets.h.

◆ apr_bucket_type_eos

APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_eos
extern

The EOS bucket type. This signifies that there will be no more data, ever. All filters MUST send all data to the next filter when they receive a bucket of this type

Definition at line 47 of file apr_buckets_eos.c.

◆ apr_bucket_type_file

APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_file
extern

The FILE bucket type. This bucket represents a file on disk

Definition at line 257 of file apr_buckets_file.c.

◆ apr_bucket_type_flush

APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_flush
extern

There is no apr_bucket_destroy_notimpl, because destruction is required to be implemented (it could be a noop, but only if that makes sense for the bucket type) The flush bucket type. This signifies that all data should be flushed to the next filter. The flush bucket should be sent with the other buckets.

Definition at line 47 of file apr_buckets_flush.c.

◆ apr_bucket_type_heap

APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_heap
extern

The HEAP bucket type. This bucket represents a data allocated from the heap.

Definition at line 89 of file apr_buckets_heap.c.

◆ apr_bucket_type_immortal

APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_immortal
extern

The IMMORTAL bucket type. This bucket represents a segment of data that the creator is willing to take responsibility for. The core will do nothing with the data in an immortal bucket

Definition at line 121 of file apr_buckets_simple.c.

◆ apr_bucket_type_pipe

APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_pipe
extern

The PIPE bucket type. This bucket represents a pipe to another program.

Definition at line 112 of file apr_buckets_pipe.c.

◆ apr_bucket_type_pool

APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_pool
extern

The POOL bucket type. This bucket represents a data that was allocated from a pool. IF this bucket is still available when the pool is cleared, the data is copied on to the heap.

Definition at line 135 of file apr_buckets_pool.c.

◆ apr_bucket_type_socket

APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_socket
extern

The SOCKET bucket type. This bucket represents a socket to another machine

Definition at line 107 of file apr_buckets_socket.c.

◆ apr_bucket_type_transient

APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_transient
extern

The TRANSIENT bucket type. This bucket represents a data allocated off the stack. When the setaside function is called, this data is copied on to the heap

Definition at line 130 of file apr_buckets_simple.c.

◆ b

apr_bucket ** b

Definition at line 1265 of file apr_buckets.h.

◆ bbIn

Definition at line 776 of file apr_buckets.h.

◆ block

Definition at line 777 of file apr_buckets.h.

◆ buf

const char * buf

Definition at line 1391 of file apr_buckets.h.

◆ c

apr_bucket ** c

Definition at line 752 of file apr_buckets.h.

◆ ctx

apr_brigade_flush void * ctx

Definition at line 802 of file apr_buckets.h.

◆ data

void* data

Definition at line 1284 of file apr_buckets.h.

◆ e

Definition at line 699 of file apr_buckets.h.

◆ enabled

int enabled

Definition at line 1580 of file apr_buckets.h.

◆ f

Definition at line 927 of file apr_buckets.h.

◆ fd

Definition at line 1569 of file apr_buckets.h.

◆ flush

Definition at line 801 of file apr_buckets.h.

◆ fmt

Definition at line 896 of file apr_buckets.h.

◆ free_func

const char apr_size_t void(* free_func)(void *data)) ( void *  data)

Definition at line 1432 of file apr_buckets.h.

◆ len

Definition at line 753 of file apr_buckets.h.

◆ length

Definition at line 742 of file apr_buckets.h.

◆ list

Definition at line 661 of file apr_buckets.h.

◆ maxbytes

Definition at line 778 of file apr_buckets.h.

◆ nbyte

Definition at line 830 of file apr_buckets.h.

◆ nvec

Definition at line 790 of file apr_buckets.h.

◆ offset

Definition at line 1554 of file apr_buckets.h.

◆ p

Definition at line 930 of file apr_buckets.h.

◆ point

apr_size_t point

Definition at line 729 of file apr_buckets.h.

◆ pool

Definition at line 765 of file apr_buckets.h.

◆ read_all

int read_all

Definition at line 741 of file apr_buckets.h.

◆ size

apr_size_t size

Definition at line 1593 of file apr_buckets.h.

◆ start

void apr_off_t start

Definition at line 928 of file apr_buckets.h.

◆ str

Definition at line 830 of file apr_buckets.h.

◆ thispipe

apr_file_t* thispipe

Definition at line 1535 of file apr_buckets.h.

◆ thissock

apr_socket_t* thissock

Definition at line 1517 of file apr_buckets.h.

◆ va

Definition at line 803 of file apr_buckets.h.

◆ vec

Definition at line 790 of file apr_buckets.h.