block_header.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #include "block_header.h"
  2. block_header_t * get_header(void *ptr);
  3. block_header_t * get_header(void *ptr) {
  4. return (block_header_t *) ((char *) ptr - HEADER_SIZE);
  5. }
  6. void * get_next(void *ptr) {
  7. return get_header(ptr)->next;
  8. }
  9. size_t get_size(void *ptr) {
  10. return get_header(ptr)->size;
  11. }
  12. void set_size(void *ptr, size_t size) {
  13. get_header(ptr)->size = size << 1;
  14. }
  15. void set_requested_size(void *ptr, size_t size) {
  16. get_header(ptr)->requested_size = size;
  17. }
  18. void set_next(void *ptr, void *next_block) {
  19. get_header(ptr)->next = next_block;
  20. }
  21. bool is_previous_free(void *ptr) {
  22. return (bool) (get_header(ptr)->previous_size & 1);
  23. }
  24. size_t get_previous_size(void *ptr) {
  25. return get_header(ptr)->previous_size >> 1;
  26. }
  27. void * get_previous(void *ptr) {
  28. return (void *) ((char *) ptr - get_previous_size(ptr));
  29. }
  30. void remove_block(void *block, void *starting_node) {
  31. void *current_node, *previous_node;
  32. // If the block to be removed is the head of the list, then just point
  33. // the next block as head.
  34. if(current_node == starting_node) {
  35. starting_node = get_next(block);
  36. // Else traverse through the list until the memory block is found.
  37. } else {
  38. for(current_node = starting_node; current_node != NULL;
  39. current_node = get_next(current_node)) {
  40. if(current_node == block) {
  41. set_next(previous_node, get_next(block));
  42. }
  43. previous_node = current_node;
  44. }
  45. }
  46. }