Mercurial > molko
annotate src/libmlk-core/core/alloc.c @ 320:8f9937403749
misc: improve loading of data
author | David Demelier <markand@malikania.fr> |
---|---|
date | Fri, 01 Oct 2021 20:30:00 +0200 |
parents | libmlk-core/core/alloc.c@d01e83210ca2 |
children | 460c78706989 |
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 * |
314 | 4 * Copyright (c) 2020-2021 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" |
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))) |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
269
diff
changeset
|
152 return NULL; |
269
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 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
269
diff
changeset
|
188 int |
228
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))) |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
269
diff
changeset
|
195 return -1; |
228
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 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
269
diff
changeset
|
202 return 0; |
228
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 } |