/* * mm_checkheap - Check the heap for consistency */ void mm_checkheap(int verbose) { char *bp = heap_listp; if (verbose) printf("Heap (%p):\n", heap_listp); if ((GET_SIZE(HDRP(heap_listp)) != OVERHEAD) || !GET_ALLOC(HDRP(heap_listp))) printf("Bad prologue header\n"); checkblock(heap_listp); for (bp = heap_listp; GET_SIZE(HDRP(bp)) > 0; bp = NEXT_BLKP(bp)) { if (verbose) printblock(bp); checkblock(bp); } if (verbose) printblock(bp); if ((GET_SIZE(HDRP(bp)) != 0) || !(GET_ALLOC(HDRP(bp)))) printf("Bad epilogue header\n"); printfreelist(); }
/* * mm_checkheap - Check the heap for consistency */ void mm_checkheap(int verbose) { if (verbose) printf("Check heap: \n"); char *bp = heap_listp; int free_block_flag = 0; int free_block_count = 0; if (verbose) printf("Heap (%p):\n", heap_listp); // check prologue block if ((GET_SIZE(HDRP(heap_listp)) != OVERHEAD) || !GET_ALLOC(HDRP(heap_listp))) printf("Bad prologue header\n"); checkblock(heap_listp); for (bp = heap_listp; GET_SIZE(HDRP(bp)) > 0; bp = NEXT_BLKP(bp)) { if (verbose) printblock(bp); checkblock(bp); // check coalescing if (!GET_ALLOC(HDRP(bp))) { if (free_block_flag == 1) { printf("Error: consecutive free blocks %p | %p in the heap.\n", PREV_BLKP(bp),bp); } free_block_flag = 1; free_block_count++; } else { free_block_flag = 0; } } if (verbose) printblock(bp); // check epilogue block if ((GET_SIZE(HDRP(bp)) != 0) || !(GET_ALLOC(HDRP(bp)))) printf("Bad epilogue header\n"); // print heap boundaries check_heapboundaries(heap_listp-DSIZE, bp-1); if (verbose) { printfreelist(); } checkfreelist(free_block_count); }