|
@@ -1,134 +1,10 @@
|
|
#include <stdio.h>
|
|
#include <stdio.h>
|
|
#include "heap.h"
|
|
#include "heap.h"
|
|
#include "other.h"
|
|
#include "other.h"
|
|
-#include "posix_lock.h"
|
|
|
|
#include "LeaHeader.h"
|
|
#include "LeaHeader.h"
|
|
#include "dmm_init.h"
|
|
#include "dmm_init.h"
|
|
-
|
|
|
|
-/*
|
|
|
|
-void *first_fit_search(size_t size, NODE *starting_node);
|
|
|
|
-
|
|
|
|
-void *first_fit_search(size_t size, NODE *starting_node) {
|
|
|
|
- NODE *node;
|
|
|
|
- int found;
|
|
|
|
- void *ptr;
|
|
|
|
-
|
|
|
|
- node = starting_node;
|
|
|
|
- found = 0;
|
|
|
|
-
|
|
|
|
- if(node != NULL &&
|
|
|
|
-
|
|
|
|
- while(node && !found) {
|
|
|
|
- if(getSize(node->data) >= size) {
|
|
|
|
- ptr = node
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
-}
|
|
|
|
-*/
|
|
|
|
-
|
|
|
|
-void *custom_malloc(heap_t* heap, size_t size);
|
|
|
|
-
|
|
|
|
-void *custom_malloc(heap_t* heap, size_t size) {
|
|
|
|
- leaHdr *ptr;
|
|
|
|
- int fixed_list_id, i, found;
|
|
|
|
- MAPTABLE_NODE *current_maptable_node;
|
|
|
|
- leaHdr *current_node;
|
|
|
|
-
|
|
|
|
- ptr = NULL;
|
|
|
|
-
|
|
|
|
- posix_lock(heap);
|
|
|
|
-
|
|
|
|
- fixed_list_id = map_size_to_list(heap, size);
|
|
|
|
-
|
|
|
|
- // If a fixed list is found, do a first fit
|
|
|
|
- if(fixed_list_id != -1) {
|
|
|
|
- current_maptable_node = heap->maptable_head;
|
|
|
|
- // traverse through the maptable node list
|
|
|
|
- if(fixed_list_id != 0) {
|
|
|
|
- for(i = 1; i < fixed_list_id; i++) {
|
|
|
|
- current_maptable_node = current_maptable_node->next;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- if(current_maptable_node->fixed_list_head != NULL) {
|
|
|
|
- ptr = current_maptable_node->fixed_list_head;
|
|
|
|
- current_maptable_node->fixed_list_head = ptr->next;
|
|
|
|
- set_requested_size(ptr, size);
|
|
|
|
- markInUse(ptr);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if(ptr == NULL) {
|
|
|
|
- found = 0;
|
|
|
|
-
|
|
|
|
- // first fit from free list
|
|
|
|
- current_node = heap->free_list_head;
|
|
|
|
-
|
|
|
|
- if(current_node != NULL && getSize(current_node) >= size) {
|
|
|
|
- ptr = current_node;
|
|
|
|
- heap->free_list_head = ptr->next;
|
|
|
|
- set_requested_size(ptr, size);
|
|
|
|
- markInUse(ptr);
|
|
|
|
- }
|
|
|
|
- while(current_node && !found) {
|
|
|
|
- if(getSize(current_node->next) >= size) {
|
|
|
|
- ptr = current_node->next;
|
|
|
|
- current_node->next = ptr->next;
|
|
|
|
- set_requested_size(ptr, size);
|
|
|
|
- markInUse(ptr);
|
|
|
|
- found = 1;
|
|
|
|
- }
|
|
|
|
- current_node = current_node->next;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if(!found) {
|
|
|
|
- posix_unlock(heap);
|
|
|
|
- return sys_alloc(size);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- posix_unlock(heap);
|
|
|
|
- return ptr;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-void custom_free(heap_t* heap, void *ptr);
|
|
|
|
-
|
|
|
|
-void custom_free(heap_t* heap, void *ptr) {
|
|
|
|
- size_t size;
|
|
|
|
- int fixed_list_id, i;
|
|
|
|
- MAPTABLE_NODE *current_maptable_node;
|
|
|
|
- leaHdr *test;
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- size = getSize((char *) ptr);
|
|
|
|
- fixed_list_id = map_size_to_list(heap, size);
|
|
|
|
-
|
|
|
|
- posix_lock(heap);
|
|
|
|
-
|
|
|
|
- if(fixed_list_id != -1) {
|
|
|
|
- current_maptable_node = heap->maptable_head;
|
|
|
|
- if(fixed_list_id == 0) {
|
|
|
|
- test = getHeader(ptr);
|
|
|
|
- test->next = current_maptable_node->fixed_list_head;
|
|
|
|
- //getHeader((char *) ptr)->next = current_maptable_node->fixed_list_head;
|
|
|
|
- current_maptable_node->fixed_list_head = ptr;
|
|
|
|
- } else {
|
|
|
|
- for(i = 1; i < fixed_list_id; i++) {
|
|
|
|
- current_maptable_node = current_maptable_node->next;
|
|
|
|
- }
|
|
|
|
- getHeader(ptr)->next = current_maptable_node->fixed_list_head;
|
|
|
|
- current_maptable_node->fixed_list_head = ptr;
|
|
|
|
- }
|
|
|
|
- } else { // put it in the free list
|
|
|
|
- getHeader(ptr)->next = heap->free_list_head;
|
|
|
|
- heap->free_list_head = getHeader(ptr);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- markFree((char *) ptr);
|
|
|
|
-
|
|
|
|
- posix_unlock(heap);
|
|
|
|
-}
|
|
|
|
|
|
+#include "custom_malloc.h"
|
|
|
|
+#include "custom_free.h"
|
|
|
|
|
|
int main(void) {
|
|
int main(void) {
|
|
allocator_t *myallocator;
|
|
allocator_t *myallocator;
|
|
@@ -140,6 +16,6 @@ int main(void) {
|
|
heap_id = map_thread_heap();
|
|
heap_id = map_thread_heap();
|
|
printf("This thread accesses heap %d\n", heap_id);
|
|
printf("This thread accesses heap %d\n", heap_id);
|
|
myheap = &myallocator->heaps[heap_id];
|
|
myheap = &myallocator->heaps[heap_id];
|
|
- p = custom_malloc(myheap, 32);
|
|
|
|
|
|
+ p = custom_malloc(myheap, (size_t) 32);
|
|
custom_free(myheap, p);
|
|
custom_free(myheap, p);
|
|
}
|
|
}
|