123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- #define _BSD_SOURCE
- #include <unistd.h>
- #include <stdio.h>
- #include "posix_lock.h"
- #include "other.h"
- #include "LeaHeader.h"
- #include "sys_alloc.h"
- static void *borderPtr = NULL;
- void setHeaders(void *ptr, size_t sz) {
- sz = req_padding(sz);
- setSize(ptr,sz);
- markInUse(ptr);
- setPrevSize(getNext(ptr), sz);
- setSize(getNext(ptr), 0); //border block
- markInUse(getNext(ptr)); //border block
- }
- void *sys_alloc(size_t size) {
- size_t allocation_size;
- void *ptr;
- sbrk_lock();
- allocation_size = req_padding(size) + HDR_SIZE;
- if (borderPtr == NULL) {
- ptr = sbrk((intptr_t) (allocation_size + 2*HDR_SIZE)); //extra space for coalescing support
- if (ptr == (void *) -1){
- printf("sbrk Fail\n");
- return NULL;
- }
- //printf("sbrk = %p\n",ptr);
- setPrevSize((char *) ptr + HDR_SIZE, 0);
- markPrevInUse((char *) ptr + HDR_SIZE);
- borderPtr = ptr;
- } else {
- ptr = sbrk((intptr_t) allocation_size);
- if ((ptr == (char *) -1)){
- printf("sbrk Fail: out of Memory\n");
- return NULL;
- }
- if((ptr != (char *) borderPtr + 2*HDR_SIZE)){
- printf("sbrk Fail: Non-contiguous Memory\n");
- return NULL;
- }
- }
- ptr = (char *) borderPtr + HDR_SIZE;
- borderPtr = (char *) borderPtr + allocation_size;
- setHeaders(ptr,size);
- sbrk_unlock();
- return (void *) ptr;
- }
|