Advertisement
Guest User

Untitled

a guest
Apr 21st, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.48 KB | None | 0 0
  1. #include <inttypes.h>
  2. #include <stdio.h>
  3.  
  4. #define FREE 0x6B
  5. #define META 5
  6. #define MIN_block 16
  7.  
  8. void * buffer= 0;
  9. size_t length=0;
  10.  
  11. // Эта функция будет вызвана перед тем как вызывать myalloc и myfree
  12. // используйте ее чтобы инициализировать ваш аллокатор перед началом
  13. // работы.
  14. //
  15. // buf - указатель на участок логической памяти, который ваш аллокатор
  16. // должен распределять, все возвращаемые указатели должны быть
  17. // либо равны NULL, либо быть из этого участка памяти
  18. // size - размер участка памяти, на который указывает buf
  19.  
  20. /* size в этой ф-ии это размер блока, а не размер payload */
  21. void mysetup(void *buf, size_t size)
  22. {
  23. buffer = buf;
  24. length = size;
  25. /* uppet */
  26. *(uint32_t *)buffer = (uint32_t) size; // 20 из 32 бит на размер
  27. *( (char *)buffer + sizeof(uint32_t) ) = FREE; // 8 бит на флаг // итого: верхняя мета 5 байт
  28. /* lower */
  29. *(uint32_t *)((char *)buffer + size-META) = (uint32_t) size; // 20 из 32 бит на размер
  30. *((char *)buffer+size-sizeof(char)) = FREE; // 8 бит на флаг // итого: нижняя мета 5 байт
  31. /* 0x6B - блок свободен */
  32. }
  33.  
  34. void *myalloc(size_t size){
  35. char * p = (char *)buffer;
  36. if (size >= length) goto exit;
  37. while ( p < (char *)buffer + length ){//проход всего списка
  38. if ( *(p + sizeof(uint32_t)) == FREE && ((int32_t)(*(uint32_t *)p-META*2) == (int32_t)size)){
  39. /* upper */
  40. *(uint32_t *)p = (uint32_t)size + META*2;
  41. *((char *)p + sizeof(uint32_t)) = 0; // busy now
  42. /* lower */
  43. *(uint32_t *)((char *)p + META + size) = (uint32_t)size + META*2;
  44. *((char *)p + META + size + sizeof(uint32_t)) = 0; // busy now
  45. p += META; if ((char*)p + size > (char *)buffer +length) goto exit;
  46. return (void*)p;
  47. }
  48.  
  49. if (*((p + sizeof(uint32_t))) == FREE && ( (int32_t)*(uint32_t *)p-META*2-MIN_block-META*2 >= (int32_t)size )){
  50. // new free /* upper */
  51. *(uint32_t *)((char *)p + META + size + META) = *(uint32_t *)p - size - META*2;
  52. *((char *)p + META + size + META + sizeof(uint32_t)) = FREE;
  53. /* lower */
  54. *(uint32_t *)((char *)p + *(uint32_t *)p-META) = *(uint32_t *)p - size - META*2;
  55. *((char *)p + *(uint32_t *)p- sizeof(char)) = FREE;
  56. /* upper */
  57. *(uint32_t *)p = (uint32_t)size + META*2;
  58. *((char *)p + sizeof(uint32_t)) = 0; // busy now
  59. /* lower */
  60. *(uint32_t *)((char *)p + META + size) = (uint32_t)size + META*2;
  61. *((char *)p + META + size + sizeof(uint32_t)) = 0; // busy now
  62. p += META; if ((char*)p + size > (char *)buffer +length) goto exit;
  63. return (void*)p;
  64. }
  65. p += *(uint32_t *)p;
  66. }
  67. exit:
  68. return NULL;
  69. }
  70.  
  71. // Функция освобождения
  72. void myfree(void *p)
  73. {
  74. /* upper */
  75. *((char *)p - sizeof(char)) = FREE; // free now
  76. /* lower */
  77. *((char *)p + *(uint32_t *)((char *)p - META) - META - sizeof(char)) = FREE; // free now
  78.  
  79. if( (char *)p + *(uint32_t *)((char *)p - META)- META <= (length + (char*)buffer) -META*2 -MIN_block ){ // the end of a heap?
  80. void* next_tag = (void *)((char *)p + *(uint32_t *)((char *)p - META) - META);
  81. if ( *((char *)next_tag + sizeof(uint32_t)) == FREE ){ // free?
  82. /* upper */
  83. *(uint32_t *)((char *)p - META) += *(uint32_t *)next_tag;
  84. /* lower */
  85. *(uint32_t *)((char *)next_tag + *(uint32_t *)next_tag - META ) = *(uint32_t *)((char *)p - META);
  86. }
  87. }
  88.  
  89. if( (char *)p -META > (char *)buffer ){
  90. void* prev_tag = (void *) ( (char*)p - META*2);
  91. if ( *((char *)prev_tag + sizeof(uint32_t)) == FREE ){ // the start of a heap?
  92. /* lower */
  93. *(uint32_t *)((char*)prev_tag + *(uint32_t *)((char *)p - META) )= *(uint32_t*)prev_tag + *(uint32_t *)((char *)p - META);
  94. /* upper */
  95. *(uint32_t *)((char*)p - META -*(uint32_t*)prev_tag ) += *(uint32_t *)((char *)p - META);
  96.  
  97. }
  98. }
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement