Переглянути джерело

Support to change search policy on design time and/or runtime.

Ioannis Koutras 13 роки тому
батько
коміт
9495c12fa5
6 змінених файлів з 80 додано та 2 видалено
  1. 7 0
      CMakeLists.txt
  2. 21 1
      DefineOptions.cmake
  3. 13 0
      dmm_config.h.in
  4. 8 0
      include/dmmlib/heap.h
  5. 15 1
      src/custom_malloc.c
  6. 16 0
      src/initialize_allocator.c

+ 7 - 0
CMakeLists.txt

@@ -46,6 +46,13 @@ message(STATUS "Predefined lists of fixed-sized blocks: " ${WITH_FIXED_LISTS})
 message(STATUS "Heap Ownership per Block: " ${WITH_OWNERSHIP})
 message(STATUS "Have statistics: " ${WITH_STATS})
 message(STATUS "Have knobs: " ${WITH_KNOBS})
+message(STATUS "Search policy: " ${SEARCH_POLICY})
+if(ALLOC_VAR_FIT OR HEAP_VAR_FIT)
+  message(STATUS "Initial search policy: " ${INITIAL_SEARCH_POLICY})
+endif(ALLOC_VAR_FIT OR HEAP_VAR_FIT)
+if(GOOD_FIT)
+  message(STATUS "Acceptable fit percentage: " ${FIT_PERCENTAGE})
+endif(GOOD_FIT)
 message(STATUS "Coalescing: " ${WITH_COALESCING})
 if(MAX_COALESCE_SIZE)
   if(WITH_COALESCING STREQUAL "fixed")

+ 21 - 1
DefineOptions.cmake

@@ -19,6 +19,10 @@ endif (NUM_HEAPS GREATER 1)
 
 set(WITH_SYSTEM_CALLS "no" "Build with OS call support for more memory")
 
+set(SEARCH_POLICY "best")
+set(FIT_PERCENTAGE 0.8)
+set(INITIAL_SEARCH_POLICY "best")
+
 set(WITH_COALESCING "never" "Build with coalescing support")
 set(WITH_SPLITTING "never" "Build with splitting support")
 
@@ -57,6 +61,8 @@ endif (LEON3)
 
 if (LINUXTEST)
   set(WITH_SYSTEM_CALLS "mmap")
+  set(SEARCH_POLICY "allocvar")
+  set(FIT_PERCENTAGE 0.6)
   set(HAVE_LOCKS ON)
   set(WITH_EXAMPLES ON)
   set(WITH_COALESCING "variable")
@@ -78,7 +84,21 @@ endif(BLOCKS_ORGANIZATION STREQUAL "dll")
 
 if(WITH_SYSTEM_CALLS STREQUAL "mmap")
   set(WITH_MMAP ON)
-endif(WITH_SYSTEM_CALLS)
+endif(WITH_SYSTEM_CALLS STREQUAL "mmap")
+
+if(SEARCH_POLICY STREQUAL "best")
+  set(BEST_FIT ON)
+elseif(SEARCH_POLICY STREQUAL "good")
+  set(GOOD_FIT ON)
+elseif(SEARCH_POLICY STREQUAL "exact")
+  set(EXACT_FIT ON)
+elseif(SEARCH_POLICY STREQUAL "first")
+  set(FIRST_FIT ON)
+elseif(SEARCH_POLICY STREQUAL "allocvar")
+  set(ALLOC_VAR_FIT ON)
+elseif(SEARCH_POLICY STREQUAL "heapvar")
+  set(HEAP_VAR_FIT ON)
+endif(SEARCH_POLICY STREQUAL "best")
 
 if(WITH_COALESCING STREQUAL "fixed")
   if(NOT DEFINED MAX_COALESCE_SIZE)

+ 13 - 0
dmm_config.h.in

@@ -12,6 +12,19 @@
 
 #cmakedefine WITH_FIXED_LISTS
 
+#cmakedefine BEST_FIT
+#cmakedefine GOOD_FIT
+#ifdef GOOD_FIT
+#cmakedefine FIT_PERCENTAGE @FIT_PERCENTAGE@
+#endif /* GOOD_FIT */
+#cmakedefine EXACT_FIT
+#cmakedefine FIRST_FIT
+#cmakedefine ALLOC_VAR_FIT
+#cmakedefine HEAP_VAR_FIT
+#if defined (ALLOC_VAR_FIT) || defined (HEAP_VAR_FIT)
+#cmakedefine INITIAL_SEARCH_POLICY "@INITIAL_SEARCH_POLICY@"
+#endif /* defined (ALLOC_VAR_FIT) || defined (HEAP_VAR_FIT) */
+
 #cmakedefine COALESCING_FIXED
 #cmakedefine COALESCING_VARIABLE
 

