annotate include/jeffpc/mem.h @ 622:e7ac3c21c816

mem: include alloca.h only if it exists Some OSes (notably FreeBSD) do not have alloca.h at all. Instead, they define alloca in stdlib.h. Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
date Sat, 03 Nov 2018 07:43:27 -0400
parents 73bad8a04d54
children d018af7c979c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
38
90f182a38741 fakeumem: include internal fall-back to missing libumem
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
1 /*
425
a5834cf65509 mem: reorder mem.h contents to be more logical
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 203
diff changeset
2 * Copyright (c) 2015-2018 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
38
90f182a38741 fakeumem: include internal fall-back to missing libumem
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
3 *
90f182a38741 fakeumem: include internal fall-back to missing libumem
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
90f182a38741 fakeumem: include internal fall-back to missing libumem
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
5 * of this software and associated documentation files (the "Software"), to deal
90f182a38741 fakeumem: include internal fall-back to missing libumem
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
6 * in the Software without restriction, including without limitation the rights
90f182a38741 fakeumem: include internal fall-back to missing libumem
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
90f182a38741 fakeumem: include internal fall-back to missing libumem
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
8 * copies of the Software, and to permit persons to whom the Software is
90f182a38741 fakeumem: include internal fall-back to missing libumem
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
9 * furnished to do so, subject to the following conditions:
90f182a38741 fakeumem: include internal fall-back to missing libumem
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
10 *
90f182a38741 fakeumem: include internal fall-back to missing libumem
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
11 * The above copyright notice and this permission notice shall be included in
90f182a38741 fakeumem: include internal fall-back to missing libumem
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
12 * all copies or substantial portions of the Software.
90f182a38741 fakeumem: include internal fall-back to missing libumem
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
13 *
90f182a38741 fakeumem: include internal fall-back to missing libumem
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
90f182a38741 fakeumem: include internal fall-back to missing libumem
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
90f182a38741 fakeumem: include internal fall-back to missing libumem
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
90f182a38741 fakeumem: include internal fall-back to missing libumem
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
90f182a38741 fakeumem: include internal fall-back to missing libumem
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
90f182a38741 fakeumem: include internal fall-back to missing libumem
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
90f182a38741 fakeumem: include internal fall-back to missing libumem
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
20 * SOFTWARE.
90f182a38741 fakeumem: include internal fall-back to missing libumem
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
21 */
90f182a38741 fakeumem: include internal fall-back to missing libumem
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
22
140
aa39202a5963 mem: add a slab allocator API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 38
diff changeset
23 #ifndef __JEFFPC_MEM_H
aa39202a5963 mem: add a slab allocator API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 38
diff changeset
24 #define __JEFFPC_MEM_H
38
90f182a38741 fakeumem: include internal fall-back to missing libumem
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
25
90f182a38741 fakeumem: include internal fall-back to missing libumem
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
26 #include <stdlib.h>
90f182a38741 fakeumem: include internal fall-back to missing libumem
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
27 #include <stdint.h>
622
e7ac3c21c816 mem: include alloca.h only if it exists
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 459
diff changeset
28 #include <string.h>
e7ac3c21c816 mem: include alloca.h only if it exists
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 459
diff changeset
29
e7ac3c21c816 mem: include alloca.h only if it exists
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 459
diff changeset
30 #include <jeffpc/config.h>
e7ac3c21c816 mem: include alloca.h only if it exists
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 459
diff changeset
31
e7ac3c21c816 mem: include alloca.h only if it exists
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 459
diff changeset
32 #ifdef JEFFPC_HAVE_ALLOCA_H
203
2d846ea0fa61 mem: include alloca.h to avoid portability hickups
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 202
diff changeset
33 #include <alloca.h>
622
e7ac3c21c816 mem: include alloca.h only if it exists
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 459
diff changeset
34 #endif
38
90f182a38741 fakeumem: include internal fall-back to missing libumem
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
35
90f182a38741 fakeumem: include internal fall-back to missing libumem
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
36 /*
425
a5834cf65509 mem: reorder mem.h contents to be more logical
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 203
diff changeset
37 * zeroed allocation
a5834cf65509 mem: reorder mem.h contents to be more logical
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 203
diff changeset
38 */
a5834cf65509 mem: reorder mem.h contents to be more logical
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 203
diff changeset
39
426
707093cb9e0f mem: rename zalloc() to mem_zalloc() to be consistent
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 425
diff changeset
40 #define zalloc(len) mem_zalloc(len)
707093cb9e0f mem: rename zalloc() to mem_zalloc() to be consistent
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 425
diff changeset
41 static inline void *mem_zalloc(size_t len)
425
a5834cf65509 mem: reorder mem.h contents to be more logical
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 203
diff changeset
42 {
a5834cf65509 mem: reorder mem.h contents to be more logical
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 203
diff changeset
43 void *buf;
a5834cf65509 mem: reorder mem.h contents to be more logical
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 203
diff changeset
44
a5834cf65509 mem: reorder mem.h contents to be more logical
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 203
diff changeset
45 buf = malloc(len);
a5834cf65509 mem: reorder mem.h contents to be more logical
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 203
diff changeset
46 if (buf)
a5834cf65509 mem: reorder mem.h contents to be more logical
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 203
diff changeset
47 memset(buf, 0, len);
a5834cf65509 mem: reorder mem.h contents to be more logical
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 203
diff changeset
48
a5834cf65509 mem: reorder mem.h contents to be more logical
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 203
diff changeset
49 return buf;
a5834cf65509 mem: reorder mem.h contents to be more logical
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 203
diff changeset
50 }
a5834cf65509 mem: reorder mem.h contents to be more logical
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 203
diff changeset
51
427
48298d12ab26 mem: add mem_freezero() to clear a buffer before freeing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 426
diff changeset
52 static inline void mem_freezero(void *buf, size_t len)
48298d12ab26 mem: add mem_freezero() to clear a buffer before freeing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 426
diff changeset
53 {
48298d12ab26 mem: add mem_freezero() to clear a buffer before freeing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 426
diff changeset
54 if (!buf)
48298d12ab26 mem: add mem_freezero() to clear a buffer before freeing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 426
diff changeset
55 return;
48298d12ab26 mem: add mem_freezero() to clear a buffer before freeing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 426
diff changeset
56
48298d12ab26 mem: add mem_freezero() to clear a buffer before freeing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 426
diff changeset
57 memset(buf, 0, len);
48298d12ab26 mem: add mem_freezero() to clear a buffer before freeing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 426
diff changeset
58
48298d12ab26 mem: add mem_freezero() to clear a buffer before freeing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 426
diff changeset
59 free(buf);
48298d12ab26 mem: add mem_freezero() to clear a buffer before freeing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 426
diff changeset
60 }
48298d12ab26 mem: add mem_freezero() to clear a buffer before freeing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 426
diff changeset
61
425
a5834cf65509 mem: reorder mem.h contents to be more logical
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 203
diff changeset
62 /*
430
df53edaf06a4 mem: add mem_re{,c}allocarray() to improve portability
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 428
diff changeset
63 * array allocator
df53edaf06a4 mem: add mem_re{,c}allocarray() to improve portability
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 428
diff changeset
64 */
df53edaf06a4 mem: add mem_re{,c}allocarray() to improve portability
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 428
diff changeset
65 extern void *mem_reallocarray(void *ptr, size_t nelem, size_t size);
df53edaf06a4 mem: add mem_re{,c}allocarray() to improve portability
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 428
diff changeset
66 extern void *mem_recallocarray(void *ptr, size_t old_nelem, size_t new_nelem,
df53edaf06a4 mem: add mem_re{,c}allocarray() to improve portability
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 428
diff changeset
67 size_t size);
df53edaf06a4 mem: add mem_re{,c}allocarray() to improve portability
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 428
diff changeset
68
df53edaf06a4 mem: add mem_re{,c}allocarray() to improve portability
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 428
diff changeset
69 /*
140
aa39202a5963 mem: add a slab allocator API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 38
diff changeset
70 * slab allocator
38
90f182a38741 fakeumem: include internal fall-back to missing libumem
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
71 */
90f182a38741 fakeumem: include internal fall-back to missing libumem
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
72
140
aa39202a5963 mem: add a slab allocator API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 38
diff changeset
73 struct mem_cache {
163
9047d73ca3a6 slab: allocate a real struct instead of abusing the struct mem_cache pointer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 140
diff changeset
74 size_t size;
9047d73ca3a6 slab: allocate a real struct instead of abusing the struct mem_cache pointer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 140
diff changeset
75 size_t align;
140
aa39202a5963 mem: add a slab allocator API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 38
diff changeset
76 };
38
90f182a38741 fakeumem: include internal fall-back to missing libumem
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
77
140
aa39202a5963 mem: add a slab allocator API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 38
diff changeset
78 extern struct mem_cache *mem_cache_create(char *name, size_t size, size_t align);
aa39202a5963 mem: add a slab allocator API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 38
diff changeset
79 extern void mem_cache_destroy(struct mem_cache *cache);
38
90f182a38741 fakeumem: include internal fall-back to missing libumem
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
80
140
aa39202a5963 mem: add a slab allocator API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 38
diff changeset
81 extern void *mem_cache_alloc(struct mem_cache *cache);
aa39202a5963 mem: add a slab allocator API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 38
diff changeset
82 extern void mem_cache_free(struct mem_cache *cache, void *buf);
38
90f182a38741 fakeumem: include internal fall-back to missing libumem
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
83
90f182a38741 fakeumem: include internal fall-back to missing libumem
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
84 #endif