1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- #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) {
- unsigned int allocation_size;
- void *ptr;
- sbrk_lock();
- allocation_size = req_padding(size) + HDR_SIZE;
- if (borderPtr == NULL) {
- ptr = sbrk(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(ptr + HDR_SIZE);
- borderPtr = ptr;
- } else {
- ptr = sbrk(allocation_size);
- if ((ptr == (char *) -1)){
- printf("sbrk Fail: out of Memory\n");
- return NULL;
- }
- if((ptr != borderPtr + 2*HDR_SIZE)){
- printf("sbrk Fail: Non-contiguous Memory\n");
- return NULL;
- }
- }
- ptr = borderPtr + HDR_SIZE;
- borderPtr += allocation_size;
- setHeaders(ptr,size);
- sbrk_unlock();
- return (void *) ptr;
- }
|