Advertisement
Guest User

Untitled

a guest
Dec 22nd, 2014
233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.64 KB | None | 0 0
  1. #include "mm.h"
  2.  
  3. /*
  4. The following is 'mm.h':
  5. #include <unistd.h>
  6. typedef struct metadata_block* p_block;
  7.  
  8. typedef struct metadata_block
  9. {
  10.     size_t size;
  11.     p_block next;
  12.     int free;
  13. }metadata_block;
  14.  
  15. void* malloc(size_t size);
  16. void free(void* ptr);
  17. void* realloc(void* ptr, size_t size);
  18. */
  19. //THE MAIN CODE IS AT THE BOTTOM//
  20. #include <stdio.h>
  21.  
  22. static p_block head = NULL;
  23.  
  24. void* malloc(size_t size)
  25. {
  26.     void* ptr;
  27.     int isOk = 1;
  28.     int temp = 0;
  29.     p_block curr = head;
  30.     if(size <= 0)
  31.     {
  32.         return NULL;
  33.     }
  34.     if(curr)
  35.     {
  36.         while(curr->next && isOk)
  37.         {
  38.             if(curr->free && size <= curr->size)
  39.             {
  40.                 isOk = 0;
  41.             }
  42.  
  43.             if(isOk)
  44.             {
  45.                 curr = curr->next;
  46.             }
  47.         }
  48.  
  49.         if(isOk) //what will happen if there isn't one free and big enough
  50.         {
  51.             ptr = sbrk(size + sizeof(metadata_block));
  52.             if((int)ptr <= 0)
  53.                 return NULL;
  54.             ((p_block)(ptr))->size = size;
  55.             ((p_block)(ptr))->next = NULL; //next run it's the real next.
  56.             ((p_block)(ptr))->free = 0;
  57.  
  58.             return (ptr + sizeof(metadata_block));
  59.         }
  60.         else
  61.         {
  62.             if(curr->next)
  63.             {
  64.                 ptr = curr;
  65.                 if(curr->size == size || size > (curr->size - sizeof(metadata_block) - 1)) //not enough room for another block of memory
  66.                 {
  67.                     ((p_block)(ptr))->free = 0;
  68.                     return (ptr + sizeof(metadata_block));
  69.                 }
  70.  
  71.                 temp = curr->size;
  72.                 ((p_block)(ptr))->size = size;
  73.                 ((p_block)(ptr))->free = 0;
  74.                 ((p_block)(ptr + sizeof(metadata_block) + size))->next = curr->next;
  75.                 ((p_block)(ptr))->next = ptr + sizeof(metadata_block) + size;
  76.                 ((p_block)(ptr + sizeof(metadata_block) + size))->size = temp - size;
  77.                 ((p_block)(ptr + sizeof(metadata_block) + size))->free = 1;
  78.  
  79.                 return (ptr + sizeof(metadata_block));
  80.             }
  81.             else
  82.             {
  83.                 ptr = curr;
  84.                 if((int)sbrk(size - curr->size) > 0)
  85.                 {
  86.                     ((p_block)(ptr))->size = size;
  87.                     ((p_block)(ptr))->next = NULL; //next run it's the real next.
  88.                     ((p_block)(ptr))->free = 0;
  89.  
  90.                     return (ptr + sizeof(metadata_block));
  91.                 }
  92.                 return NULL;
  93.             }
  94.         }
  95.     }
  96.     else
  97.     {
  98.         ptr = sbrk(size + sizeof(metadata_block));
  99.         if((int)ptr <= 0)
  100.             return NULL;
  101.         head = ptr;
  102.         ((p_block)(ptr))->size = size;
  103.         ((p_block)(ptr))->next = NULL;
  104.         ((p_block)(ptr))->free = 0;
  105.     }
  106.  
  107.  
  108.     return ptr;
  109. }
  110.  
  111. void free(void* ptr)
  112. {
  113.     void* curr = head;
  114.     void* before = NULL;
  115.     int isLegal = 0;
  116.     printf("curr is %p and ptr is %p\n", curr, ptr);
  117.     if(curr == ptr)
  118.     {
  119.         printf("aaa");
  120.     }
  121.     else
  122.     {
  123.         printf("bbb");
  124.     }
  125.     if(curr && ptr)
  126.     {
  127.         while(curr && !isLegal)
  128.         {
  129.             if(((p_block)(ptr)) == ((p_block)(curr))->next)
  130.             {
  131.                 before = curr;
  132.                 isLegal = 1;
  133.                 curr = ((p_block)(curr))->next;
  134.             }
  135.             else
  136.             {
  137.                 curr = ((p_block)(curr))->next;
  138.             }
  139.         }
  140.  
  141.         if(isLegal)
  142.         {
  143.             curr = curr - sizeof(metadata_block);
  144.  
  145.             if(((p_block)(curr))->next)
  146.             {
  147.                 ((p_block)(curr))->free = 1;
  148.             }
  149.             else
  150.             {
  151.                 sbrk(0-(((p_block)(curr))->size + sizeof(metadata_block)));
  152.                 ((p_block)(before))->next = NULL;
  153.             }
  154.         }
  155.     }
  156. }
  157.  
  158. void* realloc(void* ptr, size_t size)
  159. {
  160.     void* ptr2 = malloc(size);
  161.     int i;
  162.     for(i = 0 ; i < size ; i++)
  163.     {
  164.         *((char*)(ptr2 + i)) = *((char*)(ptr + i));
  165.     }
  166.  
  167.     free(ptr);
  168.  
  169.     return ptr2;
  170. }
  171.  
  172. /*
  173. int main()
  174. {
  175.     printf("I'm in.\n");
  176.     char * str = malloc(10);
  177.     printf("After Malloc()\n");
  178.     void * ptr = (void *) str;
  179.     void * ptr2;
  180.     if(!str)
  181.     {
  182.         printf("Fail.\n");
  183.     }
  184.     strcpy(str,"TEST!\0");
  185.     printf("About to free\n");
  186.     free(str);
  187.     printf("free: OK!\n");
  188. }
  189. //OUTPUT IS:
  190. //I'm in.
  191. //After Malloc()
  192. //About to free
  193. //curr is X and ptr is X [both always come out equal - this is the text printed in the free()]
  194. //Segmentation fault (core dumped)
  195. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement