10Sigor@sysoev.ru
20Sigor@sysoev.ru /*
30Sigor@sysoev.ru * Copyright (C) Igor Sysoev
40Sigor@sysoev.ru * Copyright (C) NGINX, Inc.
50Sigor@sysoev.ru */
60Sigor@sysoev.ru
70Sigor@sysoev.ru #include <nxt_main.h>
80Sigor@sysoev.ru
90Sigor@sysoev.ru
100Sigor@sysoev.ru nxt_int_t
nxt_buf_pool_mem_alloc(nxt_buf_pool_t * bp,size_t size)110Sigor@sysoev.ru nxt_buf_pool_mem_alloc(nxt_buf_pool_t *bp, size_t size)
120Sigor@sysoev.ru {
130Sigor@sysoev.ru nxt_buf_t *b;
140Sigor@sysoev.ru
150Sigor@sysoev.ru b = bp->current;
160Sigor@sysoev.ru
170Sigor@sysoev.ru if (b != NULL && b->mem.free < b->mem.end) {
180Sigor@sysoev.ru return NXT_OK;
190Sigor@sysoev.ru }
200Sigor@sysoev.ru
210Sigor@sysoev.ru b = bp->free;
220Sigor@sysoev.ru
230Sigor@sysoev.ru if (b != NULL) {
240Sigor@sysoev.ru bp->current = b;
250Sigor@sysoev.ru bp->free = b->next;
260Sigor@sysoev.ru b->next = NULL;
270Sigor@sysoev.ru return NXT_OK;
280Sigor@sysoev.ru }
290Sigor@sysoev.ru
300Sigor@sysoev.ru if (bp->num >= bp->max) {
310Sigor@sysoev.ru return NXT_AGAIN;
320Sigor@sysoev.ru }
330Sigor@sysoev.ru
340Sigor@sysoev.ru if (size == 0 || size >= bp->size + bp->size / 4) {
350Sigor@sysoev.ru size = bp->size;
360Sigor@sysoev.ru }
370Sigor@sysoev.ru
380Sigor@sysoev.ru b = nxt_buf_mem_alloc(bp->mem_pool, size, bp->flags);
390Sigor@sysoev.ru
400Sigor@sysoev.ru if (nxt_fast_path(b != NULL)) {
410Sigor@sysoev.ru bp->current = b;
420Sigor@sysoev.ru bp->num++;
430Sigor@sysoev.ru return NXT_OK;
440Sigor@sysoev.ru }
450Sigor@sysoev.ru
460Sigor@sysoev.ru return NXT_ERROR;
470Sigor@sysoev.ru }
480Sigor@sysoev.ru
490Sigor@sysoev.ru
500Sigor@sysoev.ru nxt_int_t
nxt_buf_pool_file_alloc(nxt_buf_pool_t * bp,size_t size)510Sigor@sysoev.ru nxt_buf_pool_file_alloc(nxt_buf_pool_t *bp, size_t size)
520Sigor@sysoev.ru {
530Sigor@sysoev.ru nxt_buf_t *b;
540Sigor@sysoev.ru
550Sigor@sysoev.ru b = bp->current;
560Sigor@sysoev.ru
570Sigor@sysoev.ru if (b != NULL && b->mem.free < b->mem.end) {
580Sigor@sysoev.ru return NXT_OK;
590Sigor@sysoev.ru }
600Sigor@sysoev.ru
610Sigor@sysoev.ru b = bp->free;
620Sigor@sysoev.ru
630Sigor@sysoev.ru if (b != NULL) {
640Sigor@sysoev.ru bp->current = b;
650Sigor@sysoev.ru bp->free = b->next;
660Sigor@sysoev.ru b->next = NULL;
670Sigor@sysoev.ru return NXT_OK;
680Sigor@sysoev.ru }
690Sigor@sysoev.ru
700Sigor@sysoev.ru if (bp->num >= bp->max) {
710Sigor@sysoev.ru return NXT_AGAIN;
720Sigor@sysoev.ru }
730Sigor@sysoev.ru
740Sigor@sysoev.ru if (size == 0 || size >= bp->size + bp->size / 4) {
750Sigor@sysoev.ru size = bp->size;
760Sigor@sysoev.ru }
770Sigor@sysoev.ru
780Sigor@sysoev.ru b = nxt_buf_file_alloc(bp->mem_pool, size, bp->flags);
790Sigor@sysoev.ru
800Sigor@sysoev.ru if (nxt_fast_path(b != NULL)) {
810Sigor@sysoev.ru bp->current = b;
820Sigor@sysoev.ru bp->num++;
830Sigor@sysoev.ru return NXT_OK;
840Sigor@sysoev.ru }
850Sigor@sysoev.ru
860Sigor@sysoev.ru return NXT_ERROR;
870Sigor@sysoev.ru }
880Sigor@sysoev.ru
890Sigor@sysoev.ru
900Sigor@sysoev.ru nxt_int_t
nxt_buf_pool_mmap_alloc(nxt_buf_pool_t * bp,size_t size)910Sigor@sysoev.ru nxt_buf_pool_mmap_alloc(nxt_buf_pool_t *bp, size_t size)
920Sigor@sysoev.ru {
930Sigor@sysoev.ru nxt_buf_t *b;
940Sigor@sysoev.ru
950Sigor@sysoev.ru b = bp->current;
960Sigor@sysoev.ru
970Sigor@sysoev.ru if (b != NULL) {
980Sigor@sysoev.ru return NXT_OK;
990Sigor@sysoev.ru }
1000Sigor@sysoev.ru
1010Sigor@sysoev.ru b = bp->free;
1020Sigor@sysoev.ru
1030Sigor@sysoev.ru if (b != NULL) {
1040Sigor@sysoev.ru bp->current = b;
1050Sigor@sysoev.ru bp->free = b->next;
1060Sigor@sysoev.ru b->next = NULL;
1070Sigor@sysoev.ru return NXT_OK;
1080Sigor@sysoev.ru }
1090Sigor@sysoev.ru
1100Sigor@sysoev.ru if (bp->num >= bp->max) {
1110Sigor@sysoev.ru return NXT_AGAIN;
1120Sigor@sysoev.ru }
1130Sigor@sysoev.ru
1140Sigor@sysoev.ru if (size == 0 || size >= bp->size + bp->size / 4) {
1150Sigor@sysoev.ru size = bp->size;
1160Sigor@sysoev.ru }
1170Sigor@sysoev.ru
1180Sigor@sysoev.ru b = nxt_buf_mmap_alloc(bp->mem_pool, size);
1190Sigor@sysoev.ru
1200Sigor@sysoev.ru if (nxt_fast_path(b != NULL)) {
1210Sigor@sysoev.ru bp->mmap = 1;
1220Sigor@sysoev.ru bp->current = b;
1230Sigor@sysoev.ru bp->num++;
1240Sigor@sysoev.ru return NXT_OK;
1250Sigor@sysoev.ru }
1260Sigor@sysoev.ru
1270Sigor@sysoev.ru return NXT_ERROR;
1280Sigor@sysoev.ru }
1290Sigor@sysoev.ru
1300Sigor@sysoev.ru
1310Sigor@sysoev.ru void
nxt_buf_pool_free(nxt_buf_pool_t * bp,nxt_buf_t * b)1320Sigor@sysoev.ru nxt_buf_pool_free(nxt_buf_pool_t *bp, nxt_buf_t *b)
1330Sigor@sysoev.ru {
1340Sigor@sysoev.ru size_t size;
1350Sigor@sysoev.ru
1360Sigor@sysoev.ru nxt_thread_log_debug("buf pool free: %p %p", b, b->mem.start);
1370Sigor@sysoev.ru
1380Sigor@sysoev.ru size = nxt_buf_mem_size(&b->mem);
1390Sigor@sysoev.ru
1400Sigor@sysoev.ru if (bp->mmap) {
1410Sigor@sysoev.ru nxt_mem_unmap(b->mem.start, &b->mmap, size);
1420Sigor@sysoev.ru }
1430Sigor@sysoev.ru
1440Sigor@sysoev.ru if (bp->destroy) {
1450Sigor@sysoev.ru
1460Sigor@sysoev.ru if (b == bp->current) {
1470Sigor@sysoev.ru bp->current = NULL;
1480Sigor@sysoev.ru }
1490Sigor@sysoev.ru
1500Sigor@sysoev.ru nxt_buf_free(bp->mem_pool, b);
1510Sigor@sysoev.ru
1520Sigor@sysoev.ru return;
1530Sigor@sysoev.ru }
1540Sigor@sysoev.ru
1550Sigor@sysoev.ru if (bp->mmap) {
1560Sigor@sysoev.ru b->mem.pos = NULL;
1570Sigor@sysoev.ru b->mem.free = NULL;
1580Sigor@sysoev.ru nxt_buf_mem_set_size(&b->mem, size);
1590Sigor@sysoev.ru
1600Sigor@sysoev.ru } else {
1610Sigor@sysoev.ru b->mem.pos = b->mem.start;
1620Sigor@sysoev.ru b->mem.free = b->mem.start;
1630Sigor@sysoev.ru }
1640Sigor@sysoev.ru
1650Sigor@sysoev.ru if (b != bp->current) {
1660Sigor@sysoev.ru b->next = bp->free;
1670Sigor@sysoev.ru bp->free = b;
1680Sigor@sysoev.ru }
1690Sigor@sysoev.ru }
1700Sigor@sysoev.ru
1710Sigor@sysoev.ru
1720Sigor@sysoev.ru void
nxt_buf_pool_destroy(nxt_buf_pool_t * bp)1730Sigor@sysoev.ru nxt_buf_pool_destroy(nxt_buf_pool_t *bp)
1740Sigor@sysoev.ru {
175*1349Smax.romanov@nginx.com nxt_buf_t *b, *n;
1760Sigor@sysoev.ru
1770Sigor@sysoev.ru bp->destroy = 1;
1780Sigor@sysoev.ru
179*1349Smax.romanov@nginx.com for (b = bp->free; b != NULL; b = n) {
180*1349Smax.romanov@nginx.com n = b->next;
1810Sigor@sysoev.ru nxt_buf_free(bp->mem_pool, b);
1820Sigor@sysoev.ru }
1830Sigor@sysoev.ru
1840Sigor@sysoev.ru bp->free = b; /* NULL */
1850Sigor@sysoev.ru }
186