Created
June 14, 2017 15:31
-
-
Save andrestc/713cda792d027b348ed3875ebcd391e4 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
void * | |
_malloc(size_t size) | |
{ | |
void *block_mem; | |
block_t *ptr, *newptr; | |
size_t alloc_size = size >= ALLOC_UNIT ? size + sizeof(block_t) | |
: ALLOC_UNIT; | |
ptr = head; | |
while (ptr) { | |
if (ptr->size >= size + sizeof(block_t)) { | |
block_mem = BLOCK_MEM(ptr); | |
fl_remove(ptr); | |
if (ptr->size == size) { | |
// we found a perfect sized block, return it | |
return block_mem; | |
} | |
// our block is bigger then requested, split it and add | |
// the spare to our free list | |
newptr = split(ptr, size); | |
fl_add(newptr); | |
return block_mem; | |
} else { | |
ptr = ptr->next; | |
} | |
} | |
/* We are unable to find a free block on our free list, so we | |
* should ask the OS for memory using sbrk. We will alloc | |
* more alloc_size bytes (probably way more than requested) and then | |
* split the newly allocated block to keep the spare space on our free | |
* list */ | |
ptr = sbrk(alloc_size); | |
if (!ptr) { | |
printf("failed to alloc %ld\n", alloc_size); | |
return NULL; | |
} | |
ptr->next = NULL; | |
ptr->prev = NULL; | |
ptr->size = alloc_size - sizeof(block_t); | |
if (alloc_size > size + sizeof(block_t)) { | |
newptr = split(ptr, size); | |
fl_add(newptr); | |
} | |
return BLOCK_MEM(ptr); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment