Advertisement
Guest User

Untitled

a guest
Aug 28th, 2015
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.61 KB | None | 0 0
  1. void *vlad_malloc(u_int32_t n)
  2. {
  3. int required_mem_size = n + HEADER_SIZE;
  4. required_mem_size = makePow2(required_mem_size);
  5. if ((required_mem_size <= memory_size) && (n >= 8)) { //make sure there's enough memory
  6. free_header_t *curr = (free_header_t *)((byte *)memory + free_list_ptr); // "start" of list
  7. int i = 0;
  8. while ((curr != (free_header_t *)((byte *)memory + free_list_ptr)) || (i == 0)) {
  9. i = 1;
  10. if (curr->size == required_mem_size) {
  11. //remove the block from free list
  12. if ((curr->prev == curr->next) && (curr->prev == ((byte *)curr - (byte *)memory)))
  13. return NULL;
  14. else
  15. ((free_header_t *)((curr->prev) + (byte *)memory))->next = curr->next;
  16. ((free_header_t *)((curr->next) + (byte *)memory))->prev = curr->prev;
  17. curr->magic = MAGIC_ALLOC;
  18. if (curr == (free_header_t *)((byte *)memory + free_list_ptr)) {
  19. free_list_ptr = curr->next;
  20. }
  21. return (void *)((byte *)curr + HEADER_SIZE);
  22. }
  23. if (curr->next == free_list_ptr) {
  24. break;
  25. } else {
  26. curr = (free_header_t *)((byte *)memory + (curr->next));
  27. }
  28.  
  29. }
  30.  
  31. curr = (free_header_t *)((byte *)memory + free_list_ptr);
  32. i = 0;
  33. while ((curr != (free_header_t *)((byte *)memory + free_list_ptr)) || (i == 0)) { //CASE: there's a block of memory larger than reqd
  34. i = 1;
  35. if ((curr->size) > required_mem_size) {
  36. free_header_t *new;
  37. while (curr->size > required_mem_size) { //while size of curr space is bigger, half it
  38. new = (free_header_t *)((byte *)curr + (curr->size)/2);
  39. new->magic = MAGIC_FREE;
  40. new->prev = (vlink_t)((byte *)curr - (byte *)memory);
  41. new->next = curr->next;
  42. if (curr->next == free_list_ptr) {
  43. ((free_header_t *)(memory + free_list_ptr))->prev = (byte*)new - (byte *)memory;
  44. } else {
  45. ((free_header_t *)((byte *)memory + curr->next))->prev = (byte*)new - (byte *)memory;
  46. }
  47. curr->next = (vlink_t)((byte *)new - (byte*)memory);
  48. curr->size = (curr->size)/2;
  49. new->size = curr->size;
  50. curr = new;
  51. }
  52.  
  53. if ((new->prev == new->next) && (new->prev == ((byte *)new - (byte *)memory)))
  54. return NULL;
  55. else
  56. new->magic = MAGIC_ALLOC;
  57. ((free_header_t *)((byte *)memory + ((new)->prev)))->next = new->next;
  58. ((free_header_t *)((byte *)memory + ((new)->next)))->prev = new->prev;
  59. if (curr == (free_header_t *)((byte *)memory + free_list_ptr)) {
  60. free_list_ptr = curr->next;
  61. }
  62. return (void *)((byte *)new + HEADER_SIZE);
  63. }
  64. if (curr->next == free_list_ptr) {
  65. curr = (free_header_t *)((byte *)memory + free_list_ptr);
  66. } else {
  67. //curr = (free_header_t *)((byte*)curr + curr->size);
  68. curr = (free_header_t *)((byte *)memory + curr->next);
  69. }
  70. }
  71.  
  72. }
  73. return NULL;
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement