annotate libmlk-core/core/alloc.c @ 269:9b758eb84556

core: add alloc_rearray0 function
author David Demelier <markand@malikania.fr>
date Fri, 11 Dec 2020 11:33:58 +0100
parents 95c2c4a72410
children 196264679079
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 *
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2020 David Demelier <markand@malikania.fr>
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"
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 #include "error.h"
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 #include "panic.h"
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
29
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 static void *
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 panic_alloc(size_t size)
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 {
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 void *mem;
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
34
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 if (!(mem = malloc(size)))
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 panicf("%s", strerror(errno));
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
37
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 return mem;
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 }
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 static void *
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 panic_realloc(void *ptr, size_t size)
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 {
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 void *mem;
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
45
188
cbce9143bf87 core: allow realloc of 0 for duktape
David Demelier <markand@malikania.fr>
parents: 182
diff changeset
46 if (!(mem = realloc(ptr, size)) && size != 0)
182
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 panicf("%s", strerror(errno));
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
48
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 return mem;
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 }
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
51
252
95c2c4a72410 core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
52 static const struct alloc_funcs default_alloc_funcs = {
182
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 .alloc = panic_alloc,
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 .realloc = panic_realloc,
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 .free = free
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 };
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
57
252
95c2c4a72410 core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
58 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
59
95c2c4a72410 core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
60 void
95c2c4a72410 core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
61 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
62 {
95c2c4a72410 core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
63 assert(funcs);
95c2c4a72410 core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
64 assert(funcs->alloc);
95c2c4a72410 core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
65 assert(funcs->realloc);
95c2c4a72410 core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
66 assert(funcs->free);
95c2c4a72410 core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
67
95c2c4a72410 core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
68 funcs = newfuncs;
95c2c4a72410 core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
69
95c2c4a72410 core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
70 /* 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
71 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
72 }
95c2c4a72410 core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
73
182
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 void *
227
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
75 alloc_new(size_t size)
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
76 {
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
77 assert(size != 0);
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
78
252
95c2c4a72410 core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
79 return funcs->alloc(size);
227
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
80 }
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 void *
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
83 alloc_new0(size_t size)
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
84 {
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
85 assert(size != 0);
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
86
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
87 void *ptr;
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
88
252
95c2c4a72410 core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
89 if ((ptr = funcs->alloc(size)))
227
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
90 memset(ptr, 0, size);
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
91
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
92 return ptr;
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
93 }
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
94
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
95 void *
269
9b758eb84556 core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents: 252
diff changeset
96 alloc_array(size_t len, size_t elemsize)
182
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 {
269
9b758eb84556 core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents: 252
diff changeset
98 assert(len != 0);
9b758eb84556 core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents: 252
diff changeset
99 assert(elemsize != 0);
182
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
100
269
9b758eb84556 core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents: 252
diff changeset
101 size_t size = len * 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 if (size / len != elemsize)
182
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 return errorf("%s", strerror(ENOMEM)), NULL;
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
105
269
9b758eb84556 core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents: 252
diff changeset
106 return funcs->alloc(size);
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_array0(size_t len, size_t elemsize)
182
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 {
269
9b758eb84556 core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents: 252
diff changeset
112 assert(len != 0);
9b758eb84556 core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents: 252
diff changeset
113 assert(elemsize != 0);
182
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
114
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 void *mem;
269
9b758eb84556 core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents: 252
diff changeset
116 size_t size = len * elemsize;
182
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
117
269
9b758eb84556 core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents: 252
diff changeset
118 if (size / len != elemsize)
182
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 return errorf("%s", strerror(ENOMEM)), NULL;
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
120
269
9b758eb84556 core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents: 252
diff changeset
121 if ((mem = funcs->alloc(size)))
9b758eb84556 core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents: 252
diff changeset
122 memset(mem, 0, size);
182
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
123
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 return mem;
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 }
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
126
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 void *
269
9b758eb84556 core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents: 252
diff changeset
128 alloc_renew(void *ptr, size_t size)
227
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
129 {
269
9b758eb84556 core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents: 252
diff changeset
130 return funcs->realloc(ptr, size);
227
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
131 }
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 void *
269
9b758eb84556 core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents: 252
diff changeset
134 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
135 {
269
9b758eb84556 core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents: 252
diff changeset
136 size_t size = len * elemsize;
227
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
137
269
9b758eb84556 core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents: 252
diff changeset
138 if (size / len != elemsize)
227
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
139 return errorf("%s", strerror(ENOMEM)), NULL;
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
140
269
9b758eb84556 core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents: 252
diff changeset
141 return funcs->realloc(ptr, size);
9b758eb84556 core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents: 252
diff changeset
142 }
9b758eb84556 core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents: 252
diff changeset
143
9b758eb84556 core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents: 252
diff changeset
144 void *
9b758eb84556 core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents: 252
diff changeset
145 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
146 {
9b758eb84556 core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents: 252
diff changeset
147 size_t size = newlen * elemsize;
9b758eb84556 core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents: 252
diff changeset
148
9b758eb84556 core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents: 252
diff changeset
149 if (size / newlen != elemsize)
9b758eb84556 core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents: 252
diff changeset
150 return errorf("%s", strerror(ENOMEM)), NULL;
9b758eb84556 core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents: 252
diff changeset
151 if (!(ptr = funcs->realloc(ptr, size)))
9b758eb84556 core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents: 252
diff changeset
152 return false;
9b758eb84556 core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents: 252
diff changeset
153
9b758eb84556 core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents: 252
diff changeset
154 if (newlen > oldlen)
9b758eb84556 core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents: 252
diff changeset
155 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
156
9b758eb84556 core: add alloc_rearray0 function
David Demelier <markand@malikania.fr>
parents: 252
diff changeset
157 return ptr;
227
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
158 }
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
159
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
160 void *
182
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 alloc_dup(const void *ptr, size_t size)
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
162 {
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 assert(ptr);
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 assert(size != 0);
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
165
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
166 void *mem;
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
167
252
95c2c4a72410 core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
168 if ((mem = funcs->alloc(size)))
182
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
169 memcpy(mem, ptr, size);
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
170
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
171 return mem;
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents:
diff changeset
172 }
227
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
173
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
174 char *
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
175 alloc_sdup(const char *src)
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
176 {
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
177 assert(src);
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
178
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
179 char *ret;
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
180 size_t length = strlen(src) + 1;
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
181
252
95c2c4a72410 core: add alloc_set to set SDL allocators as well
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
182 if ((ret = funcs->alloc(length)))
227
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
183 memcpy(ret, src, length + 1);
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
184
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
185 return ret;
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
186 }
228
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 bool
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
189 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
190 {
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
191 assert(pool);
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
192 assert(elemsize != 0);
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 if (!(pool->data = alloc_array(ALLOC_POOL_INIT_DEFAULT, elemsize)))
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
195 return false;
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 pool->elemsize = elemsize;
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
198 pool->size = 0;
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
199 pool->capacity = ALLOC_POOL_INIT_DEFAULT;
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
200 pool->finalizer = finalizer;
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
201
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
202 return true;
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
203 }
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
204
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
205 void *
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
206 alloc_pool_new(struct alloc_pool *pool)
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
207 {
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
208 assert(pool);
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
209
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
210 if (pool->size >= pool->capacity) {
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
211 void *newptr = alloc_rearray(pool->data, pool->capacity * 2, pool->elemsize);
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
212
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
213 if (!newptr)
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
214 return NULL;
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
215
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
216 pool->data = newptr;
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
217 pool->capacity *= 2;
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
218 }
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
219
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
220 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
221 }
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
222
237
1bf5bd306bb0 core: add alloc_pool_get function
David Demelier <markand@malikania.fr>
parents: 228
diff changeset
223 void *
1bf5bd306bb0 core: add alloc_pool_get function
David Demelier <markand@malikania.fr>
parents: 228
diff changeset
224 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
225 {
1bf5bd306bb0 core: add alloc_pool_get function
David Demelier <markand@malikania.fr>
parents: 228
diff changeset
226 assert(pool);
1bf5bd306bb0 core: add alloc_pool_get function
David Demelier <markand@malikania.fr>
parents: 228
diff changeset
227 assert(index < pool->size);
1bf5bd306bb0 core: add alloc_pool_get function
David Demelier <markand@malikania.fr>
parents: 228
diff changeset
228
1bf5bd306bb0 core: add alloc_pool_get function
David Demelier <markand@malikania.fr>
parents: 228
diff changeset
229 return ((unsigned char *)pool->data) + index * pool->elemsize;
1bf5bd306bb0 core: add alloc_pool_get function
David Demelier <markand@malikania.fr>
parents: 228
diff changeset
230 }
1bf5bd306bb0 core: add alloc_pool_get function
David Demelier <markand@malikania.fr>
parents: 228
diff changeset
231
228
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
232 void
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
233 alloc_pool_finish(struct alloc_pool *pool)
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 if (pool->finalizer) {
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
236 unsigned char *tab = pool->data;
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
237
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
238 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
239 pool->finalizer(tab + i * pool->elemsize);
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
240 }
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
241
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
242 free(pool->data);
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
243 memset(pool, 0, sizeof (*pool));
2734223d3daf core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
244 }