1/* 2 * nghttp3 3 * 4 * Copyright (c) 2022 nghttp3 contributors 5 * Copyright (c) 2022 ngtcp2 contributors 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining 8 * a copy of this software and associated documentation files (the 9 * "Software"), to deal in the Software without restriction, including 10 * without limitation the rights to use, copy, modify, merge, publish, 11 * distribute, sublicense, and/or sell copies of the Software, and to 12 * permit persons to whom the Software is furnished to do so, subject to 13 * the following conditions: 14 * 15 * The above copyright notice and this permission notice shall be 16 * included in all copies or substantial portions of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 19 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 21 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 22 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 23 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 24 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 */ 26#include "nghttp3_balloc.h" 27 28#include <assert.h> 29 30#include "nghttp3_mem.h" 31 32void nghttp3_balloc_init(nghttp3_balloc *balloc, size_t blklen, 33 const nghttp3_mem *mem) { 34 assert((blklen & 0xfu) == 0); 35 36 balloc->mem = mem; 37 balloc->blklen = blklen; 38 balloc->head = NULL; 39 nghttp3_buf_wrap_init(&balloc->buf, (void *)"", 0); 40} 41 42void nghttp3_balloc_free(nghttp3_balloc *balloc) { 43 if (balloc == NULL) { 44 return; 45 } 46 47 nghttp3_balloc_clear(balloc); 48} 49 50void nghttp3_balloc_clear(nghttp3_balloc *balloc) { 51 nghttp3_memblock_hd *p, *next; 52 53 for (p = balloc->head; p; p = next) { 54 next = p->next; 55 nghttp3_mem_free(balloc->mem, p); 56 } 57 58 balloc->head = NULL; 59 nghttp3_buf_wrap_init(&balloc->buf, (void *)"", 0); 60} 61 62int nghttp3_balloc_get(nghttp3_balloc *balloc, void **pbuf, size_t n) { 63 uint8_t *p; 64 nghttp3_memblock_hd *hd; 65 66 assert(n <= balloc->blklen); 67 68 if (nghttp3_buf_left(&balloc->buf) < n) { 69 p = nghttp3_mem_malloc(balloc->mem, sizeof(nghttp3_memblock_hd) + 0x10u + 70 balloc->blklen); 71 if (p == NULL) { 72 return NGHTTP3_ERR_NOMEM; 73 } 74 75 hd = (nghttp3_memblock_hd *)(void *)p; 76 hd->next = balloc->head; 77 balloc->head = hd; 78 nghttp3_buf_wrap_init( 79 &balloc->buf, 80 (uint8_t *)(((uintptr_t)p + sizeof(nghttp3_memblock_hd) + 0xfu) & 81 ~(uintptr_t)0xfu), 82 balloc->blklen); 83 } 84 85 assert(((uintptr_t)balloc->buf.last & 0xfu) == 0); 86 87 *pbuf = balloc->buf.last; 88 balloc->buf.last += (n + 0xfu) & ~(uintptr_t)0xfu; 89 90 return 0; 91} 92