Guest User

Untitled

a guest
Sep 22nd, 2018
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.26 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <malloc.h>
  4. #include "allocator.h"
  5.  
  6. #define MAGICNUMBER (0x84D80111)
  7.  
  8. #define HEADERSIZE sizeof(freeHeader)
  9.  
  10. #define DEAFBEED(0xDEAFBEED)
  11.  
  12. #define HEADER_SIZE sizeof(link);
  13.  
  14. typedef struct _node *link;
  15.  
  16. typedef struct _node {
  17. int size;
  18. int magicnumber;
  19. link next;
  20. link previous;
  21. } node;
  22.  
  23. typedef unsigned char byte;
  24.  
  25. static byte *free_list_ptr;
  26. static byte *memory = NULL;
  27.  
  28. void allocator_init(u_int32_t size){
  29. if(memory == NULL){
  30. memory = malloc(sizeof(byte)*size);
  31. node freeHeader = {size, MAGICNUMBER, (link) memory, (link) memory};
  32. *((node*) memory) = freeHeader;
  33. free_list_ptr = memory;
  34. }
  35. }
  36.  
  37. void *allocator_malloc(u_int32_t n){
  38. link tempPointer, returnPointer;
  39. uint32_t s;
  40. int found = 0;
  41. int runOnce = 0;
  42.  
  43. if (free_list_pointer->magicnumber != NULL){
  44. fprintf(stderr, "Error with memory.\n");
  45. abort();
  46. }
  47.  
  48. tempPointer = free_list_pointer;
  49.  
  50. while((tempPointer != free_list_pointer && found == 0) || (runOnce == 0)){
  51. if(tempPointer->size >= (HEADER_SIZE +n)){
  52. found = 1;
  53. }else{
  54. tempPointer = tempPointer->next;
  55. }
  56. runOnce = 1;
  57. }
  58.  
  59. if(found == 0){
  60. tempPointer = NULL;
  61. }
  62.  
  63. if(tempPointer == NULL){
  64. return NULL;
  65. }
  66.  
  67. s = returnPointer->size;
  68.  
  69. if(s/2 >= (HEADER_SIZE + n)){
  70. while(s/2 >= (HEADER_SIZE + n)){
  71. s /= 2;
  72. tempPointer = link ((char *) returnPointer + s);
  73. tempPointer->next = returnPointer->next;
  74. tempPointer->prev = (byte *) returnPointer;
  75. tempPointer->size = s;
  76. tempPointer->magicnumber = MAGICNUMBER;
  77. returnPointer->size = s;
  78. returnPointer->next->prev = (byte *) tempPointer;
  79. returnPointer->next = (byte *) tempPointer;
  80. }
  81. }else{
  82. tempPointer = link ((char*) returnPointer + s);
  83. }
  84.  
  85. if((returnPointer == link returnPointer->next) && (returnPointer->next == returnPointer->prev)){
  86. return NULL;
  87. }
  88.  
  89. tempPointer->prev = returnPointer->prev;
  90. returnPointer->prev->next = (byte *) tempPointer;
  91. returnPointer->magicnumber = DEAFBEED;
  92. free_list_ptr = (byte *) tempPointer;
  93. return ((void *) ((char *) returnPointer + HEADER_SIZE));
  94.  
  95. }
  96.  
  97. void allocator_free(void *object){
  98. }
  99.  
  100. void allocator_end(void){
  101. free(memory);
  102. }
Add Comment
Please, Sign In to add comment