1 /* 2 * ngtcp2 3 * 4 * Copyright (c) 2022 ngtcp2 contributors 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining 7 * a copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation the rights to use, copy, modify, merge, publish, 10 * distribute, sublicense, and/or sell copies of the Software, and to 11 * permit persons to whom the Software is furnished to do so, subject to 12 * the following conditions: 13 * 14 * The above copyright notice and this permission notice shall be 15 * included in all copies or substantial portions of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 20 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 21 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 22 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 23 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 */ 25 #ifndef NGTCP2_BALLOC_H 26 #define NGTCP2_BALLOC_H 27 28 #ifdef HAVE_CONFIG_H 29 # include <config.h> 30 #endif /* HAVE_CONFIG_H */ 31 32 #include <ngtcp2/ngtcp2.h> 33 34 #include "ngtcp2_buf.h" 35 36 typedef struct ngtcp2_memblock_hd ngtcp2_memblock_hd; 37 38 /* 39 * ngtcp2_memblock_hd is the header of memory block. 40 */ 41 struct ngtcp2_memblock_hd { 42 ngtcp2_memblock_hd *next; 43 }; 44 45 /* 46 * ngtcp2_balloc is a custom memory allocator. It allocates |blklen| 47 * bytes of memory at once on demand, and returns its slice when the 48 * allocation is requested. 49 */ 50 typedef struct ngtcp2_balloc { 51 /* mem is the underlying memory allocator. */ 52 const ngtcp2_mem *mem; 53 /* blklen is the size of memory block. */ 54 size_t blklen; 55 /* head points to the list of memory block allocated so far. */ 56 ngtcp2_memblock_hd *head; 57 /* buf wraps the current memory block for allocation requests. */ 58 ngtcp2_buf buf; 59 } ngtcp2_balloc; 60 61 /* 62 * ngtcp2_balloc_init initializes |balloc| with |blklen| which is the 63 * size of memory block. 64 */ 65 void ngtcp2_balloc_init(ngtcp2_balloc *balloc, size_t blklen, 66 const ngtcp2_mem *mem); 67 68 /* 69 * ngtcp2_balloc_free releases all allocated memory blocks. 70 */ 71 void ngtcp2_balloc_free(ngtcp2_balloc *balloc); 72 73 /* 74 * ngtcp2_balloc_get allocates |n| bytes of memory and assigns its 75 * pointer to |*pbuf|. 76 * 77 * It returns 0 if it succeeds, or one of the following negative error 78 * codes: 79 * 80 * NGTCP2_ERR_NOMEM 81 * Out of memory. 82 */ 83 int ngtcp2_balloc_get(ngtcp2_balloc *balloc, void **pbuf, size_t n); 84 85 /* 86 * ngtcp2_balloc_clear releases all allocated memory blocks and 87 * initializes its state. 88 */ 89 void ngtcp2_balloc_clear(ngtcp2_balloc *balloc); 90 91 #endif /* NGTCP2_BALLOC_H */ 92