block_header.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #include "block_header.h"
  2. /**
  3. * \brief Get the address of the block header of a memory block.
  4. *
  5. * \param ptr The data part of the memory block.
  6. */
  7. block_header_t * get_header(void *ptr);
  8. block_header_t * get_header(void *ptr) {
  9. return (block_header_t *) ((char *) ptr - HEADER_SIZE);
  10. }
  11. void * get_next(void *ptr) {
  12. return get_header(ptr)->next;
  13. }
  14. size_t get_size(void *ptr) {
  15. return get_header(ptr)->size;
  16. }
  17. void set_size(void *ptr, size_t size) {
  18. get_header(ptr)->size = size << 1;
  19. }
  20. void set_requested_size(void *ptr, size_t size) {
  21. get_header(ptr)->requested_size = size;
  22. }
  23. void set_next(void *ptr, void *next_block) {
  24. get_header(ptr)->next = next_block;
  25. }
  26. bool is_previous_free(void *ptr) {
  27. return (bool) (get_header(ptr)->previous_size & 1);
  28. }
  29. size_t get_previous_size(void *ptr) {
  30. return get_header(ptr)->previous_size >> 1;
  31. }
  32. void * get_previous(void *ptr) {
  33. return (void *) ((char *) ptr - get_previous_size(ptr));
  34. }
  35. void remove_block(void *block, void *starting_node) {
  36. void *current_node, *previous_node;
  37. // Traverse a list starting from the starting node until block is found.
  38. for(current_node = starting_node; current_node != NULL;
  39. current_node = get_next(current_node)) {
  40. if(current_node == block) {
  41. if(current_node == starting_node) {
  42. starting_node = get_next(block);
  43. } else {
  44. set_next(previous_node, get_next(block));
  45. }
  46. break;
  47. }
  48. previous_node = current_node;
  49. }
  50. }