Annotation of embedaddon/nginx/src/core/ngx_buf.c, revision 1.1.1.1

1.1       misho       1: 
                      2: /*
                      3:  * Copyright (C) Igor Sysoev
                      4:  * Copyright (C) Nginx, Inc.
                      5:  */
                      6: 
                      7: 
                      8: #include <ngx_config.h>
                      9: #include <ngx_core.h>
                     10: 
                     11: 
                     12: ngx_buf_t *
                     13: ngx_create_temp_buf(ngx_pool_t *pool, size_t size)
                     14: {
                     15:     ngx_buf_t *b;
                     16: 
                     17:     b = ngx_calloc_buf(pool);
                     18:     if (b == NULL) {
                     19:         return NULL;
                     20:     }
                     21: 
                     22:     b->start = ngx_palloc(pool, size);
                     23:     if (b->start == NULL) {
                     24:         return NULL;
                     25:     }
                     26: 
                     27:     /*
                     28:      * set by ngx_calloc_buf():
                     29:      *
                     30:      *     b->file_pos = 0;
                     31:      *     b->file_last = 0;
                     32:      *     b->file = NULL;
                     33:      *     b->shadow = NULL;
                     34:      *     b->tag = 0;
                     35:      *     and flags
                     36:      */
                     37: 
                     38:     b->pos = b->start;
                     39:     b->last = b->start;
                     40:     b->end = b->last + size;
                     41:     b->temporary = 1;
                     42: 
                     43:     return b;
                     44: }
                     45: 
                     46: 
                     47: ngx_chain_t *
                     48: ngx_alloc_chain_link(ngx_pool_t *pool)
                     49: {
                     50:     ngx_chain_t  *cl;
                     51: 
                     52:     cl = pool->chain;
                     53: 
                     54:     if (cl) {
                     55:         pool->chain = cl->next;
                     56:         return cl;
                     57:     }
                     58: 
                     59:     cl = ngx_palloc(pool, sizeof(ngx_chain_t));
                     60:     if (cl == NULL) {
                     61:         return NULL;
                     62:     }
                     63: 
                     64:     return cl;
                     65: }
                     66: 
                     67: 
                     68: ngx_chain_t *
                     69: ngx_create_chain_of_bufs(ngx_pool_t *pool, ngx_bufs_t *bufs)
                     70: {
                     71:     u_char       *p;
                     72:     ngx_int_t     i;
                     73:     ngx_buf_t    *b;
                     74:     ngx_chain_t  *chain, *cl, **ll;
                     75: 
                     76:     p = ngx_palloc(pool, bufs->num * bufs->size);
                     77:     if (p == NULL) {
                     78:         return NULL;
                     79:     }
                     80: 
                     81:     ll = &chain;
                     82: 
                     83:     for (i = 0; i < bufs->num; i++) {
                     84: 
                     85:         b = ngx_calloc_buf(pool);
                     86:         if (b == NULL) {
                     87:             return NULL;
                     88:         }
                     89: 
                     90:         /*
                     91:          * set by ngx_calloc_buf():
                     92:          *
                     93:          *     b->file_pos = 0;
                     94:          *     b->file_last = 0;
                     95:          *     b->file = NULL;
                     96:          *     b->shadow = NULL;
                     97:          *     b->tag = 0;
                     98:          *     and flags
                     99:          *
                    100:          */
                    101: 
                    102:         b->pos = p;
                    103:         b->last = p;
                    104:         b->temporary = 1;
                    105: 
                    106:         b->start = p;
                    107:         p += bufs->size;
                    108:         b->end = p;
                    109: 
                    110:         cl = ngx_alloc_chain_link(pool);
                    111:         if (cl == NULL) {
                    112:             return NULL;
                    113:         }
                    114: 
                    115:         cl->buf = b;
                    116:         *ll = cl;
                    117:         ll = &cl->next;
                    118:     }
                    119: 
                    120:     *ll = NULL;
                    121: 
                    122:     return chain;
                    123: }
                    124: 
                    125: 
                    126: ngx_int_t
                    127: ngx_chain_add_copy(ngx_pool_t *pool, ngx_chain_t **chain, ngx_chain_t *in)
                    128: {
                    129:     ngx_chain_t  *cl, **ll;
                    130: 
                    131:     ll = chain;
                    132: 
                    133:     for (cl = *chain; cl; cl = cl->next) {
                    134:         ll = &cl->next;
                    135:     }
                    136: 
                    137:     while (in) {
                    138:         cl = ngx_alloc_chain_link(pool);
                    139:         if (cl == NULL) {
                    140:             return NGX_ERROR;
                    141:         }
                    142: 
                    143:         cl->buf = in->buf;
                    144:         *ll = cl;
                    145:         ll = &cl->next;
                    146:         in = in->next;
                    147:     }
                    148: 
                    149:     *ll = NULL;
                    150: 
                    151:     return NGX_OK;
                    152: }
                    153: 
                    154: 
                    155: ngx_chain_t *
                    156: ngx_chain_get_free_buf(ngx_pool_t *p, ngx_chain_t **free)
                    157: {
                    158:     ngx_chain_t  *cl;
                    159: 
                    160:     if (*free) {
                    161:         cl = *free;
                    162:         *free = cl->next;
                    163:         cl->next = NULL;
                    164:         return cl;
                    165:     }
                    166: 
                    167:     cl = ngx_alloc_chain_link(p);
                    168:     if (cl == NULL) {
                    169:         return NULL;
                    170:     }
                    171: 
                    172:     cl->buf = ngx_calloc_buf(p);
                    173:     if (cl->buf == NULL) {
                    174:         return NULL;
                    175:     }
                    176: 
                    177:     cl->next = NULL;
                    178: 
                    179:     return cl;
                    180: }
                    181: 
                    182: 
                    183: void
                    184: ngx_chain_update_chains(ngx_pool_t *p, ngx_chain_t **free, ngx_chain_t **busy,
                    185:     ngx_chain_t **out, ngx_buf_tag_t tag)
                    186: {
                    187:     ngx_chain_t  *cl;
                    188: 
                    189:     if (*busy == NULL) {
                    190:         *busy = *out;
                    191: 
                    192:     } else {
                    193:         for (cl = *busy; cl->next; cl = cl->next) { /* void */ }
                    194: 
                    195:         cl->next = *out;
                    196:     }
                    197: 
                    198:     *out = NULL;
                    199: 
                    200:     while (*busy) {
                    201:         cl = *busy;
                    202: 
                    203:         if (ngx_buf_size(cl->buf) != 0) {
                    204:             break;
                    205:         }
                    206: 
                    207:         if (cl->buf->tag != tag) {
                    208:             *busy = cl->next;
                    209:             ngx_free_chain(p, cl);
                    210:             continue;
                    211:         }
                    212: 
                    213:         cl->buf->pos = cl->buf->start;
                    214:         cl->buf->last = cl->buf->start;
                    215: 
                    216:         *busy = cl->next;
                    217:         cl->next = *free;
                    218:         *free = cl;
                    219:     }
                    220: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>