nginx-0.0.3-2004-05-28-19:49:23 import; rename ngx_hunk_t to ngx_buf_t
diff --git a/src/core/ngx_buf.c b/src/core/ngx_buf.c
new file mode 100644
index 0000000..90973a6
--- /dev/null
+++ b/src/core/ngx_buf.c
@@ -0,0 +1,154 @@
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+
+
+ngx_buf_t *ngx_create_temp_buf(ngx_pool_t *pool, size_t size)
+{
+ ngx_buf_t *b;
+
+ if (!(b = ngx_calloc_buf(pool))) {
+ return NULL;
+ }
+
+ if (!(b->start = ngx_palloc(pool, size))) {
+ return NULL;
+ }
+
+ b->pos = b->start;
+ b->last = b->start;
+ b->end = b->last + size;
+ b->temporary = 1;
+
+ /*
+ b->file_pos = 0;
+ b->file_last = 0;
+
+ b->file = NULL;
+ b->shadow = NULL;
+
+ b->tag = 0;
+ */
+
+ return b;
+}
+
+
+ngx_chain_t *ngx_create_chain_of_bufs(ngx_pool_t *pool, ngx_bufs_t *bufs)
+{
+ u_char *p;
+ ngx_int_t i;
+ ngx_buf_t *b;
+ ngx_chain_t *chain, *cl, **ll;
+
+ if (!(p = ngx_palloc(pool, bufs->num * bufs->size))) {
+ return NULL;
+ }
+
+ ll = &chain;
+
+ for (i = 0; i < bufs->num; i++) {
+ if (!(b = ngx_calloc_buf(pool))) {
+ return NULL;
+ }
+
+ b->pos = p;
+ b->last = p;
+ b->temporary = 1;
+
+ b->start = p;
+ p += bufs->size;
+ b->end = p;
+
+ /*
+ b->file_pos = 0;
+ b->file_last = 0;
+
+ b->file = NULL;
+ b->shadow = NULL;
+ b->tag = 0;
+ */
+
+ if (!(cl = ngx_alloc_chain_link(pool))) {
+ return NULL;
+ }
+
+ cl->buf = b;
+ *ll = cl;
+ ll = &cl->next;
+ }
+
+ *ll = NULL;
+
+ return chain;
+}
+
+
+int ngx_chain_add_copy(ngx_pool_t *pool, ngx_chain_t **chain, ngx_chain_t *in)
+{
+ ngx_chain_t *cl, **ll;
+
+ ll = chain;
+
+ for (cl = *chain; cl; cl = cl->next) {
+ ll = &cl->next;
+ }
+
+ while (in) {
+ ngx_test_null(cl, ngx_alloc_chain_link(pool), NGX_ERROR);
+
+ cl->buf = in->buf;
+ *ll = cl;
+ ll = &cl->next;
+ in = in->next;
+ }
+
+ *ll = NULL;
+
+ return NGX_OK;
+}
+
+
+void ngx_chain_update_chains(ngx_chain_t **free, ngx_chain_t **busy,
+ ngx_chain_t **out, ngx_buf_tag_t tag)
+{
+ ngx_chain_t *tl;
+
+ if (*busy == NULL) {
+ *busy = *out;
+
+ } else {
+ for (tl = *busy; /* void */ ; tl = tl->next) {
+ if (tl->next == NULL) {
+ tl->next = *out;
+ break;
+ }
+ }
+ }
+
+ *out = NULL;
+
+ while (*busy) {
+ if (ngx_buf_size((*busy)->buf) != 0) {
+ break;
+ }
+
+#if (HAVE_WRITE_ZEROCOPY)
+ if ((*busy)->buf->zerocopy_busy) {
+ break;
+ }
+#endif
+
+ if ((*busy)->buf->tag != tag) {
+ *busy = (*busy)->next;
+ continue;
+ }
+
+ (*busy)->buf->pos = (*busy)->buf->last = (*busy)->buf->start;
+
+ tl = *busy;
+ *busy = (*busy)->next;
+ tl->next = *free;
+ *free = tl;
+ }
+}
diff --git a/src/core/ngx_buf.h b/src/core/ngx_buf.h
new file mode 100644
index 0000000..f2489f1
--- /dev/null
+++ b/src/core/ngx_buf.h
@@ -0,0 +1,204 @@
+#ifndef _NGX_BUF_H_INCLUDED_
+#define _NGX_BUF_H_INCLUDED_
+
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+
+
+#if 0
+/* the buf type */
+
+/* the buf's content is in memory */
+#define NGX_HUNK_IN_MEMORY 0x0001
+/* the buf's content can be changed */
+#define NGX_HUNK_TEMP 0x0002
+/* the buf's content is in cache and can not be changed */
+#define NGX_HUNK_MEMORY 0x0004
+#define NGX_HUNK_MMAP 0x0008
+
+/* the buf's content is recycled */
+#define NGX_HUNK_RECYCLED 0x0010
+
+/* the buf's content is in a file */
+#define NGX_HUNK_FILE 0x0020
+
+#define NGX_HUNK_STORAGE (NGX_HUNK_IN_MEMORY \
+ |NGX_HUNK_TEMP|NGX_HUNK_MEMORY|NGX_HUNK_MMAP \
+ |NGX_HUNK_RECYCLED|NGX_HUNK_FILE)
+
+/* the buf flags */
+
+/* in thread state flush means to write the buf completely before return */
+/* in event state flush means to start to write the buf */
+#define NGX_HUNK_FLUSH 0x0100
+
+/* the last buf */
+#define NGX_HUNK_LAST 0x0200
+
+
+#define NGX_HUNK_PREREAD 0x2000
+#define NGX_HUNK_LAST_SHADOW 0x4000
+#define NGX_HUNK_TEMP_FILE 0x8000
+#endif
+
+
+typedef void * ngx_buf_tag_t;
+
+typedef struct ngx_buf_s ngx_buf_t;
+
+struct ngx_buf_s {
+ u_char *pos;
+ u_char *last;
+ off_t file_pos;
+ off_t file_last;
+
+ int type;
+ u_char *start; /* start of buffer */
+ u_char *end; /* end of buffer */
+ ngx_buf_tag_t tag;
+ ngx_file_t *file;
+ ngx_buf_t *shadow;
+
+
+ /* the buf's content can be changed */
+ unsigned temporary:1;
+
+ /*
+ * the buf's content is in a memory cache or in a read only memory
+ * and can not be changed
+ */
+ unsigned memory:1;
+
+ /* the buf's content is mmap()ed and can not be changed */
+ unsigned mmap:1;
+ unsigned recycled:1;
+ unsigned in_file:1;
+ unsigned flush:1;
+ unsigned last_buf:1;
+
+ unsigned last_shadow:1;
+ unsigned temp_file:1;
+
+ unsigned zerocopy_busy:1;
+
+ /* STUB */ int num;
+};
+
+
+typedef struct ngx_chain_s ngx_chain_t;
+
+struct ngx_chain_s {
+ ngx_buf_t *buf;
+ ngx_chain_t *next;
+};
+
+
+typedef struct {
+ ngx_int_t num;
+ size_t size;
+} ngx_bufs_t;
+
+
+typedef int (*ngx_output_chain_filter_pt)(void *ctx, ngx_chain_t *out);
+
+typedef struct {
+ ngx_buf_t *buf;
+ ngx_chain_t *in;
+ ngx_chain_t *free;
+ ngx_chain_t *busy;
+
+ unsigned sendfile;
+ unsigned need_in_memory;
+ unsigned need_in_temp;
+
+ ngx_pool_t *pool;
+ ngx_int_t allocated;
+ ngx_bufs_t bufs;
+ ngx_buf_tag_t tag;
+
+ ngx_output_chain_filter_pt output_filter;
+ void *filter_ctx;
+} ngx_output_chain_ctx_t;
+
+
+typedef struct {
+ ngx_chain_t *out;
+ ngx_chain_t **last;
+ ngx_connection_t *connection;
+ ngx_pool_t *pool;
+} ngx_chain_writer_ctx_t;
+
+
+#define NGX_CHAIN_ERROR (ngx_chain_t *) NGX_ERROR
+
+
+#define ngx_buf_in_memory(b) (b->temporary || b->memory || b->mmap)
+#define ngx_buf_in_memory_only(b) (ngx_buf_in_memory(b) && !b->in_file)
+#define ngx_buf_special(b) \
+ ((b->flush || b->last) && !ngx_buf_in_memory(b) && !b->in_file)
+
+#define ngx_buf_size(b) \
+ (ngx_buf_in_memory(b) ? (size_t) (b->last - b->pos): \
+ (size_t) (b->file_last - b->file_pos))
+
+#if 0
+
+#define ngx_hunk_in_memory_only(h) \
+ ((h->type & (NGX_HUNK_IN_MEMORY|NGX_HUNK_FILE)) == NGX_HUNK_IN_MEMORY)
+/*
+ ((h->type & (NGX_HUNK_TEMP|NGX_HUNK_MEMORY|NGX_HUNK_MMAP|NGX_HUNK_FILE)) \
+ == (h->type & (NGX_HUNK_TEMP|NGX_HUNK_MEMORY|NGX_HUNK_MMAP)))
+
+*/
+
+
+
+#define ngx_hunk_special(b) \
+ (b->type == (b->type & (NGX_HUNK_FLUSH|NGX_HUNK_LAST)))
+
+
+#define ngx_hunk_size(b) \
+ ((b->type & NGX_HUNK_IN_MEMORY) ? (size_t) (b->last - b->pos): \
+ (size_t) (b->file_last - b->file_pos))
+
+#endif
+
+
+ngx_buf_t *ngx_create_temp_buf(ngx_pool_t *pool, size_t size);
+ngx_chain_t *ngx_create_chain_of_bufs(ngx_pool_t *pool, ngx_bufs_t *bufs);
+
+
+#define ngx_alloc_buf(pool) ngx_palloc(pool, sizeof(ngx_buf_t))
+#define ngx_calloc_buf(pool) ngx_pcalloc(pool, sizeof(ngx_buf_t))
+
+
+#define ngx_alloc_chain_link(pool) ngx_palloc(pool, sizeof(ngx_chain_t))
+
+
+#define ngx_alloc_link_and_set_buf(chain, b, pool, error) \
+ do { \
+ ngx_test_null(chain, ngx_alloc_chain_link(pool), error); \
+ chain->buf = b; \
+ chain->next = NULL; \
+ } while (0);
+
+
+#define ngx_chain_add_link(chain, last, cl) \
+ if (chain) { \
+ *last = cl; \
+ } else { \
+ chain = cl; \
+ } \
+ last = &cl->next
+
+
+int ngx_output_chain(ngx_output_chain_ctx_t *ctx, ngx_chain_t *in);
+int ngx_chain_writer(void *data, ngx_chain_t *in);
+
+int ngx_chain_add_copy(ngx_pool_t *pool, ngx_chain_t **chain, ngx_chain_t *in);
+void ngx_chain_update_chains(ngx_chain_t **free, ngx_chain_t **busy,
+ ngx_chain_t **out, ngx_buf_tag_t tag);
+
+
+#endif /* _NGX_BUF_H_INCLUDED_ */
diff --git a/src/core/ngx_conf_file.c b/src/core/ngx_conf_file.c
index 1a29eb0..e415bec 100644
--- a/src/core/ngx_conf_file.c
+++ b/src/core/ngx_conf_file.c
@@ -51,8 +51,8 @@
int m, rc, found, valid;
char *rv;
void *conf, **confp;
- ngx_str_t *name;
ngx_fd_t fd;
+ ngx_str_t *name;
ngx_conf_file_t *prev;
ngx_command_t *cmd;
@@ -73,18 +73,18 @@
}
prev = cf->conf_file;
- ngx_test_null(cf->conf_file,
- ngx_palloc(cf->pool, sizeof(ngx_conf_file_t)),
- NGX_CONF_ERROR);
+ if (!(cf->conf_file = ngx_palloc(cf->pool, sizeof(ngx_conf_file_t)))) {
+ return NGX_CONF_ERROR;
+ }
if (ngx_fd_info(fd, &cf->conf_file->file.info) == -1) {
ngx_log_error(NGX_LOG_EMERG, cf->log, ngx_errno,
ngx_fd_info_n " %s failed", filename->data);
}
- ngx_test_null(cf->conf_file->hunk,
- ngx_create_temp_hunk(cf->pool, 1024),
- NGX_CONF_ERROR);
+ if (!(cf->conf_file->buffer = ngx_create_temp_buf(cf->pool, 1024))) {
+ return NGX_CONF_ERROR;
+ }
cf->conf_file->file.fd = fd;
cf->conf_file->file.name.len = filename->len;
@@ -97,8 +97,10 @@
for ( ;; ) {
rc = ngx_conf_read_token(cf);
- /* ngx_conf_read_token() returns NGX_OK, NGX_ERROR,
- NGX_CONF_FILE_DONE or NGX_CONF_BLOCK_DONE */
+ /*
+ * ngx_conf_read_token() returns NGX_OK, NGX_ERROR,
+ * NGX_CONF_FILE_DONE or NGX_CONF_BLOCK_DONE
+ */
#if 0
ngx_log_debug(cf->log, "token %d" _ rc);
@@ -315,7 +317,7 @@
int quoted, s_quoted, d_quoted;
ssize_t n;
ngx_str_t *word;
- ngx_hunk_t *h;
+ ngx_buf_t *b;
found = 0;
need_space = 0;
@@ -324,8 +326,8 @@
quoted = s_quoted = d_quoted = 0;
cf->args->nelts = 0;
- h = cf->conf_file->hunk;
- start = h->pos;
+ b = cf->conf_file->buffer;
+ start = b->pos;
#if 0
ngx_log_debug(cf->log, "TOKEN START");
@@ -333,31 +335,31 @@
for ( ;; ) {
- if (h->pos >= h->last) {
+ if (b->pos >= b->last) {
if (cf->conf_file->file.offset
- >= ngx_file_size(&cf->conf_file->file.info)) {
+ >= ngx_file_size(&cf->conf_file->file.info)) {
return NGX_CONF_FILE_DONE;
}
- if (h->pos - start) {
- ngx_memcpy(h->start, start, (size_t) (h->pos - start));
+ if (b->pos - start) {
+ ngx_memcpy(b->start, start, b->pos - start);
}
n = ngx_read_file(&cf->conf_file->file,
- h->start + (h->pos - start),
- (size_t) (h->end - (h->start + (h->pos - start))),
+ b->start + (b->pos - start),
+ b->end - (b->start + (b->pos - start)),
cf->conf_file->file.offset);
if (n == NGX_ERROR) {
return NGX_ERROR;
}
- h->pos = h->start + (h->pos - start);
- start = h->start;
- h->last = h->pos + n;
+ b->pos = b->start + (b->pos - start);
+ start = b->start;
+ b->last = b->pos + n;
}
- ch = *h->pos++;
+ ch = *b->pos++;
#if 0
ngx_log_debug(cf->log, "%d:%d:%d:%d:%d '%c'" _
@@ -406,7 +408,7 @@
continue;
}
- start = h->pos - 1;
+ start = b->pos - 1;
switch (ch) {
@@ -485,14 +487,16 @@
}
if (found) {
- ngx_test_null(word, ngx_push_array(cf->args), NGX_ERROR);
- ngx_test_null(word->data,
- ngx_palloc(cf->pool,
- (size_t) (h->pos - start + 1)),
- NGX_ERROR);
+ if (!(word = ngx_push_array(cf->args))) {
+ return NGX_ERROR;
+ }
+
+ if (!(word->data = ngx_palloc(cf->pool, b->pos - start + 1))) {
+ return NGX_ERROR;
+ }
for (dst = word->data, src = start, len = 0;
- src < h->pos - 1;
+ src < b->pos - 1;
len++)
{
if (*src == '\\') {
@@ -583,8 +587,12 @@
}
}
- ngx_test_null(file, ngx_push_array(&cycle->open_files), NULL);
+ if (!(file = ngx_push_array(&cycle->open_files))) {
+ return NULL;
+ }
+
file->fd = NGX_INVALID_FILE;
+
if (name) {
file->name = *name;
}
@@ -917,8 +925,8 @@
char *ngx_conf_check_num_bounds(ngx_conf_t *cf, void *post, void *data)
{
- ngx_conf_num_bounds_t *bounds = post;
- ngx_int_t *np = data;
+ ngx_conf_num_bounds_t *bounds = post;
+ ngx_int_t *np = data;
if (bounds->high == -1) {
if (*np >= bounds->low) {
diff --git a/src/core/ngx_conf_file.h b/src/core/ngx_conf_file.h
index ff01e88..4b9fd90 100644
--- a/src/core/ngx_conf_file.h
+++ b/src/core/ngx_conf_file.h
@@ -112,7 +112,7 @@
typedef struct {
ngx_file_t file;
- ngx_hunk_t *hunk;
+ ngx_buf_t *buffer;
int line;
} ngx_conf_file_t;
diff --git a/src/core/ngx_connection.h b/src/core/ngx_connection.h
index 835f5e1..af85e7d 100644
--- a/src/core/ngx_connection.h
+++ b/src/core/ngx_connection.h
@@ -88,7 +88,7 @@
socklen_t local_socklen;
#endif
- ngx_hunk_t *buffer;
+ ngx_buf_t *buffer;
ngx_int_t number;
diff --git a/src/core/ngx_core.h b/src/core/ngx_core.h
index ed105e5..ccb357b 100644
--- a/src/core/ngx_core.h
+++ b/src/core/ngx_core.h
@@ -26,7 +26,7 @@
#include <ngx_parse.h>
#include <ngx_log.h>
#include <ngx_alloc.h>
-#include <ngx_hunk.h>
+#include <ngx_buf.h>
#include <ngx_array.h>
#include <ngx_table.h>
#include <ngx_types.h>
diff --git a/src/core/ngx_hunk.c b/src/core/ngx_hunk.c
deleted file mode 100644
index b448b39..0000000
--- a/src/core/ngx_hunk.c
+++ /dev/null
@@ -1,140 +0,0 @@
-
-#include <ngx_config.h>
-#include <ngx_core.h>
-
-
-ngx_hunk_t *ngx_create_temp_hunk(ngx_pool_t *pool, size_t size)
-{
- ngx_hunk_t *h;
-
- ngx_test_null(h, ngx_alloc_hunk(pool), NULL);
-
- ngx_test_null(h->start, ngx_palloc(pool, size), NULL);
-
- h->pos = h->start;
- h->last = h->start;
-
- h->file_pos = 0;
- h->file_last = 0;
-
- h->end = h->last + size;
-
- h->type = NGX_HUNK_TEMP|NGX_HUNK_IN_MEMORY;
- h->file = NULL;
- h->shadow = NULL;
-
- h->tag = 0;
-
- return h;
-}
-
-
-ngx_chain_t *ngx_create_chain_of_hunks(ngx_pool_t *pool, ngx_bufs_t *bufs)
-{
- ngx_int_t i;
- u_char *p;
- ngx_hunk_t *h;
- ngx_chain_t *chain, *cl, **ll;
-
- ngx_test_null(p, ngx_palloc(pool, bufs->num * bufs->size), NULL);
-
- ll = &chain;
-
- for (i = 0; i < bufs->num; i++) {
- ngx_test_null(h, ngx_alloc_hunk(pool), NULL);
-
- h->pos = p;
- h->last = p;
- h->file_pos = 0;
- h->file_last = 0;
-
- h->type = NGX_HUNK_IN_MEMORY|NGX_HUNK_TEMP;
-
- h->start = p;
- p += bufs->size;
- h->end = p;
-
- h->file = NULL;
- h->shadow = NULL;
- h->tag = 0;
-
- ngx_test_null(cl, ngx_alloc_chain_link(pool), NULL);
- cl->hunk = h;
- *ll = cl;
- ll = &cl->next;
- }
-
- *ll = NULL;
-
- return chain;
-}
-
-
-int ngx_chain_add_copy(ngx_pool_t *pool, ngx_chain_t **chain, ngx_chain_t *in)
-{
- ngx_chain_t *cl, **ll;
-
- ll = chain;
-
- for (cl = *chain; cl; cl = cl->next) {
- ll = &cl->next;
- }
-
- while (in) {
- ngx_test_null(cl, ngx_alloc_chain_link(pool), NGX_ERROR);
-
- cl->hunk = in->hunk;
- *ll = cl;
- ll = &cl->next;
- in = in->next;
- }
-
- *ll = NULL;
-
- return NGX_OK;
-}
-
-
-void ngx_chain_update_chains(ngx_chain_t **free, ngx_chain_t **busy,
- ngx_chain_t **out, ngx_hunk_tag_t tag)
-{
- ngx_chain_t *tl;
-
- if (*busy == NULL) {
- *busy = *out;
-
- } else {
- for (tl = *busy; /* void */ ; tl = tl->next) {
- if (tl->next == NULL) {
- tl->next = *out;
- break;
- }
- }
- }
-
- *out = NULL;
-
- while (*busy) {
- if (ngx_hunk_size((*busy)->hunk) != 0) {
- break;
- }
-
-#if (HAVE_WRITE_ZEROCOPY)
- if ((*busy)->hunk->type & NGX_HUNK_ZEROCOPY_BUSY) {
- break;
- }
-#endif
-
- if ((*busy)->hunk->tag != tag) {
- *busy = (*busy)->next;
- continue;
- }
-
- (*busy)->hunk->pos = (*busy)->hunk->last = (*busy)->hunk->start;
-
- tl = *busy;
- *busy = (*busy)->next;
- tl->next = *free;
- *free = tl;
- }
-}
diff --git a/src/core/ngx_hunk.h b/src/core/ngx_hunk.h
deleted file mode 100644
index afeca1e..0000000
--- a/src/core/ngx_hunk.h
+++ /dev/null
@@ -1,161 +0,0 @@
-#ifndef _NGX_HUNK_H_INCLUDED_
-#define _NGX_HUNK_H_INCLUDED_
-
-
-#include <ngx_config.h>
-#include <ngx_core.h>
-
-
-/* hunk type */
-
-/* the hunk is in memory */
-#define NGX_HUNK_IN_MEMORY 0x0001
-/* the hunk's content can be changed */
-#define NGX_HUNK_TEMP 0x0002
-/* the hunk's content is in cache and can not be changed */
-#define NGX_HUNK_MEMORY 0x0004
-/* the hunk's content is mmap()ed and can not be changed */
-#define NGX_HUNK_MMAP 0x0008
-
-#define NGX_HUNK_RECYCLED 0x0010
-
-/* the hunk is in file */
-#define NGX_HUNK_FILE 0x0020
-
-#define NGX_HUNK_STORAGE (NGX_HUNK_IN_MEMORY \
- |NGX_HUNK_TEMP|NGX_HUNK_MEMORY|NGX_HUNK_MMAP \
- |NGX_HUNK_RECYCLED|NGX_HUNK_FILE)
-
-/* hunk flags */
-
-/* in thread state flush means to write the hunk completely before return */
-/* in event state flush means to start to write the hunk */
-#define NGX_HUNK_FLUSH 0x0100
-/* last hunk */
-#define NGX_HUNK_LAST 0x0200
-
-
-#define NGX_HUNK_PREREAD 0x2000
-#define NGX_HUNK_LAST_SHADOW 0x4000
-#define NGX_HUNK_TEMP_FILE 0x8000
-
-
-typedef void * ngx_hunk_tag_t;
-
-typedef struct ngx_hunk_s ngx_hunk_t;
-
-struct ngx_hunk_s {
- u_char *pos;
- u_char *last;
- off_t file_pos;
- off_t file_last;
-
- int type;
- u_char *start; /* start of hunk */
- u_char *end; /* end of hunk */
- ngx_hunk_tag_t tag;
- ngx_file_t *file;
- ngx_hunk_t *shadow;
- /* STUB */ int num;
-};
-
-
-typedef struct ngx_chain_s ngx_chain_t;
-
-struct ngx_chain_s {
- ngx_hunk_t *hunk;
- ngx_chain_t *next;
-};
-
-
-typedef struct {
- ngx_int_t num;
- size_t size;
-} ngx_bufs_t;
-
-
-typedef int (*ngx_output_chain_filter_pt)(void *ctx, ngx_chain_t *out);
-
-typedef struct {
- ngx_hunk_t *hunk;
- ngx_chain_t *in;
- ngx_chain_t *free;
- ngx_chain_t *busy;
-
- unsigned sendfile;
- unsigned need_in_memory;
- unsigned need_in_temp;
-
- ngx_pool_t *pool;
- ngx_int_t hunks;
- ngx_bufs_t bufs;
- ngx_hunk_tag_t tag;
-
- ngx_output_chain_filter_pt output_filter;
- void *filter_ctx;
-} ngx_output_chain_ctx_t;
-
-
-typedef struct {
- ngx_chain_t *out;
- ngx_chain_t **last;
- ngx_connection_t *connection;
- ngx_pool_t *pool;
-} ngx_chain_writer_ctx_t;
-
-
-#define NGX_CHAIN_ERROR (ngx_chain_t *) NGX_ERROR
-
-
-#define ngx_hunk_in_memory_only(h) \
- ((h->type & (NGX_HUNK_IN_MEMORY|NGX_HUNK_FILE)) == NGX_HUNK_IN_MEMORY)
-/*
- ((h->type & (NGX_HUNK_TEMP|NGX_HUNK_MEMORY|NGX_HUNK_MMAP|NGX_HUNK_FILE)) \
- == (h->type & (NGX_HUNK_TEMP|NGX_HUNK_MEMORY|NGX_HUNK_MMAP)))
-
-*/
-
-#define ngx_hunk_special(h) \
- (h->type == (h->type & (NGX_HUNK_FLUSH|NGX_HUNK_LAST)))
-
-
-#define ngx_hunk_size(h) \
- ((h->type & NGX_HUNK_IN_MEMORY) ? (size_t) (h->last - h->pos): \
- (size_t) (h->file_last - h->file_pos))
-
-
-ngx_hunk_t *ngx_create_temp_hunk(ngx_pool_t *pool, size_t size);
-
-#define ngx_alloc_hunk(pool) ngx_palloc(pool, sizeof(ngx_hunk_t))
-#define ngx_calloc_hunk(pool) ngx_pcalloc(pool, sizeof(ngx_hunk_t))
-
-
-#define ngx_alloc_chain_link(pool) ngx_palloc(pool, sizeof(ngx_chain_t))
-
-
-#define ngx_alloc_link_and_set_hunk(chain, h, pool, error) \
- do { \
- ngx_test_null(chain, ngx_alloc_chain_link(pool), error); \
- chain->hunk = h; \
- chain->next = NULL; \
- } while (0);
-
-
-#define ngx_chain_add_link(chain, last, cl) \
- if (chain) { \
- *last = cl; \
- } else { \
- chain = cl; \
- } \
- last = &cl->next
-
-
-int ngx_output_chain(ngx_output_chain_ctx_t *ctx, ngx_chain_t *in);
-int ngx_chain_writer(void *data, ngx_chain_t *in);
-
-int ngx_chain_add_copy(ngx_pool_t *pool, ngx_chain_t **chain, ngx_chain_t *in);
-void ngx_chain_update_chains(ngx_chain_t **free, ngx_chain_t **busy,
- ngx_chain_t **out, ngx_hunk_tag_t tag);
-
-
-#endif /* _NGX_HUNK_H_INCLUDED_ */
diff --git a/src/core/ngx_output_chain.c b/src/core/ngx_output_chain.c
index b54cbaf..0afa697 100644
--- a/src/core/ngx_output_chain.c
+++ b/src/core/ngx_output_chain.c
@@ -8,20 +8,20 @@
ngx_inline static int ngx_output_chain_need_to_copy(ngx_output_chain_ctx_t *ctx,
- ngx_hunk_t *hunk);
-static int ngx_output_chain_copy_hunk(ngx_hunk_t *dst, ngx_hunk_t *src,
- u_int sendfile);
+ ngx_buf_t *buf);
+static ngx_int_t ngx_output_chain_copy_buf(ngx_buf_t *dst, ngx_buf_t *src,
+ ngx_uint_t sendfile);
int ngx_output_chain(ngx_output_chain_ctx_t *ctx, ngx_chain_t *in)
{
int rc, last;
- size_t size, hsize;
+ size_t size, bsize;
ngx_chain_t *cl, *out, **last_out;
/*
* the short path for the case when the ctx->in chain is empty
- * and the incoming chain is empty too or it has the single hunk
+ * and the incoming chain is empty too or it has the single buf
* that does not require the copy
*/
@@ -32,7 +32,7 @@
}
if (in->next == NULL
- && (!ngx_output_chain_need_to_copy(ctx, in->hunk)))
+ && (!ngx_output_chain_need_to_copy(ctx, in->buf)))
{
return ctx->output_filter(ctx->filter_ctx, in);
}
@@ -55,11 +55,11 @@
while (ctx->in) {
/*
- * cycle while there are the ctx->in hunks
- * or there are the free output hunks to copy in
+ * cycle while there are the ctx->in bufs
+ * or there are the free output bufs to copy in
*/
- if (!ngx_output_chain_need_to_copy(ctx, ctx->in->hunk)) {
+ if (!ngx_output_chain_need_to_copy(ctx, ctx->in->buf)) {
/* move the chain link to the output chain */
@@ -73,15 +73,15 @@
continue;
}
- if (ctx->hunk == NULL) {
+ if (ctx->buf == NULL) {
- /* get the free hunk */
+ /* get the free buf */
if (ctx->free) {
- ctx->hunk = ctx->free->hunk;
+ ctx->buf = ctx->free->buf;
ctx->free = ctx->free->next;
- } else if (out || ctx->hunks == ctx->bufs.num) {
+ } else if (out || ctx->allocated == ctx->bufs.num) {
break;
@@ -89,44 +89,45 @@
size = ctx->bufs.size;
- if (ctx->in->hunk->type & NGX_HUNK_LAST) {
+ if (ctx->in->buf->last_buf) {
- hsize = ngx_hunk_size(ctx->in->hunk);
+ bsize = ngx_buf_size(ctx->in->buf);
- if (hsize < ctx->bufs.size) {
+ if (bsize < ctx->bufs.size) {
/*
- * allocate small temp hunk for the small last hunk
+ * allocate small temp buf for the small last buf
* or its small last part
*/
- size = hsize;
+ size = bsize;
} else if (ctx->bufs.num == 1
- && (hsize < ctx->bufs.size
+ && (bsize < ctx->bufs.size
+ (ctx->bufs.size >> 2)))
{
/*
- * allocate a temp hunk that equals
- * to the last hunk if the last hunk size is lesser
- * than 1.25 of bufs.size and a temp hunk is single
+ * allocate a temp buf that equals
+ * to the last buf if the last buf size is lesser
+ * than 1.25 of bufs.size and a temp buf is single
*/
- size = hsize;
+ size = bsize;
}
}
- ngx_test_null(ctx->hunk,
- ngx_create_temp_hunk(ctx->pool, size),
- NGX_ERROR);
- ctx->hunk->tag = ctx->tag;
- ctx->hunk->type |= NGX_HUNK_RECYCLED;
- ctx->hunks++;
+ if (!(ctx->buf = ngx_create_temp_buf(ctx->pool, size))) {
+ return NGX_ERROR;
+ }
+
+ ctx->buf->tag = ctx->tag;
+ ctx->buf->recycled = 1;
+ ctx->allocated++;
}
}
- rc = ngx_output_chain_copy_hunk(ctx->hunk, ctx->in->hunk,
- ctx->sendfile);
+ rc = ngx_output_chain_copy_buf(ctx->buf, ctx->in->buf,
+ ctx->sendfile);
if (rc == NGX_ERROR) {
return rc;
@@ -139,16 +140,16 @@
return rc;
}
- /* delete the completed hunk from the ctx->in chain */
+ /* delete the completed buf from the ctx->in chain */
- if (ngx_hunk_size(ctx->in->hunk) == 0) {
+ if (ngx_buf_size(ctx->in->buf) == 0) {
ctx->in = ctx->in->next;
}
- ngx_alloc_link_and_set_hunk(cl, ctx->hunk, ctx->pool, NGX_ERROR);
+ ngx_alloc_link_and_set_buf(cl, ctx->buf, ctx->pool, NGX_ERROR);
*last_out = cl;
last_out = &cl->next;
- ctx->hunk = NULL;
+ ctx->buf = NULL;
}
if (out == NULL && last != NGX_NONE) {
@@ -168,26 +169,25 @@
ngx_inline static int ngx_output_chain_need_to_copy(ngx_output_chain_ctx_t *ctx,
- ngx_hunk_t *hunk)
+ ngx_buf_t *buf)
{
- if (ngx_hunk_special(hunk)) {
+ if (ngx_buf_special(buf)) {
return 0;
}
if (!ctx->sendfile) {
- if (!(hunk->type & NGX_HUNK_IN_MEMORY)) {
+ if (!ngx_buf_in_memory(buf)) {
return 1;
}
- hunk->type &= ~NGX_HUNK_FILE;
+ buf->in_file = 0;
}
- if (ctx->need_in_memory && (!(hunk->type & NGX_HUNK_IN_MEMORY))) {
+ if (ctx->need_in_memory && !ngx_buf_in_memory(buf)) {
return 1;
}
-
- if (ctx->need_in_temp && (hunk->type & (NGX_HUNK_MEMORY|NGX_HUNK_MMAP))) {
+ if (ctx->need_in_temp && (buf->memory || buf->mmap)) {
return 1;
}
@@ -195,29 +195,29 @@
}
-static int ngx_output_chain_copy_hunk(ngx_hunk_t *dst, ngx_hunk_t *src,
- u_int sendfile)
+static ngx_int_t ngx_output_chain_copy_buf(ngx_buf_t *dst, ngx_buf_t *src,
+ ngx_uint_t sendfile)
{
size_t size;
ssize_t n;
- size = ngx_hunk_size(src);
+ size = ngx_buf_size(src);
if (size > (size_t) (dst->end - dst->pos)) {
size = dst->end - dst->pos;
}
- if (src->type & NGX_HUNK_IN_MEMORY) {
+ if (ngx_buf_in_memory(src)) {
ngx_memcpy(dst->pos, src->pos, size);
src->pos += size;
dst->last += size;
- if (src->type & NGX_HUNK_FILE) {
+ if (src->in_file) {
src->file_pos += size;
}
- if ((src->type & NGX_HUNK_LAST) && src->pos == src->last) {
- dst->type |= NGX_HUNK_LAST;
+ if (src->last_buf && src->pos == src->last) {
+ dst->last_buf = 1;
}
} else {
@@ -246,11 +246,11 @@
dst->last += n;
if (!sendfile) {
- dst->type &= ~NGX_HUNK_FILE;
+ dst->in_file = 0;
}
- if ((src->type & NGX_HUNK_LAST) && src->file_pos == src->file_last) {
- dst->type |= NGX_HUNK_LAST;
+ if (src->last_buf && src->file_pos == src->file_last) {
+ dst->last_buf = 1;
}
}
@@ -258,7 +258,7 @@
}
-int ngx_chain_writer(void *data, ngx_chain_t *in)
+ngx_int_t ngx_chain_writer(void *data, ngx_chain_t *in)
{
ngx_chain_writer_ctx_t *ctx = data;
@@ -266,7 +266,7 @@
for (/* void */; in; in = in->next) {
- ngx_alloc_link_and_set_hunk(cl, in->hunk, ctx->pool, NGX_ERROR);
+ ngx_alloc_link_and_set_buf(cl, in->buf, ctx->pool, NGX_ERROR);
*ctx->last = cl;
ctx->last = &cl->next;
}