+ 8 - 0
include/dmmlib/heap.h

@@ -95,6 +95,10 @@ typedef struct dmmknobs_s {
 
 /** A structure to store heap information. */
 typedef struct heap_s {
+#ifdef HEAP_VAR_FIT
+	/** Current search policy on the allocator's free lists. */
+	void *(*search_policy)(heap_t * heap, size_t requested_size);
+#endif /* HEAP_VAR_FIT */
 #ifdef WITH_FIXED_LISTS
 	maptable_node_t *maptable_head; /**< The head of the maptable list. */
 #endif /* WITH_FIXED_LISTS */
@@ -126,6 +130,10 @@ typedef struct allocator_s {
 	void *border_ptr; /**< Border pointer of the allocator. */
 	size_t remaining_size; /**< The size of the remaining free space which
 				 is handled by the allocator. */
+#ifdef ALLOC_VAR_FIT
+	/** Current search policy on the allocator's free lists. */
+	void *(*search_policy)(heap_t * heap, size_t requested_size);
+#endif /* ALLOC_VAR_FIT */
 } allocator_t;
 
 #endif /* HEAP_H */

+ 15 - 1
src/custom_malloc.c

@@ -33,6 +33,16 @@
 #include "dmm_adaptor.h"
 #endif /* WITH_ADAPTIVITY */
 
+#if defined (BEST_FIT)
+#define search_on_free(size) best_fit_on_freelist(heap, size)
+#elif defined (GOOD_FIT)
+#define search_on_free(size) good_fit_on_freelist(heap, size, FIT_PERCENTAGE)
+#elif defined (EXACT_FIT)
+#define search_on_free(size) exact_fit_on_freelist(heap, size)
+#elif defined (FIRST_FIT)
+#define search_on_free(size) first_fit_on_freelist(heap, size)
+#endif /* BEST_FIT */
+
 void * custom_ahmalloc(allocator_t* allocator, heap_t* heap, size_t size) {
     void *ptr;
 #if defined (SPLITTING_FIXED) || defined (SPLITTING_VARIABLE)
@@ -69,7 +79,11 @@ void * custom_ahmalloc(allocator_t* allocator, heap_t* heap, size_t size) {
 
     if(ptr == NULL) {
 #endif /* WITH_FIXED_LISTS */
-       ptr = best_fit_on_freelist(heap, size);
+#ifdef ALLOC_VAR_FIT
+        ptr = (*allocator->search_policy)(heap, req_padding(size));
+#else /* ALLOC_VAR_FIT */
+        ptr = search_on_free(size);
+#endif /* ALLOC_VAR_FIT */
 #ifdef WITH_FIXED_LISTS
     }
 #endif /* WITH_FIXED_LISTS */

+ 16 - 0
src/initialize_allocator.c

@@ -24,6 +24,11 @@
 #endif /* HAVE_LOCKS */
 #include "sys_alloc.h"
 
+#if defined (ALLOC_VAR_FIT) || defined (HEAP_VAR_FIT)
+#include <string.h> /* for strcmp() */
+#include "linked_lists/search_algorithms.h"
+#endif /* defined (ALLOC_VAR_FIT) || defined (HEAP_VAR_FIT) */
+
 #ifdef WITH_MEMORY_SPACE_AWARENESS
 void initialize_allocator(allocator_t *allocator, void *starting_address, 
         size_t size) {
@@ -41,6 +46,11 @@ void initialize_allocator(allocator_t *allocator) {
 #endif /* HAVE_LOCKS */
 
     for(i = 0; i < NUM_HEAPS; i++) {
+#ifdef HEAP_VAR_FIT
+    if(INITIAL_SEARCH_POLICY == "best") {
+        allocator->heaps[i].search_policy = &best_fit_on_freelist;
+    }
+#endif /* HEAP_VAR_FIT */
 #ifdef WITH_FIXED_LISTS
         allocator->heaps[i].maptable_head = NULL;
 #endif /* WITH_FIXED_LISTS */
@@ -91,6 +101,12 @@ void initialize_allocator(allocator_t *allocator) {
 #endif /* WITH_MEMORY_SPACE_AWARENESS */
     allocator->initialized = false;
 
+#ifdef ALLOC_VAR_FIT
+    if(strcmp(INITIAL_SEARCH_POLICY, "best") == 0) {
+        allocator->search_policy = &best_fit_on_freelist;
+    }
+#endif /* ALLOC_VAR_FIT */
+
 #ifdef WITH_FIXED_LISTS
 
     /* Custom number of fixed lists and their initialization