mdp->heapinfo[block].busy_block.size = blocks;
mdp->heapinfo[block].busy_block.busy_size = requested_size;
+ mdp->heapinfo[block].busy_block.ignore = 0;
+ mdp->heapinfo[block].busy_block.equal_to = NULL;
result = ptr;
} else if (blocks == mdp->heapinfo[block].busy_block.size) {
/* No block size change necessary; only update the requested size */
result = ptr;
mdp->heapinfo[block].busy_block.busy_size = requested_size;
+ mdp->heapinfo[block].busy_block.ignore = 0;
+ mdp->heapinfo[block].busy_block.equal_to = NULL;
} else {
/* Won't fit, so allocate a new region that will.
- Free the old region first in case there is sufficient
- adjacent free space to grow without moving. */
+ Free the old region first in case there is sufficient adjacent free space to grow without moving.
+ This trick mandates using a specific version of mmalloc that does not memset the memory to 0 after
+ action for obvious reasons. */
blocks = mdp->heapinfo[block].busy_block.size;
/* Prevent free from actually returning memory to the system. */
oldlimit = mdp->heaplimit;
mfree(mdp, ptr);
mdp->heaplimit = oldlimit;
- result = mmalloc(mdp, requested_size);
+ result = mmalloc_no_memset(mdp, requested_size);
+ //fprintf(stderr,"remalloc(%zu)~>%p\n",requested_size,result);
+
if (ptr != result)
memmove(result, ptr, blocks * BLOCKSIZE);
+ /* FIXME: we should memset the end of the recently area */
}
break;
result = ptr;
int frag_nb = RESIDUAL(result, BLOCKSIZE) >> type;
mdp->heapinfo[block].busy_frag.frag_size[frag_nb] = requested_size;
+ mdp->heapinfo[block].busy_frag.ignore[frag_nb] = 0;
+ mdp->heapinfo[block].busy_frag.equal_to[frag_nb] = NULL;
} else { /* fragment -> Either other fragment, or block */
/* The new size is different; allocate a new space,