|
@@ -15,7 +15,7 @@ size_t get_size(void *ptr) {
|
|
|
}
|
|
|
|
|
|
void set_size(void *ptr, size_t size) {
|
|
|
- get_header(ptr)->size = size;
|
|
|
+ get_header(ptr)->size = size << 1;
|
|
|
}
|
|
|
|
|
|
void set_requested_size(void *ptr, size_t size) {
|
|
@@ -25,3 +25,35 @@ void set_requested_size(void *ptr, size_t size) {
|
|
|
void set_next(void *ptr, void *next_block) {
|
|
|
get_header(ptr)->next = next_block;
|
|
|
}
|
|
|
+
|
|
|
+bool is_previous_free(void *ptr) {
|
|
|
+ return (bool) (get_header(ptr)->previous_size & 1);
|
|
|
+}
|
|
|
+
|
|
|
+size_t get_previous_size(void *ptr) {
|
|
|
+ return get_header(ptr)->previous_size >> 1;
|
|
|
+}
|
|
|
+
|
|
|
+void * get_previous(void *ptr) {
|
|
|
+ return (void *) ((char *) ptr - get_previous_size(ptr));
|
|
|
+}
|
|
|
+
|
|
|
+void remove_block(void *block, void *starting_node) {
|
|
|
+ void *current_node, *previous_node;
|
|
|
+
|
|
|
+ // If the block to be removed is the head of the list, then just point
|
|
|
+ // the next block as head.
|
|
|
+ if(current_node == starting_node) {
|
|
|
+ starting_node = get_next(block);
|
|
|
+ // Else traverse through the list until the memory block is found.
|
|
|
+ } else {
|
|
|
+ for(current_node = starting_node; current_node != NULL;
|
|
|
+ current_node = get_next(current_node)) {
|
|
|
+ if(current_node == block) {
|
|
|
+ set_next(previous_node, get_next(block));
|
|
|
+ }
|
|
|
+ previous_node = current_node;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|