Guest User

Untitled

a guest
Jan 21st, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.76 KB | None | 0 0
  1. #include <inttypes.h>
  2. #include <stdbool.h>
  3. #include <stddef.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7.  
  8. #define K (29)
  9. #define ALIGN (8)
  10. #define N (536870912) //2^K
  11. #define MIN_ALLOC (32)
  12. #define MIN_K (5) //2^5 = 32
  13.  
  14. const int K_EQUVALENT[K] = {2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,
  15. 16384,32768,65536,131072,262144,524288,1048576,
  16. 2097152, 4194304, 8388608, 16777216, 33554432,
  17. 67108864, 134217728, 268435456, 536870912};
  18.  
  19. typedef struct list_t list_t;
  20.  
  21. struct list_t {
  22. unsigned int reserved; /* one if reserved. */
  23. char kval; /* current value of K. */
  24. list_t* succ; /* successor block in list. */
  25. list_t* pred; /* predecessor block in list. */
  26. };
  27.  
  28. static char pool[N]; // data pool
  29. static list_t freelist[K];
  30. static bool first = 1;
  31. const void* START_ADDR = (void *)&pool;
  32.  
  33. static void init()
  34. {
  35. int i;
  36. for (i = 0; i < K-1; ++i) {
  37. freelist[i].succ = NULL;
  38. }
  39. list_t* tmp = (list_t*) pool;
  40. tmp->succ = NULL;
  41. tmp->pred = &freelist[K-1];
  42. tmp->kval = K-1;
  43. tmp->reserved = 0;
  44. freelist[K-1].succ = tmp;
  45. }
  46.  
  47. void* malloc(size_t size)
  48. {
  49. size += sizeof(list_t);
  50. if(size == 0 || size > N/2)
  51. return NULL;
  52.  
  53. if(first) {
  54. first = 0;
  55. init();
  56. }
  57.  
  58. // Increase size to be the smallest power of two: size = 2^K
  59. int i;
  60. int pow = MIN_ALLOC;
  61. for(i = MIN_K; i < K; i++)
  62. {
  63. if( pow >= size)
  64. break;
  65. pow = pow*2;
  66. }
  67. size = pow;
  68.  
  69. // Find the first list J with an available block; J >= K
  70. int block = -1;
  71. int j;
  72. for(j = i-1; j < K; j++)
  73. {
  74. if (freelist[j].succ != NULL) {
  75. block = j;
  76. break;
  77. }
  78. }
  79.  
  80. // If no such J exists, then return NULL.
  81. if(block == -1) {
  82. printf("out of memory\n");
  83. fflush(stdout);
  84. return NULL;
  85. }
  86.  
  87. // remove/fetch first item in freelist
  88. list_t *mem, *tmp;
  89. mem = freelist[j].succ;
  90. freelist[j].succ = mem->succ;
  91. if(mem->succ != NULL)
  92. mem->succ->pred = &freelist[j];
  93. if (block != i-1) {
  94. while (block != i-1) {
  95. // split mem in two equal parts and insert the one to
  96. // the right in freelist[block-1]
  97. block--;
  98. tmp = (list_t*)((char*)mem + K_EQUVALENT[block]);
  99. tmp->succ = freelist[block].succ;
  100. tmp->pred = &freelist[block];
  101. tmp->kval = block;
  102. tmp->reserved = 0;
  103. freelist[block].succ = tmp;
  104. if(tmp->succ != NULL)
  105. tmp->succ->pred = tmp;
  106. }
  107. mem->kval = i-1;
  108. }
  109. mem->reserved = 1;
  110. return (void*)((char*)mem + sizeof(list_t));
  111. }
  112.  
  113. void* calloc(size_t n, size_t size)
  114. {
  115. void* p;
  116. p = malloc(n * size);
  117. memset(p, 0, n * size);
  118.  
  119. return p;
  120. }
  121.  
  122. void free(void* ptr)
  123. {
  124. if(ptr == NULL)
  125. return;
  126. list_t* mem = (list_t*)((char*)ptr - sizeof(list_t));
  127. while(mem->kval < K-1){
  128. list_t* tmp = (list_t*)(START_ADDR +
  129. (((void*)mem - START_ADDR) ^ (1 << mem->kval+1)));
  130. if (tmp > mem && tmp->kval == mem->kval && !tmp->reserved) {
  131. mem->kval++;
  132. tmp->pred->succ = tmp->succ;
  133. if(tmp->succ != NULL)
  134. tmp->succ->pred = tmp->pred;
  135. } else if (tmp->kval == mem->kval && !tmp->reserved) {
  136. tmp->kval++;
  137. mem = tmp;
  138. tmp = mem->pred;
  139. tmp->succ = mem->succ;
  140. if(tmp->succ != NULL)
  141. tmp->succ->pred = tmp;
  142. } else
  143. break;
  144. }
  145. mem->succ = freelist[mem->kval].succ;
  146. mem->pred = &freelist[mem->kval];
  147. freelist[mem->kval].succ = mem;
  148. if(mem->succ != NULL)
  149. mem->succ->pred = mem;
  150. mem->reserved = 0;
  151. }
  152.  
  153. void* realloc(void* ptr, size_t size)
  154. {
  155. if(ptr == NULL)
  156. return;
  157. list_t* mem = (list_t*)((char*)ptr - sizeof(list_t));
  158. if(mem == NULL)
  159. return;
  160. void* new_mem = malloc(size);
  161. if(size < K_EQUVALENT[mem->kval] - sizeof(list_t) )
  162. memcpy(new_mem, ptr, size);
  163. else
  164. memcpy(new_mem, ptr, K_EQUVALENT[mem->kval] - sizeof(list_t));
  165. free(ptr);
  166. return new_mem;
  167. }
  168.  
  169. void malloc_stats()
  170. {
  171.  
  172. }
Add Comment
Please, Sign In to add comment