Mercurial > libjeffpc
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 |
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 |