Mercurial > hg > nginx-vendor-0-8
diff src/core/ngx_buf.c @ 0:f0b350454894 NGINX_0_1_0
nginx 0.1.0
*) The first public version.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Mon, 04 Oct 2004 00:00:00 +0400 |
parents | |
children | cc9f381affaa |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/src/core/ngx_buf.c @@ -0,0 +1,162 @@ + +/* + * Copyright (C) Igor Sysoev + */ + + +#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; +} + + +ngx_int_t 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; + } +}