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>