Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * mm-naive.c - The fastest, least memory-efficient malloc package.
- *
- * In this naive approach, a block is allocated by simply incrementing
- * the brk pointer. A block is pure payload. There are no headers or
- * footers. Blocks are never coalesced or reused. Realloc is
- * implemented directly using mm_malloc and mm_free.
- *
- * NOTE TO STUDENTS: Replace this header comment with your own header
- * comment that gives a high level description of your solution.
- *
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <assert.h>
- #include <unistd.h>
- #include <string.h>
- #include "mm.h"
- #include "memlib.h"
- /*********************************************************
- * NOTE TO STUDENTS: Before you do anything else, please
- * provide your team information in below _AND_ in the
- * struct that follows.
- *
- * Note: This comment is parsed. Please do not change the
- * Format!
- *
- * === User information ===
- * Group: YEEHAW
- * User 1: Nökkvi Karlsson
- * SSN: 1508963639
- * User 2: Atli Gíslason
- * SSN: 0512992649
- * User 3:
- * SSN: X
- * === End User Information ===
- ********************************************************/
- team_t team = {
- /* Group name */
- "YEEHAW",
- /* First member's full name */
- "Student Studentsson",
- /* First member's email address */
- "student16@ru.is",
- /* Second member's full name (leave blank if none) */
- "",
- /* Second member's email address (leave blank if none) */
- "",
- /* Third full name (leave blank if none) */
- "",
- /* Third member's email address (leave blank if none) */
- ""
- };
- /* $begin mallocmacros */
- /* Basic constants and macros */
- #define WSIZE 4 /* word size (bytes) */
- #define DSIZE 8 /* doubleword size (bytes) */
- #define CHUNKSIZE (1<<12) /* initial heap size (bytes) */
- #define OVERHEAD 8 /* overhead of header and footer (bytes) */
- #define MAX(x, y) ((x) > (y)? (x) : (y))
- /* Pack a size and allocated bit into a word */
- #define PACK(size, alloc) ((size) | (alloc))
- /* Read and write a word at address p */
- #define GET(p) (*(size_t *)(p))
- #define PUT(p, val) (*(size_t *)(p) = (val))
- /* (which is about 49/100).* Read the size and allocated fields from address p */
- #define GET_SIZE(p) (GET(p) & ~0x7)
- #define GET_ALLOC(p) (GET(p) & 0x1)
- /* Given block ptr bp, compute address of its header and footer */
- #define HDRP(bp) ((char *)(bp) - WSIZE)
- #define FTRP(bp) ((char *)(bp) + GET_SIZE(HDRP(bp)) - DSIZE)
- /* Given block ptr bp, compute address of next and previous blocks */
- #define NEXT_BLKP(bp) ((char *)(bp) + GET_SIZE(((char *)(bp) - WSIZE)))
- #define PREV_BLKP(bp) ((char *)(bp) - GET_SIZE(((char *)(bp) - DSIZE)))
- /* $end mallocmacros */
- /* single word (4) or double word (8) alignment */
- #define ALIGNMENT 8
- /* rounds up to the nearest multiple of ALIGNMENT */
- #define ALIGN(size) (((size) + (ALIGNMENT-1)) & ~0x7)
- #define SIZE_T_SIZE (ALIGN(sizeof(size_t)))
- /* Finds previous or next free block */
- #define PREV_FREE_BLKP(bp) (*(char**)(bp))
- #define NEXT_FREE_BLKP(bp) (*(char**)(bp + WSIZE))
- /* Global variables */
- static char *heap_listp; /* pointer to first block */
- //static char *free_listp; /* pointer to the first free block */
- /* function prototypes for internal helper routines */
- static void *extend_heap(size_t words);
- static void place(void *bp, size_t asize);
- static void *find_fit(size_t asize);
- static void *coalesce(void *bp);
- static void printblock(void *bp);
- static void checkblock(void *bp);
- /*
- * mm_init - initialize the malloc package.
- */
- int mm_init(void)
- {
- /* create the initial empty heap */
- if ((heap_listp = mem_sbrk(4*WSIZE)) == NULL) {
- return -1;
- }
- PUT(heap_listp, 0); /* alignment padding */
- PUT(heap_listp+WSIZE, PACK(OVERHEAD, 1)); /* prologue header */
- PUT(heap_listp+DSIZE, PACK(OVERHEAD, 1)); /* prologue footer */
- PUT(heap_listp+WSIZE+DSIZE, PACK(0, 1)); /* epilogue header */
- heap_listp += DSIZE;
- /* Extend the empty heap with a free block of CHUNKSIZE bytes */
- if (extend_heap(CHUNKSIZE/WSIZE) == NULL) {
- return -1;
- }
- return 0;
- }
- /*
- * Checks any invariants or consistency conditions.
- * It returns a non-zero value if our heap is consistent.
- */
- int mm_check(int verbose)
- {
- /* Code taken from the book commented by us */
- char *bp = heap_listp;
- if (verbose) {
- printf("Heap (%p):\n", heap_listp);
- }
- /* Checks if prologue header has 8 for size and is allocated */
- if ((GET_SIZE(HDRP(heap_listp)) != DSIZE) || !GET_ALLOC(HDRP(heap_listp))) {
- printf("Bad prologue header\n");
- }
- /*
- * Checks if the heap_listp is aligned and checks if the header pointer
- * is the same as the footer pointer
- */
- checkblock(heap_listp);
- /*
- * Loops through every block, checks if every block is aligned
- * and if its header matches its footer
- */
- for (bp = heap_listp; GET_SIZE(HDRP(bp)) > 0; bp = NEXT_BLKP(bp)) {
- if (verbose) {
- printblock(bp);
- }
- checkblock(bp);
- }
- /* Prints epilogue header */
- if (verbose) {
- printblock(bp);
- }
- /* Checks weather the epilogue header is correct */
- if ((GET_SIZE(HDRP(bp)) != 0) || !(GET_ALLOC(HDRP(bp)))) {
- printf("Bad epilogue header\n");
- }
- /* Code from the book ends */
- /* Our checks in pseudo/comment code */
- // We plan on implementing our free list with an Address-Ordered Policy
- // We implented checks on the suggested items given in the project
- // description and implemented them in commented pseudocode
- // Is every block in the free list marked as free?
- /* for bp = first_free_blcok; bp != null; bp = bp->next (next free block)
- * if(GET_ALLOC(bp) == 1) {
- * printf("Hey this block %d is in the free list but not free", bp);
- * }
- */
- // Are there contigious free blocks that somehow escaped coalescing?
- /* for (bp = heap_listp; GET_SIZE(HDRP(bp)) > 0; bp = NEXT_BLKP(bp)) {
- * if(GET_ALLOC(bp) == 0 && GET_ALLOC(NEXT_BLKP())
- *
- */
- return 0;
- }
- /*
- * mm_malloc - Allocate a block by incrementing the brk pointer.
- * Always allocate a block whose size is a multiple of the alignment.
- */
- void *mm_malloc(size_t size)
- {
- /* Malloc code that was given with the mm.c file
- int newsize = ALIGN(size + SIZE_T_SIZE);
- void *p = mem_sbrk(newsize);
- if (p == (void *)-1) {
- return NULL;
- }
- else {
- *(size_t *)p = size;
- return (void *)((char *)p + SIZE_T_SIZE);
- }
- */
- /* Code from mm-firstfit.c */
- size_t asize; /* adjusted block size */
- size_t extendsize; /* amount to extend heap if no fit */
- char *bp;
- /* Ignore spurious requests */
- if (size <= 0) {
- return NULL;
- }
- /* Adjust block size to include overhead and alignment reqs. */
- if (size <= DSIZE) {
- asize = DSIZE + OVERHEAD;
- }
- else {
- asize = DSIZE * ((size + (OVERHEAD) + (DSIZE-1)) / DSIZE);
- }
- /* Search the free list for a fit */
- if ((bp = find_fit(asize)) != NULL) {
- place(bp, asize);
- return bp;
- }
- /* No fit found. Get more memory and place the block */
- extendsize = MAX(asize,CHUNKSIZE);
- if ((bp = extend_heap(extendsize/WSIZE)) == NULL) {
- return NULL;
- }
- place(bp, asize);
- mm_check(1);
- return bp;
- }
- /*
- * mm_free - Freeing a block does nothing.
- */
- void mm_free(void *ptr)
- {
- }
- /*
- * mm_realloc - Implemented simply in terms of mm_malloc and mm_free
- */
- void *mm_realloc(void *ptr, size_t size)
- {
- void *oldptr = ptr;
- void *newptr;
- size_t copySize;
- newptr = mm_malloc(size);
- if (newptr == NULL) {
- return NULL;
- }
- copySize = *(size_t *)((char *)oldptr - SIZE_T_SIZE);
- if (size < copySize) {
- copySize = size;
- }
- memcpy(newptr, oldptr, copySize);
- mm_free(oldptr);
- return newptr;
- }
- /*
- * extend_heap - Extend heap with free block and return its block pointer
- */
- /* $begin mmextendheap */
- static void *extend_heap(size_t words)
- {
- char *bp;
- size_t size;
- /* Allocate an even number of words to maintain alignment */
- size = (words % 2) ? (words+1) * WSIZE : words * WSIZE;
- if ((bp = mem_sbrk(size)) == (void *)-1) {
- return NULL;
- }
- /* Initialize free block header/footer and the epilogue header */
- PUT(HDRP(bp), PACK(size, 0)); /* free block header */
- PUT(FTRP(bp), PACK(size, 0)); /* free block footer */
- PUT(HDRP(NEXT_BLKP(bp)), PACK(0, 1)); /* new epilogue header */
- /* Coalesce if the previous block was free */
- return coalesce(bp);
- }
- /*
- * place - Place block of asize bytes at start of free block bp
- * and split if remainder would be at least minimum block size
- */
- /* $begin mmplace */
- /* $begin mmplace-proto */
- static void place(void *bp, size_t asize)
- /* $end mmplace-proto */
- {
- size_t csize = GET_SIZE(HDRP(bp));
- if ((csize - asize) >= (DSIZE + OVERHEAD)) {
- PUT(HDRP(bp), PACK(asize, 1));
- PUT(FTRP(bp), PACK(asize, 1));
- bp = NEXT_BLKP(bp);
- PUT(HDRP(bp), PACK(csize-asize, 0));
- PUT(FTRP(bp), PACK(csize-asize, 0));
- }
- else {
- PUT(HDRP(bp), PACK(csize, 1));
- PUT(FTRP(bp), PACK(csize, 1));
- }
- }
- /* $end mmplace */
- /*
- * find_fit - Find a fit for a block with asize bytes
- */
- static void *find_fit(size_t asize)
- {
- /* first fit search */
- void *bp;
- for (bp = heap_listp; GET_SIZE(HDRP(bp)) > 0; bp = NEXT_BLKP(bp)) {
- if (!GET_ALLOC(HDRP(bp)) && (asize <= GET_SIZE(HDRP(bp)))) {
- return bp;
- }
- }
- return NULL; /* no fit */
- }
- /*
- * coalesce - boundary tag coalescing. Return ptr to coalesced block
- */
- static void *coalesce(void *bp)
- {
- size_t prev_alloc = GET_ALLOC(FTRP(PREV_BLKP(bp)));
- size_t next_alloc = GET_ALLOC(HDRP(NEXT_BLKP(bp)));
- size_t size = GET_SIZE(HDRP(bp));
- if (prev_alloc && next_alloc) { /* Case 1 */
- return bp;
- }
- else if (prev_alloc && !next_alloc) { /* Case 2 */
- size += GET_SIZE(HDRP(NEXT_BLKP(bp)));
- PUT(HDRP(bp), PACK(size, 0));
- PUT(FTRP(bp), PACK(size,0));
- }
- else if (!prev_alloc && next_alloc) { /* Case 3 */
- size += GET_SIZE(HDRP(PREV_BLKP(bp)));
- PUT(FTRP(bp), PACK(size, 0));
- PUT(HDRP(PREV_BLKP(bp)), PACK(size, 0));
- bp = PREV_BLKP(bp);
- }
- else { /* Case 4 */
- size += GET_SIZE(HDRP(PREV_BLKP(bp))) +
- GET_SIZE(FTRP(NEXT_BLKP(bp)));
- PUT(HDRP(PREV_BLKP(bp)), PACK(size, 0));
- PUT(FTRP(NEXT_BLKP(bp)), PACK(size, 0));
- bp = PREV_BLKP(bp);
- }
- return bp;
- }
- static void printblock(void *bp)
- {
- size_t hsize, halloc, fsize, falloc;
- hsize = GET_SIZE(HDRP(bp));
- halloc = GET_ALLOC(HDRP(bp));
- fsize = GET_SIZE(FTRP(bp));
- falloc = GET_ALLOC(FTRP(bp));
- if (hsize == 0) {
- printf("%p: EOL\n", bp);
- return;
- }
- printf("%p: header: [%d:%c] footer: [%d:%c]\n", bp,
- hsize, (halloc ? 'a' : 'f'),
- fsize, (falloc ? 'a' : 'f'));
- }
- static void checkblock(void *bp)
- {
- if ((size_t)bp % 8) {
- printf("Error: %p is not doubleword aligned\n", bp);
- }
- if (GET(HDRP(bp)) != GET(FTRP(bp))) {
- printf("Error: header does not match footer\n");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement