129 size_t block, blocks, lastblocks,
start;
141 if (mdp -> mmalloc_hook !=
NULL)
143 return ((*mdp -> mmalloc_hook) (md,
size));
166 while ((
size /= 2) != 0)
173 next = mdp -> fraghead[log].next;
186 if (--mdp -> heapinfo[block].busy.info.frag.nfree != 0)
188 mdp -> heapinfo[block].busy.info.frag.first =
193 mdp -> heapstats.chunks_used++;
194 mdp -> heapstats.bytes_used += 1 << log;
195 mdp -> heapstats.chunks_free--;
196 mdp -> heapstats.bytes_free -= 1 << log;
209 for (i = 1; i < (size_t) (
BLOCKSIZE >> log); ++i)
212 next ->
next = mdp -> fraghead[log].next;
213 next ->
prev = &mdp -> fraghead[log];
223 mdp -> heapinfo[block].busy.type = log;
224 mdp -> heapinfo[block].busy.info.frag.nfree = i - 1;
225 mdp -> heapinfo[block].busy.info.frag.first = i - 1;
227 mdp -> heapstats.chunks_free += (
BLOCKSIZE >> log) - 1;
228 mdp -> heapstats.bytes_free +=
BLOCKSIZE - (1 << log);
229 mdp -> heapstats.bytes_used -=
BLOCKSIZE - (1 << log);
240 while (mdp -> heapinfo[block].
free.size < blocks)
242 block = mdp -> heapinfo[block].free.next;
248 block = mdp -> heapinfo[0].free.prev;
249 lastblocks = mdp -> heapinfo[block].free.size;
250 if (mdp -> heaplimit != 0 &&
251 block + lastblocks == mdp -> heaplimit &&
258 block = mdp -> heapinfo[0].free.prev;
260 mdp -> heapinfo[block].free.size += (blocks - lastblocks);
261 mdp -> heapstats.bytes_free +=
271 mdp -> heapinfo[block].busy.type = 0;
272 mdp -> heapinfo[block].busy.info.size = blocks;
273 mdp -> heapstats.chunks_used++;
274 mdp -> heapstats.bytes_used += blocks *
BLOCKSIZE;
282 if (mdp -> heapinfo[block].
free.size > blocks)
286 mdp -> heapinfo[block + blocks].free.size
287 = mdp -> heapinfo[block].free.size - blocks;
288 mdp -> heapinfo[block + blocks].free.next
289 = mdp -> heapinfo[block].free.next;
290 mdp -> heapinfo[block + blocks].free.prev
291 = mdp -> heapinfo[block].free.prev;
292 mdp -> heapinfo[mdp -> heapinfo[block].free.prev].free.next
293 = mdp -> heapinfo[mdp -> heapinfo[block].free.next].free.prev
294 = mdp -> heapindex = block + blocks;
300 mdp -> heapinfo[mdp -> heapinfo[block].free.next].free.prev
301 = mdp -> heapinfo[block].free.prev;
302 mdp -> heapinfo[mdp -> heapinfo[block].free.prev].free.next
303 = mdp -> heapindex = mdp -> heapinfo[block].free.next;
304 mdp -> heapstats.chunks_free--;
307 mdp -> heapinfo[block].busy.type = 0;
308 mdp -> heapinfo[block].busy.info.size = blocks;
309 mdp -> heapstats.chunks_used++;
310 mdp -> heapstats.bytes_used += blocks *
BLOCKSIZE;
311 mdp -> heapstats.bytes_free -= blocks *
BLOCKSIZE;