#define _BSD_SOURCE #include #include #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), (size_t) 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((int) (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, (size_t) 0); markPrevInUse((char *) ptr + HDR_SIZE); borderPtr = ptr; } else { ptr = sbrk((int) 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; }