comparison libmlk-core/core/alloc.c @ 252:95c2c4a72410

core: add alloc_set to set SDL allocators as well
author David Demelier <markand@malikania.fr>
date Tue, 01 Dec 2020 21:53:23 +0100
parents 71b3b7036de7
children 9b758eb84556
comparison
equal deleted inserted replaced
251:a6a850e65d23 252:95c2c4a72410
19 #include <assert.h> 19 #include <assert.h>
20 #include <errno.h> 20 #include <errno.h>
21 #include <stdlib.h> 21 #include <stdlib.h>
22 #include <string.h> 22 #include <string.h>
23 23
24 #include <SDL.h>
25
24 #include "alloc.h" 26 #include "alloc.h"
25 #include "error.h" 27 #include "error.h"
26 #include "panic.h" 28 #include "panic.h"
27 29
28 static void * 30 static void *
45 panicf("%s", strerror(errno)); 47 panicf("%s", strerror(errno));
46 48
47 return mem; 49 return mem;
48 } 50 }
49 51
50 struct allocator allocator = { 52 static const struct alloc_funcs default_alloc_funcs = {
51 .alloc = panic_alloc, 53 .alloc = panic_alloc,
52 .realloc = panic_realloc, 54 .realloc = panic_realloc,
53 .free = free 55 .free = free
54 }; 56 };
55 57
58 static const struct alloc_funcs *funcs = &default_alloc_funcs;
59
60 void
61 alloc_set(const struct alloc_funcs *newfuncs)
62 {
63 assert(funcs);
64 assert(funcs->alloc);
65 assert(funcs->realloc);
66 assert(funcs->free);
67
68 funcs = newfuncs;
69
70 /* Change SDL allocators as well. */
71 SDL_SetMemoryFunctions(alloc_new, alloc_array0, alloc_renew, free);
72 }
73
56 void * 74 void *
57 alloc_new(size_t size) 75 alloc_new(size_t size)
58 { 76 {
59 assert(size != 0); 77 assert(size != 0);
60 78
61 return allocator.alloc(size); 79 return funcs->alloc(size);
62 } 80 }
63 81
64 void * 82 void *
65 alloc_new0(size_t size) 83 alloc_new0(size_t size)
66 { 84 {
67 assert(size != 0); 85 assert(size != 0);
68 86
69 void *ptr; 87 void *ptr;
70 88
71 if ((ptr = allocator.alloc(size))) 89 if ((ptr = funcs->alloc(size)))
72 memset(ptr, 0, size); 90 memset(ptr, 0, size);
73 91
74 return ptr; 92 return ptr;
75 } 93 }
76 94
83 size_t total = n * size; 101 size_t total = n * size;
84 102
85 if (total / n != size) 103 if (total / n != size)
86 return errorf("%s", strerror(ENOMEM)), NULL; 104 return errorf("%s", strerror(ENOMEM)), NULL;
87 105
88 return allocator.alloc(total); 106 return funcs->alloc(total);
89 } 107 }
90 108
91 void * 109 void *
92 alloc_array0(size_t n, size_t size) 110 alloc_array0(size_t n, size_t size)
93 { 111 {
98 size_t total = n * size; 116 size_t total = n * size;
99 117
100 if (total / n != size) 118 if (total / n != size)
101 return errorf("%s", strerror(ENOMEM)), NULL; 119 return errorf("%s", strerror(ENOMEM)), NULL;
102 120
103 if ((mem = allocator.alloc(total))) 121 if ((mem = funcs->alloc(total)))
104 memset(mem, 0, total); 122 memset(mem, 0, total);
105 123
106 return mem; 124 return mem;
107 } 125 }
108 126
109 void * 127 void *
110 alloc_renew(void *ptr, size_t amount) 128 alloc_renew(void *ptr, size_t amount)
111 { 129 {
112 return allocator.realloc(ptr, amount); 130 return funcs->realloc(ptr, amount);
113 } 131 }
114 132
115 void * 133 void *
116 alloc_rearray(void *ptr, size_t n, size_t size) 134 alloc_rearray(void *ptr, size_t n, size_t size)
117 { 135 {
118 size_t total = n * size; 136 size_t total = n * size;
119 137
120 if (total / n != size) 138 if (total / n != size)
121 return errorf("%s", strerror(ENOMEM)), NULL; 139 return errorf("%s", strerror(ENOMEM)), NULL;
122 140
123 return allocator.realloc(ptr, total); 141 return funcs->realloc(ptr, total);
124 } 142 }
125 143
126 void * 144 void *
127 alloc_dup(const void *ptr, size_t size) 145 alloc_dup(const void *ptr, size_t size)
128 { 146 {
129 assert(ptr); 147 assert(ptr);
130 assert(size != 0); 148 assert(size != 0);
131 149
132 void *mem; 150 void *mem;
133 151
134 if ((mem = allocator.alloc(size))) 152 if ((mem = funcs->alloc(size)))
135 memcpy(mem, ptr, size); 153 memcpy(mem, ptr, size);
136 154
137 return mem; 155 return mem;
138 } 156 }
139 157
143 assert(src); 161 assert(src);
144 162
145 char *ret; 163 char *ret;
146 size_t length = strlen(src) + 1; 164 size_t length = strlen(src) + 1;
147 165
148 if ((ret = allocator.alloc(length))) 166 if ((ret = funcs->alloc(length)))
149 memcpy(ret, src, length + 1); 167 memcpy(ret, src, length + 1);
150 168
151 return ret; 169 return ret;
152 } 170 }
153 171