Annotation of embedaddon/nginx/src/core/ngx_buf.c, revision 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>