… | |
… | |
110 | static void * |
110 | static void * |
111 | u_malloc (unsigned int size) |
111 | u_malloc (unsigned int size) |
112 | { |
112 | { |
113 | void *addr; |
113 | void *addr; |
114 | |
114 | |
115 | #ifdef _WIN32 |
115 | if (!size) |
116 | HANDLE handle = CreateFileMapping (0, 0, PAGE_READWRITE, 0, size, NULL); |
|
|
117 | |
|
|
118 | if (!handle) |
|
|
119 | return 0; |
116 | return 0; |
120 | |
117 | |
|
|
118 | #ifdef _WIN32 |
|
|
119 | { |
|
|
120 | HANDLE handle = CreateFileMapping (0, 0, PAGE_READWRITE, 0, size, NULL); |
|
|
121 | |
|
|
122 | addr = 0; |
|
|
123 | if (handle) |
|
|
124 | { |
121 | addr = MapViewOfFile (handle, FILE_MAP_WRITE, 0, 0, size); |
125 | addr = MapViewOfFile (handle, FILE_MAP_WRITE, 0, 0, size); |
122 | |
|
|
123 | CloseHandle (handle); |
126 | CloseHandle (handle); |
|
|
127 | } |
|
|
128 | } |
124 | #elif defined (MAP_ANONYMOUS) |
129 | #elif defined (MAP_ANONYMOUS) |
125 | addr = mmap (0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); |
130 | addr = mmap (0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); |
126 | |
131 | |
127 | if (addr == (void *)-1) |
132 | if (addr == (void *)-1) |
128 | addr = 0; |
133 | addr = 0; |
129 | #else |
134 | #else |
130 | addr = malloc (size); |
135 | addr = malloc (size); |
131 | #endif |
136 | #endif |
132 | |
137 | |
|
|
138 | if (!addr) |
|
|
139 | u_fatal ("memory allocation failure, aborting."); |
|
|
140 | |
133 | return addr; |
141 | return addr; |
134 | } |
142 | } |
135 | |
143 | |
136 | static void |
144 | static void |
137 | u_free (void *addr, unsigned int size) |
145 | u_free (void *addr, unsigned int size) |
138 | { |
146 | { |
|
|
147 | if (!addr) |
|
|
148 | return; |
|
|
149 | |
139 | #ifdef _WIN32 |
150 | #ifdef _WIN32 |
140 | UnmapViewOfFile (addr); |
151 | UnmapViewOfFile (addr); |
141 | #elif defined (MAP_ANONYMOUS) |
152 | #elif defined (MAP_ANONYMOUS) |
142 | munmap (addr, size); |
153 | munmap (addr, size); |
143 | #else |
154 | #else |
144 | free (addr); |
155 | free (addr); |
145 | #endif |
156 | #endif |
146 | } |
157 | } |
147 | |
158 | |
148 | static void * |
159 | static void * |
|
|
160 | u_realloc (void *addr, unsigned int old_size, unsigned int new_size) |
|
|
161 | { |
|
|
162 | void *addr2 = u_malloc (new_size); |
|
|
163 | memcpy (addr2, addr, (new_size < old_size ? new_size : old_size)); |
|
|
164 | u_free (addr, old_size); |
|
|
165 | |
|
|
166 | return addr2; |
|
|
167 | } |
|
|
168 | |
|
|
169 | static void * |
149 | u_mmap (u_handle h, unsigned int size) |
170 | u_mmap (u_handle h, unsigned int size) |
150 | { |
171 | { |
151 | void *addr; |
172 | void *addr; |
152 | |
173 | |
153 | #ifdef _WIN32 |
174 | #ifdef _WIN32 |
… | |
… | |
175 | #ifdef _WIN32 |
196 | #ifdef _WIN32 |
176 | UnmapViewOfFile (addr); |
197 | UnmapViewOfFile (addr); |
177 | #else |
198 | #else |
178 | munmap (addr, len); |
199 | munmap (addr, len); |
179 | #endif |
200 | #endif |
|
|
201 | } |
|
|
202 | |
|
|
203 | ///////////////////////////////////////////////////////////////////////////// |
|
|
204 | |
|
|
205 | typedef struct |
|
|
206 | { |
|
|
207 | char *addr; |
|
|
208 | unsigned int used; |
|
|
209 | unsigned int size; |
|
|
210 | } u_dynbuf; |
|
|
211 | |
|
|
212 | static void * |
|
|
213 | u_dynbuf_append (u_dynbuf *dynbuf, void *data, unsigned int len) |
|
|
214 | { |
|
|
215 | char *dest; |
|
|
216 | |
|
|
217 | if ((dynbuf->used += len) > dynbuf->size) |
|
|
218 | { |
|
|
219 | unsigned int new_size = dynbuf->size ? dynbuf->size * 2 : 4096; |
|
|
220 | dynbuf->addr = u_realloc (dynbuf->addr, dynbuf->size, new_size); |
|
|
221 | dynbuf->size = new_size; |
|
|
222 | } |
|
|
223 | |
|
|
224 | dest = dynbuf->addr + dynbuf->used - len; |
|
|
225 | |
|
|
226 | if (data) |
|
|
227 | memcpy (dest, data, len); |
|
|
228 | |
|
|
229 | return dest; |
180 | } |
230 | } |
181 | |
231 | |
182 | ///////////////////////////////////////////////////////////////////////////// |
232 | ///////////////////////////////////////////////////////////////////////////// |
183 | |
233 | |
184 | static void |
234 | static void |