Mercurial > molko
annotate src/libmlk-core/core/alloc.c @ 423:63ebfa352ae1
core: use err.h in font
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sat, 15 Oct 2022 14:00:38 +0200 |
parents | 7321511052f6 |
children |
rev | line source |
---|---|
182
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * alloc.h -- custom allocators |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
378
460c78706989
misc: update copyright years
David Demelier <markand@malikania.fr>
parents:
320
diff
changeset
|
4 * Copyright (c) 2020-2022 David Demelier <markand@malikania.fr> |
182
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 #include <assert.h> |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 #include <errno.h> |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 #include <stdlib.h> |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 #include <string.h> |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 |
252
95c2c4a72410
core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
24 #include <SDL.h> |
95c2c4a72410
core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
25 |
182
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
26 #include "alloc.h" |
402
d3fa956cdaf0
core: add alloc_sdupf
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
27 #include "buf.h" |
182
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
28 #include "error.h" |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 #include "panic.h" |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 static void * |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
32 panic_alloc(size_t size) |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 { |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 void *mem; |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 if (!(mem = malloc(size))) |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 panicf("%s", strerror(errno)); |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 return mem; |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 } |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
41 |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 static void * |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 panic_realloc(void *ptr, size_t size) |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 { |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
45 void *mem; |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 |
188
cbce9143bf87
core: allow realloc of 0 for duktape
David Demelier <markand@malikania.fr>
parents:
182
diff
changeset
|
47 if (!(mem = realloc(ptr, size)) && size != 0) |
182
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 panicf("%s", strerror(errno)); |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 return mem; |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 } |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
52 |
252
95c2c4a72410
core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
53 static const struct alloc_funcs default_alloc_funcs = { |
182
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 .alloc = panic_alloc, |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
55 .realloc = panic_realloc, |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
56 .free = free |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
57 }; |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
58 |
252
95c2c4a72410
core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
59 static const struct alloc_funcs *funcs = &default_alloc_funcs; |
95c2c4a72410
core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
60 |
95c2c4a72410
core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
61 void |
95c2c4a72410
core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
62 alloc_set(const struct alloc_funcs *newfuncs) |
95c2c4a72410
core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
63 { |
95c2c4a72410
core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
64 assert(funcs); |
95c2c4a72410
core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
65 assert(funcs->alloc); |
95c2c4a72410
core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
66 assert(funcs->realloc); |
95c2c4a72410
core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
67 assert(funcs->free); |
95c2c4a72410
core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
68 |
95c2c4a72410
core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
69 funcs = newfuncs; |
95c2c4a72410
core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
70 |
95c2c4a72410
core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
71 /* Change SDL allocators as well. */ |
95c2c4a72410
core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
72 SDL_SetMemoryFunctions(alloc_new, alloc_array0, alloc_renew, free); |
95c2c4a72410
core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
73 } |
95c2c4a72410
core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
74 |
182
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
75 void * |
227
befa2e855d3b
core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents:
188
diff
changeset
|
76 alloc_new(size_t size) |
befa2e855d3b
core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents:
188
diff
changeset
|
77 { |
befa2e855d3b
core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents:
188
diff
changeset
|
78 assert(size != 0); |
befa2e855d3b
core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents:
188
diff
changeset
|
79 |
252
95c2c4a72410
core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
80 return funcs->alloc(size); |
227
befa2e855d3b
core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents:
188
diff
changeset
|
81 } |
befa2e855d3b
core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents:
188
diff
changeset
|
82 |
befa2e855d3b
core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents:
188
diff
changeset
|
83 void * |
befa2e855d3b
core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents:
188
diff
changeset
|
84 alloc_new0(size_t size) |
befa2e855d3b
core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents:
188
diff
changeset
|
85 { |
befa2e855d3b
core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents:
188
diff
changeset
|
86 assert(size != 0); |
befa2e855d3b
core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents:
188
diff
changeset
|
87 |
404
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
88 return memset(funcs->alloc(size), 0, size); |
227
befa2e855d3b
core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents:
188
diff
changeset
|
89 } |
befa2e855d3b
core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents:
188
diff
changeset
|
90 |
befa2e855d3b
core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents:
188
diff
changeset
|
91 void * |
269
9b758eb84556
core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents:
252
diff
changeset
|
92 alloc_array(size_t len, size_t elemsize) |
182
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
93 { |
269
9b758eb84556
core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents:
252
diff
changeset
|
94 assert(len != 0); |
9b758eb84556
core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents:
252
diff
changeset
|
95 assert(elemsize != 0); |
182
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
96 |
404
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
97 return funcs->alloc(len * elemsize); |
182
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
98 } |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
99 |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
100 void * |
269
9b758eb84556
core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents:
252
diff
changeset
|
101 alloc_array0(size_t len, size_t elemsize) |
182
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
102 { |
269
9b758eb84556
core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents:
252
diff
changeset
|
103 assert(len != 0); |
9b758eb84556
core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents:
252
diff
changeset
|
104 assert(elemsize != 0); |
182
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
105 |
404
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
106 return alloc_new0(len * elemsize); |
182
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
107 } |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
108 |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
109 void * |
269
9b758eb84556
core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents:
252
diff
changeset
|
110 alloc_renew(void *ptr, size_t size) |
227
befa2e855d3b
core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents:
188
diff
changeset
|
111 { |
269
9b758eb84556
core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents:
252
diff
changeset
|
112 return funcs->realloc(ptr, size); |
227
befa2e855d3b
core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents:
188
diff
changeset
|
113 } |
befa2e855d3b
core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents:
188
diff
changeset
|
114 |
befa2e855d3b
core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents:
188
diff
changeset
|
115 void * |
269
9b758eb84556
core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents:
252
diff
changeset
|
116 alloc_rearray(void *ptr, size_t len, size_t elemsize) |
227
befa2e855d3b
core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents:
188
diff
changeset
|
117 { |
404
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
118 assert(elemsize != 0); |
227
befa2e855d3b
core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents:
188
diff
changeset
|
119 |
404
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
120 return funcs->realloc(ptr, len * elemsize); |
269
9b758eb84556
core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents:
252
diff
changeset
|
121 } |
9b758eb84556
core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents:
252
diff
changeset
|
122 |
9b758eb84556
core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents:
252
diff
changeset
|
123 void * |
9b758eb84556
core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents:
252
diff
changeset
|
124 alloc_rearray0(void *ptr, size_t oldlen, size_t newlen, size_t elemsize) |
9b758eb84556
core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents:
252
diff
changeset
|
125 { |
404
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
126 ptr = funcs->realloc(ptr, newlen * elemsize); |
269
9b758eb84556
core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents:
252
diff
changeset
|
127 |
9b758eb84556
core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents:
252
diff
changeset
|
128 if (newlen > oldlen) |
9b758eb84556
core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents:
252
diff
changeset
|
129 memset((unsigned char *)ptr + (oldlen * elemsize), 0, (newlen - oldlen) * elemsize); |
9b758eb84556
core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents:
252
diff
changeset
|
130 |
9b758eb84556
core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents:
252
diff
changeset
|
131 return ptr; |
227
befa2e855d3b
core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents:
188
diff
changeset
|
132 } |
befa2e855d3b
core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents:
188
diff
changeset
|
133 |
befa2e855d3b
core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents:
188
diff
changeset
|
134 void * |
182
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
135 alloc_dup(const void *ptr, size_t size) |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
136 { |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
137 assert(ptr); |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
138 assert(size != 0); |
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
139 |
404
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
140 return memcpy(funcs->alloc(size), ptr, size); |
182
f6497ec74b49
core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
141 } |
227
befa2e855d3b
core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents:
188
diff
changeset
|
142 |
befa2e855d3b
core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents:
188
diff
changeset
|
143 char * |
befa2e855d3b
core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents:
188
diff
changeset
|
144 alloc_sdup(const char *src) |
befa2e855d3b
core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents:
188
diff
changeset
|
145 { |
befa2e855d3b
core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents:
188
diff
changeset
|
146 assert(src); |
befa2e855d3b
core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents:
188
diff
changeset
|
147 |
404
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
148 size_t len = strlen(src) + 1; |
227
befa2e855d3b
core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents:
188
diff
changeset
|
149 |
404
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
150 return memcpy(funcs->alloc(len), src, len); |
227
befa2e855d3b
core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents:
188
diff
changeset
|
151 } |
228
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
152 |
402
d3fa956cdaf0
core: add alloc_sdupf
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
153 char * |
d3fa956cdaf0
core: add alloc_sdupf
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
154 alloc_sdupf(const char *fmt, ...) |
d3fa956cdaf0
core: add alloc_sdupf
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
155 { |
d3fa956cdaf0
core: add alloc_sdupf
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
156 struct buf buf = {0}; |
d3fa956cdaf0
core: add alloc_sdupf
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
157 va_list ap; |
d3fa956cdaf0
core: add alloc_sdupf
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
158 |
d3fa956cdaf0
core: add alloc_sdupf
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
159 va_start(ap, fmt); |
d3fa956cdaf0
core: add alloc_sdupf
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
160 buf_vprintf(&buf, fmt, ap); |
d3fa956cdaf0
core: add alloc_sdupf
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
161 va_end(ap); |
d3fa956cdaf0
core: add alloc_sdupf
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
162 |
404
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
163 return buf.data; |
402
d3fa956cdaf0
core: add alloc_sdupf
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
164 } |
d3fa956cdaf0
core: add alloc_sdupf
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
165 |
404
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
166 void |
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
167 alloc_free(void *ptr) |
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
168 { |
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
169 funcs->free(ptr); |
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
170 } |
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
171 |
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
172 void |
228
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
173 alloc_pool_init(struct alloc_pool *pool, size_t elemsize, void (*finalizer)(void *)) |
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
174 { |
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
175 assert(pool); |
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
176 assert(elemsize != 0); |
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
177 |
404
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
178 pool->data = alloc_array(ALLOC_POOL_INIT_DEFAULT, elemsize); |
228
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
179 pool->elemsize = elemsize; |
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
180 pool->size = 0; |
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
181 pool->capacity = ALLOC_POOL_INIT_DEFAULT; |
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
182 pool->finalizer = finalizer; |
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
183 } |
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
184 |
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
185 void * |
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
186 alloc_pool_new(struct alloc_pool *pool) |
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
187 { |
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
188 assert(pool); |
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
189 |
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
190 if (pool->size >= pool->capacity) { |
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
191 pool->capacity *= 2; |
404
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
192 pool->data = alloc_rearray(pool->data, pool->capacity, pool->elemsize); |
228
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
193 } |
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
194 |
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
195 return ((unsigned char *)pool->data) + pool->size++ * pool->elemsize; |
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
196 } |
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
197 |
237
1bf5bd306bb0
core: add alloc_pool_get function
David Demelier <markand@malikania.fr>
parents:
228
diff
changeset
|
198 void * |
1bf5bd306bb0
core: add alloc_pool_get function
David Demelier <markand@malikania.fr>
parents:
228
diff
changeset
|
199 alloc_pool_get(const struct alloc_pool *pool, size_t index) |
1bf5bd306bb0
core: add alloc_pool_get function
David Demelier <markand@malikania.fr>
parents:
228
diff
changeset
|
200 { |
1bf5bd306bb0
core: add alloc_pool_get function
David Demelier <markand@malikania.fr>
parents:
228
diff
changeset
|
201 assert(pool); |
1bf5bd306bb0
core: add alloc_pool_get function
David Demelier <markand@malikania.fr>
parents:
228
diff
changeset
|
202 assert(index < pool->size); |
1bf5bd306bb0
core: add alloc_pool_get function
David Demelier <markand@malikania.fr>
parents:
228
diff
changeset
|
203 |
1bf5bd306bb0
core: add alloc_pool_get function
David Demelier <markand@malikania.fr>
parents:
228
diff
changeset
|
204 return ((unsigned char *)pool->data) + index * pool->elemsize; |
1bf5bd306bb0
core: add alloc_pool_get function
David Demelier <markand@malikania.fr>
parents:
228
diff
changeset
|
205 } |
1bf5bd306bb0
core: add alloc_pool_get function
David Demelier <markand@malikania.fr>
parents:
228
diff
changeset
|
206 |
404
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
207 void * |
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
208 alloc_pool_shrink(struct alloc_pool *pool) |
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
209 { |
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
210 assert(pool); |
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
211 |
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
212 void *ptr; |
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
213 |
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
214 ptr = alloc_rearray(pool->data, pool->size, pool->elemsize); |
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
215 memset(pool, 0, sizeof (*pool)); |
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
216 |
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
217 return ptr; |
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
218 } |
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
219 |
228
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
220 void |
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
221 alloc_pool_finish(struct alloc_pool *pool) |
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
222 { |
404
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
223 unsigned char *tab; |
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
224 |
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
225 if (!pool) |
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
226 return; |
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
227 |
228
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
228 if (pool->finalizer) { |
404
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
402
diff
changeset
|
229 tab = pool->data; |
228
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
230 |
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
231 for (size_t i = 0; i < pool->size; ++i) |
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
232 pool->finalizer(tab + i * pool->elemsize); |
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
233 } |
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
234 |
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
235 free(pool->data); |
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
236 memset(pool, 0, sizeof (*pool)); |
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
237 } |