瀏覽代碼

First fit for nodes from fixed lists.

Ioannis Koutras 14 年之前
父節點
當前提交
f25c745a52
共有 3 個文件被更改,包括 34 次插入14 次删除
  1. 10 8
      LeaHeader.c
  2. 4 1
      LeaHeader.h
  3. 20 5
      test.c

+ 10 - 8
LeaHeader.c

@@ -10,7 +10,7 @@ size_t getSize (void *ptr) {
 }
 
 size_t getPrevSize (void *ptr) {
-	size_t sz = getHeader(ptr)->prevSize;
+	size_t sz = getHeader(ptr)->previous_size;
 	return sz >> 1;
 }
 
@@ -25,21 +25,21 @@ void setSize(void *ptr, size_t sz) {
 }
 
 void setPrevSize (void *ptr, size_t sz) {
-	size_t prevSize = getHeader(ptr)->prevSize;
-	prevSize = (prevSize & 1) | (sz << 1);
-	getHeader(ptr)->prevSize = prevSize;
+	size_t previous_size = getHeader(ptr)->previous_size;
+	previous_size = (previous_size & 1) | (sz << 1);
+	getHeader(ptr)->previous_size = previous_size;
 }
 
 void markPrevFree (char * ptr) {
-	getHeader(ptr)->prevSize &= (size_t) (~ 1);
+	getHeader(ptr)->previous_size &= (size_t) (~ 1);
 }
 
 void markPrevInUse (char * ptr) {
-	getHeader(ptr)->prevSize |= 1;
+	getHeader(ptr)->previous_size |= 1;
 }
 
 size_t isPrevFree (char * ptr) {
-	size_t free = ~(getHeader(ptr)->prevSize & 1);
+	size_t free = ~(getHeader(ptr)->previous_size & 1);
 	return (free & 1) ;
 }
 
@@ -51,8 +51,10 @@ void markFree (char * ptr) {
 	markPrevFree(getNext(ptr));
 }
 	
-
 size_t isFree (char * ptr) {
 	return isPrevFree(getNext(ptr));
 }
 
+void set_requested_size (void *ptr, size_t size) {
+	getHeader(ptr)->requested_size = size;
+}

+ 4 - 1
LeaHeader.h

@@ -5,7 +5,8 @@
 
 struct LeaHeader {
 	size_t size;
-	size_t prevSize;
+	size_t previous_size;
+	size_t requested_size; /**< originally requested size by the application */
 };
 
 typedef struct LeaHeader  leaHdr;
@@ -40,4 +41,6 @@ void markFree (char * ptr);
 
 size_t isFree (char * ptr);
 
+void set_requested_size(void *ptr, size_t size);
+
 #endif /*RA_LEAHEADER_H*/

+ 20 - 5
test.c

@@ -2,8 +2,10 @@
 #include "heap.h"
 #include "other.h"
 #include "posix_lock.h"
+#include "LeaHeader.h"
 #include "dmm_init.h"
 
+/*
 void *first_fit_search(unsigned int size, NODE *starting_node,
 		char is_fixed_global) {
 	NODE *node;
@@ -14,14 +16,16 @@ void *first_fit_search(unsigned int size, NODE *starting_node,
 
 	}
 
-
 }
 
-void *custom_malloc(heap_t* heap, unsigned int size);
+*/
+
+void *custom_malloc(heap_t* heap, size_t size);
 
-void *custom_malloc(heap_t* heap, unsigned int size) {
+void *custom_malloc(heap_t* heap, size_t size) {
 	void *ptr;
-	int fixed_list_id;
+	int fixed_list_id, i;
+	MAPTABLE_NODE *current_maptable_node;
 
 	ptr = NULL;
 
@@ -29,8 +33,19 @@ void *custom_malloc(heap_t* heap, unsigned int size) {
 
 	fixed_list_id = map_size_to_list(heap, size);
 	
+	// If a fixed list is found, do a first fit
 	if(fixed_list_id != -1) {
-		// first fit from fixed list
+		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;
+			}
+		}
+		ptr = current_maptable_node->fixed_list_head;
+		current_maptable_node->fixed_list_head = ((NODE *) ptr)->next;
+		set_requested_size(ptr, size);
+		markInUse(ptr);
 	}
 
 	if(ptr == NULL) {