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