xref: /unit/src/nxt_buf_pool.c (revision 1349:d9bdbfc22a6e)
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