sys_alloc.c 1.2 KB

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