3 * Copyright (C) Igor Sysoev
7 #ifndef _NGX_BUF_H_INCLUDED_
8 #define _NGX_BUF_H_INCLUDED_
11 #include <ngx_config.h>
15 typedef void * ngx_buf_tag_t
;
17 typedef struct ngx_buf_s ngx_buf_t
;
25 u_char
*start
; /* start of buffer */
26 u_char
*end
; /* end of buffer */
32 /* the buf's content could be changed */
36 * the buf's content is in a memory cache or in a read only memory
37 * and must not be changed
41 /* the buf's content is mmap()ed and must not be changed */
49 unsigned last_shadow
:1;
52 unsigned zerocopy_busy
:1;
58 typedef struct ngx_chain_s ngx_chain_t
;
72 typedef int (*ngx_output_chain_filter_pt
)(void *ctx
, ngx_chain_t
*out
);
81 unsigned need_in_memory
;
82 unsigned need_in_temp
;
89 ngx_output_chain_filter_pt output_filter
;
91 } ngx_output_chain_ctx_t
;
97 ngx_connection_t
*connection
;
100 } ngx_chain_writer_ctx_t
;
103 #define NGX_CHAIN_ERROR (ngx_chain_t *) NGX_ERROR
106 #define ngx_buf_in_memory(b) (b->temporary || b->memory || b->mmap)
107 #define ngx_buf_in_memory_only(b) (ngx_buf_in_memory(b) && !b->in_file)
108 #define ngx_buf_special(b) \
109 ((b->flush || b->last_buf) && !ngx_buf_in_memory(b) && !b->in_file)
111 #define ngx_buf_size(b) \
112 (ngx_buf_in_memory(b) ? (off_t) (b->last - b->pos): \
113 (b->file_last - b->file_pos))
115 ngx_buf_t
*ngx_create_temp_buf(ngx_pool_t
*pool
, size_t size
);
116 ngx_chain_t
*ngx_create_chain_of_bufs(ngx_pool_t
*pool
, ngx_bufs_t
*bufs
);
119 #define ngx_alloc_buf(pool) ngx_palloc(pool, sizeof(ngx_buf_t))
120 #define ngx_calloc_buf(pool) ngx_pcalloc(pool, sizeof(ngx_buf_t))
123 #define ngx_alloc_chain_link(pool) ngx_palloc(pool, sizeof(ngx_chain_t))
126 #define ngx_alloc_link_and_set_buf(chain, b, pool, error) \
128 ngx_test_null(chain, ngx_alloc_chain_link(pool), error); \
130 chain->next = NULL; \
134 #define ngx_chain_add_link(chain, last, cl) \
143 ngx_int_t
ngx_output_chain(ngx_output_chain_ctx_t
*ctx
, ngx_chain_t
*in
);
144 ngx_int_t
ngx_chain_writer(void *data
, ngx_chain_t
*in
);
146 ngx_int_t
ngx_chain_add_copy(ngx_pool_t
*pool
, ngx_chain_t
**chain
,
148 void ngx_chain_update_chains(ngx_chain_t
**free
, ngx_chain_t
**busy
,
149 ngx_chain_t
**out
, ngx_buf_tag_t tag
);
152 #endif /* _NGX_BUF_H_INCLUDED_ */