- mdp->heapinfo[block].free.size = mdp->heapinfo[block].busy.info.size;
- mdp->heapinfo[block].free.next = mdp->heapinfo[i].free.next;
- mdp->heapinfo[block].free.prev = i;
- mdp->heapinfo[i].free.next = block;
- mdp->heapinfo[mdp->heapinfo[block].free.next].free.prev = block;
- mdp->heapstats.chunks_free++;
+ mdp->heapinfo[block].free_block.size = mdp->heapinfo[block].busy_block.size;
+ mdp->heapinfo[block].free_block.next = mdp->heapinfo[i].free_block.next;
+ mdp->heapinfo[block].free_block.prev = i;
+ mdp->heapinfo[i].free_block.next = block;
+ mdp->heapinfo[mdp->heapinfo[block].free_block.next].free_block.prev = block;
+ mdp -> heapstats.chunks_free++;
+ /* Mark all my ex-blocks as free */
+ for (it=0; it<mdp->heapinfo[block].free_block.size; it++) {
+ if (mdp->heapinfo[block+it].type <0) {
+ fprintf(stderr,"Internal error: Asked to free a block already marked as free (block=%lu it=%d/%lu type=%lu). Please report this bug.\n",
+ (unsigned long)block,it,(unsigned long)mdp->heapinfo[block].free_block.size,(unsigned long)mdp->heapinfo[block].type);
+ abort();
+ }
+ mdp->heapinfo[block+it].type = -1;
+ }