sys_alloc.c 1.3 KB

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