/* Memory allocator `malloc'. */
-/* Copyright (c) 2010-2014. The SimGrid Team.
+/* Copyright (c) 2010-2015. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
return (result);
}
+/** Initialise heapinfo about the heapinfo pages :)
+ *
+ */
+static void initialize_heapinfo_heapinfo(xbt_mheap_t mdp)
+{
+ // Update heapinfo about the heapinfo pages (!):
+ xbt_assert((uintptr_t) mdp->heapinfo % BLOCKSIZE == 0);
+ int block = BLOCK(mdp->heapinfo);
+ size_t nblocks = mdp->heapsize * sizeof(malloc_info) / BLOCKSIZE;
+ // Mark them as free:
+ for (size_t j=0; j!=nblocks; ++j) {
+ mdp->heapinfo[block+j].type = MMALLOC_TYPE_FREE;
+ mdp->heapinfo[block+j].free_block.size = 0;
+ mdp->heapinfo[block+j].free_block.next = 0;
+ mdp->heapinfo[block+j].free_block.prev = 0;
+ }
+ mdp->heapinfo[block].free_block.size = nblocks;
+}
+
/* Finish the initialization of the mheap. If we want to inline it
* properly, we need to make the align function publicly visible, too */
static void initialize(xbt_mheap_t mdp)
int i;
malloc_info mi; /* to compute the offset of the swag hook */
+ // Update mdp meta-data:
mdp->heapsize = HEAP / BLOCKSIZE;
mdp->heapinfo = (malloc_info *)
align(mdp, mdp->heapsize * sizeof(malloc_info));
+ mdp->heapbase = (void *) mdp->heapinfo;
+ mdp->flags |= MMALLOC_INITIALIZED;
+ // Update root heapinfo:
memset((void *) mdp->heapinfo, 0, mdp->heapsize * sizeof(malloc_info));
- mdp->heapinfo[0].type=-1;
+ mdp->heapinfo[0].type = MMALLOC_TYPE_FREE;
mdp->heapinfo[0].free_block.size = 0;
mdp->heapinfo[0].free_block.next = mdp->heapinfo[0].free_block.prev = 0;
mdp->heapindex = 0;
- mdp->heapbase = (void *) mdp->heapinfo;
- mdp->flags |= MMALLOC_INITIALIZED;
+
+ initialize_heapinfo_heapinfo(mdp);
for (i=0;i<BLOCKLOG;i++) {
xbt_swag_init(&(mdp->fraghead[i]),
/* mark the space previously occupied by the block info as free by first marking it
* as occupied in the regular way, and then freing it */
for (it=0; it<BLOCKIFY(mdp->heapsize * sizeof(malloc_info)); it++){
- newinfo[BLOCK(oldinfo)+it].type = 0;
+ newinfo[BLOCK(oldinfo)+it].type = MMALLOC_TYPE_UNFRAGMENTED;
newinfo[BLOCK(oldinfo)+it].busy_block.ignore = 0;
}
newinfo[BLOCK(oldinfo)].busy_block.busy_size = size;
mfree(mdp, (void *) oldinfo);
mdp->heapsize = newsize;
+
+ initialize_heapinfo_heapinfo(mdp);
}
mdp->heaplimit = BLOCK((char *) result + size);
{
void *result;
size_t block, blocks, lastblocks, start;
- register size_t i;
- register size_t log;
+ size_t i;
+ size_t log;
int it;
size_t requested_size = size; // The amount of memory requested by user, for real
- /* Work even if the user was stupid enough to ask a ridicullously small block (even 0-length),
+ /* Work even if the user was stupid enough to ask a ridiculously small block (even 0-length),
* ie return a valid block that can be realloced and freed.
* glibc malloc does not use this trick but return a constant pointer, but we need to enlist the free fragments later on.
*/
mdp->heapinfo[block].busy_frag.ignore[0] = 0;
//xbt_backtrace_no_malloc(mdp->heapinfo[block].busy_frag.bt[0],XBT_BACKTRACE_SIZE);
//xbt_libunwind_backtrace(mdp->heapinfo[block].busy_frag.bt[0],XBT_BACKTRACE_SIZE);
-
+
/* update stats */
mdp -> heapstats.chunks_free += (BLOCKSIZE >> log) - 1;
mdp -> heapstats.bytes_free += BLOCKSIZE - (1 << log);
block = BLOCK(result);
for (it=0;it<blocks;it++){
- mdp->heapinfo[block+it].type = 0;
+ mdp->heapinfo[block+it].type = MMALLOC_TYPE_UNFRAGMENTED;
mdp->heapinfo[block+it].busy_block.busy_size = 0;
mdp->heapinfo[block+it].busy_block.ignore = 0;
+ mdp->heapinfo[block+it].busy_block.size = 0;
}
mdp->heapinfo[block].busy_block.size = blocks;
mdp->heapinfo[block].busy_block.busy_size = requested_size;
}
for (it=0;it<blocks;it++){
- mdp->heapinfo[block+it].type = 0;
+ mdp->heapinfo[block+it].type = MMALLOC_TYPE_UNFRAGMENTED;
mdp->heapinfo[block+it].busy_block.busy_size = 0;
mdp->heapinfo[block+it].busy_block.ignore = 0;
+ mdp->heapinfo[block+it].busy_block.size = 0;
}
mdp->heapinfo[block].busy_block.size = blocks;
- mdp->heapinfo[block].busy_block.busy_size = requested_size;
+ mdp->heapinfo[block].busy_block.busy_size = requested_size;
//mdp->heapinfo[block].busy_block.bt_size = xbt_backtrace_no_malloc(mdp->heapinfo[block].busy_block.bt,XBT_BACKTRACE_SIZE);
//mdp->heapinfo[block].busy_block.bt_size = xbt_libunwind_backtrace(mdp->heapinfo[block].busy_block.bt,XBT_BACKTRACE_SIZE);
-
+
mdp -> heapstats.chunks_used++;
mdp -> heapstats.bytes_used += blocks * BLOCKSIZE;
mdp -> heapstats.bytes_free -= blocks * BLOCKSIZE;