|
@@ -25,7 +25,6 @@
|
|
|
#include "freelist/block_header_funcs.h"
|
|
|
#include "freelist/linked_lists/linked_lists.h"
|
|
|
#include "freelist/linked_lists/search_algorithms.h"
|
|
|
-#include "other.h"
|
|
|
|
|
|
#if defined (SPLITTING_FIXED) || defined (SPLITTING_VARIABLE)
|
|
|
#include "freelist/split.h"
|
|
@@ -33,22 +32,50 @@
|
|
|
|
|
|
#include "freelist/freelist_malloc.h"
|
|
|
|
|
|
-#include <stdio.h>
|
|
|
-
|
|
|
#if defined (BEST_FIT)
|
|
|
-#define search_on_free(size) best_fit_on_freelist(raw_block, size)
|
|
|
+#define search_on_free(size) best_fit_on_freelist(rb_header, size)
|
|
|
#elif defined (GOOD_FIT)
|
|
|
-#define search_on_free(size) good_fit_on_freelist(raw_block, size)
|
|
|
+#define search_on_free(size) good_fit_on_freelist(rb_header, size)
|
|
|
#elif defined (EXACT_FIT)
|
|
|
-#define search_on_free(size) exact_fit_on_freelist(raw_block, size)
|
|
|
+#define search_on_free(size) exact_fit_on_freelist(rb_header, size)
|
|
|
#elif defined (FIRST_FIT)
|
|
|
-#define search_on_free(size) first_fit_on_freelist(raw_block, size)
|
|
|
-#endif /* BEST_FIT */
|
|
|
+#define search_on_free(size) first_fit_on_freelist(rb_header, size)
|
|
|
+#endif /* BEST_FIT */
|
|
|
+
|
|
|
+size_t req_padding(size_t size);
|
|
|
+
|
|
|
+size_t req_padding(size_t size) {
|
|
|
+ size_t align;
|
|
|
+
|
|
|
+ if(size <= 32)
|
|
|
+ return 32;
|
|
|
+ if(size <= 64)
|
|
|
+ return 64;
|
|
|
+ if(size <= 128)
|
|
|
+ return 128;
|
|
|
+ if(size <= 256)
|
|
|
+ return 256;
|
|
|
+
|
|
|
+ align = size % 4;
|
|
|
+ if(align != 0) {
|
|
|
+ size += 4 - align;
|
|
|
+ }
|
|
|
+
|
|
|
+ return size;
|
|
|
+}
|
|
|
|
|
|
+/** Tries to allocate memory from a specific free-list organized raw block.
|
|
|
+ * @param raw_block The pointer of the raw block.
|
|
|
+ * @param size The requested size.
|
|
|
+ * @retval The address of the returned memory space.
|
|
|
+ */
|
|
|
void * freelist_malloc(raw_block_header_t *raw_block, size_t size) {
|
|
|
+ freelist_rb_t *rb_header;
|
|
|
block_header_t *ptr;
|
|
|
size_t allocation_size, previous_size, previous_size_availability;
|
|
|
|
|
|
+ rb_header = (freelist_rb_t *)((char *)raw_block +
|
|
|
+ sizeof(raw_block_header_t));
|
|
|
ptr = NULL;
|
|
|
|
|
|
#ifdef HAVE_LOCKS
|
|
@@ -64,32 +91,34 @@ void * freelist_malloc(raw_block_header_t *raw_block, size_t size) {
|
|
|
|
|
|
/* Try to split */
|
|
|
#if defined (SPLITTING_FIXED) || defined (SPLITTING_VARIABLE)
|
|
|
- split(raw_block, ptr, size);
|
|
|
+ split(rb_header, ptr, size);
|
|
|
#endif /* (SPLITTING_FIXED) || (SPLITTING_VARIABLE) */
|
|
|
|
|
|
- mark_used(raw_block, ptr);
|
|
|
+ mark_used(rb_header, ptr);
|
|
|
} else {
|
|
|
|
|
|
allocation_size = req_padding(size) + HEADER_SIZE;
|
|
|
- if(allocation_size < raw_block->remaining_size) {
|
|
|
- if(raw_block->border_ptr == NULL) {
|
|
|
+
|
|
|
+ if(allocation_size < (char *) raw_block + raw_block->size -
|
|
|
+ (char *) rb_header->border_ptr -
|
|
|
+ get_size(rb_header->border_ptr)) {
|
|
|
+ if(rb_header->border_ptr == (block_header_t *)((char *)rb_header +
|
|
|
+ sizeof(freelist_rb_t))) {
|
|
|
previous_size_availability = 1; // Occupied and of 0 size
|
|
|
- ptr = (block_header_t *)((char *)raw_block +
|
|
|
- sizeof(raw_block_header_t));
|
|
|
+ ptr = (block_header_t *)((char *)rb_header +
|
|
|
+ sizeof(freelist_rb_t));
|
|
|
} else {
|
|
|
- previous_size = get_size(raw_block->border_ptr);
|
|
|
+ previous_size = get_size(rb_header->border_ptr);
|
|
|
previous_size_availability =
|
|
|
- get_size_availability(raw_block->border_ptr);
|
|
|
- ptr = (block_header_t *)((char *)raw_block->border_ptr +
|
|
|
+ get_size_availability(rb_header->border_ptr);
|
|
|
+ ptr = (block_header_t *)((char *)rb_header->border_ptr +
|
|
|
previous_size);
|
|
|
}
|
|
|
|
|
|
- // Update raw block metadata
|
|
|
- raw_block->remaining_size -= allocation_size;
|
|
|
- raw_block->border_ptr = ptr;
|
|
|
+ rb_header->border_ptr = ptr;
|
|
|
|
|
|
// Update block metadata
|
|
|
- set_size_and_used(raw_block, ptr, req_padding(size));
|
|
|
+ set_size_and_used(rb_header, ptr, req_padding(size));
|
|
|
set_previous_size_availability(ptr, previous_size_availability);
|
|
|
#ifdef REQUEST_SIZE_INFO
|
|
|
set_requested_size(ptr, req_padding(size));
|
|
@@ -126,7 +155,15 @@ void * freelist_malloc(raw_block_header_t *raw_block, size_t size) {
|
|
|
#include "freelist/coalesce.h"
|
|
|
#endif /* COALESCING_FIXED || COALESCING_VARIABLE */
|
|
|
|
|
|
+/** Frees the memory block inside of a specific free-list organized raw block.
|
|
|
+ * @param raw_block The pointer of the raw block.
|
|
|
+ * @param ptr The pointer of the memory block to be freed.
|
|
|
+ */
|
|
|
void freelist_free(raw_block_header_t *raw_block, void *ptr) {
|
|
|
+ freelist_rb_t *rb_header;
|
|
|
+
|
|
|
+ rb_header = (freelist_rb_t *)((char *)raw_block +
|
|
|
+ sizeof(raw_block_header_t));
|
|
|
ptr = get_header(ptr);
|
|
|
|
|
|
#ifdef HAVE_LOCKS
|
|
@@ -138,10 +175,10 @@ void freelist_free(raw_block_header_t *raw_block, void *ptr) {
|
|
|
#endif /* WITH_STATS */
|
|
|
|
|
|
#if defined (COALESCING_FIXED) || defined (COALESCING_VARIABLE)
|
|
|
- coalesce(raw_block, ptr);
|
|
|
+ coalesce(rb_header, ptr);
|
|
|
#else
|
|
|
- mark_free(raw_block, ptr);
|
|
|
- add_block(raw_block, ptr);
|
|
|
+ mark_free(rb_header, ptr);
|
|
|
+ add_block(rb_header, ptr);
|
|
|
#endif /* COALESCING_FIXED || COALESCING_VARIABLE */
|
|
|
|
|
|
#ifdef WITH_STATS
|