sys_alloc.c 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include "posix_lock.h"
  4. #include "other.h"
  5. #include "LeaHeader.h"
  6. #include "sys_alloc.h"
  7. static void *borderPtr = NULL;
  8. void setHeaders(void *ptr, size_t sz) {
  9. sz = req_padding(sz);
  10. setSize(ptr,sz);
  11. markInUse(ptr);
  12. setPrevSize(getNext(ptr), sz);
  13. setSize(getNext(ptr), 0); //border block
  14. markInUse(getNext(ptr)); //border block
  15. }
  16. void *sys_alloc(size_t size) {
  17. unsigned int allocation_size;
  18. void *ptr;
  19. sbrk_lock();
  20. allocation_size = req_padding(size) + HDR_SIZE;
  21. if (borderPtr == NULL) {
  22. ptr = sbrk(allocation_size + 2*HDR_SIZE); //extra space for coalescing support
  23. if (ptr == (void *) -1){
  24. printf("sbrk Fail\n");
  25. return NULL;
  26. }
  27. //printf("sbrk = %p\n",ptr);
  28. setPrevSize((char *) ptr + HDR_SIZE, 0);
  29. markPrevInUse(ptr + HDR_SIZE);
  30. borderPtr = ptr;
  31. } else {
  32. ptr = sbrk(allocation_size);
  33. if ((ptr == (char *) -1)){
  34. printf("sbrk Fail: out of Memory\n");
  35. return NULL;
  36. }
  37. if((ptr != borderPtr + 2*HDR_SIZE)){
  38. printf("sbrk Fail: Non-contiguous Memory\n");
  39. return NULL;
  40. }
  41. }
  42. ptr = borderPtr + HDR_SIZE;
  43. borderPtr += allocation_size;
  44. setHeaders(ptr,size);
  45. sbrk_unlock();
  46. return (void *) ptr;
  47. }