block_header.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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. static block_header_t * get_header(void *ptr);
  8. static 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 >> 1;
  16. }
  17. size_t get_size_availability(void *ptr) {
  18. return get_header(ptr)->size;
  19. }
  20. void set_size(void *ptr, size_t size) {
  21. get_header(ptr)->size = size << 1;
  22. }
  23. void set_requested_size(void *ptr, size_t size) {
  24. get_header(ptr)->requested_size = size;
  25. }
  26. void set_next(void *ptr, void *next_block) {
  27. get_header(ptr)->next = next_block;
  28. }
  29. bool is_previous_free(void *ptr) {
  30. return (bool) (get_header(ptr)->previous_size & 1);
  31. }
  32. void set_previous_size(void *ptr, size_t previous_size) {
  33. get_header(ptr)->previous_size = previous_size;
  34. }
  35. size_t get_previous_size(void *ptr) {
  36. return get_header(ptr)->previous_size >> 1;
  37. }
  38. void * get_previous(void *ptr) {
  39. return (void *) ((char *) ptr - get_previous_size(ptr));
  40. }
  41. void remove_block(void *block, void *starting_node) {
  42. void *current_node, *previous_node;
  43. // Traverse a list starting from the starting node until block is found.
  44. for(current_node = starting_node; current_node != NULL;
  45. current_node = get_next(current_node)) {
  46. if(current_node == block) {
  47. if(current_node == starting_node) {
  48. starting_node = get_next(block);
  49. } else {
  50. set_next(previous_node, get_next(block));
  51. }
  52. break;
  53. }
  54. previous_node = current_node;
  55. }
  56. }