浏览代码

Set size now takes place along with marking blocks as used/free.

Ioannis Koutras 13 年之前
父节点
当前提交
a85e415824
共有 6 个文件被更改,包括 25 次插入13 次删除
  1. 10 2
      private-include/block_header.h
  2. 7 1
      src/block_header.c
  3. 1 1
      src/coalesce.c
  4. 4 2
      src/custom_malloc.c
  5. 2 5
      src/split.c
  6. 1 2
      src/sys_alloc.c

+ 10 - 2
private-include/block_header.h

@@ -92,12 +92,20 @@ size_t get_requested_size(void *ptr);
 size_t get_size_availability(void *ptr);
 
 /**
- * Set the size of the memory block's data
+ * Set the size of the memory block's data and mark it free
  *
  * \param ptr 	The pointer to the data part of the current memory block.
  * \param size 	The size of the data part of the current memory block.
  */
-void set_size(void *ptr, size_t size);
+void set_size_and_free(void *ptr, size_t size);
+
+/**
+ * Set the size of the memory block's data and mark it used
+ *
+ * \param ptr 	The pointer to the data part of the current memory block.
+ * \param size 	The size of the data part of the current memory block.
+ */
+void set_size_and_used(void *ptr, size_t size);
 
 /**
  * Set the requested size of memory block's data

+ 7 - 1
src/block_header.c

@@ -33,10 +33,16 @@ size_t get_size_availability(void *ptr) {
     return get_header(ptr)->size;
 }
 
-void set_size(void *ptr, size_t size) {
+void set_size_and_free(void *ptr, size_t size) {
     get_header(ptr)->size = size << 1;
 }
 
+void set_size_and_used(void *ptr, size_t size) {
+    block_header_t *header = get_header(ptr);
+    header->size = size << 1;
+    header->size |= 1;
+}
+
 void set_requested_size(void *ptr, size_t size) {
     get_header(ptr)->requested_size = size;
 }

+ 1 - 1
src/coalesce.c

@@ -45,7 +45,7 @@ void * coalesce(void *ptr, heap_t *heap, allocator_t *allocator) {
 
     // Set the new size
     // Note: the rest of the header variables will be set on free().
-    set_size(prev, get_size(prev) + get_size(ptr) + HEADER_SIZE);
+    set_size_and_free(prev, get_size(prev) + get_size(ptr) + HEADER_SIZE);
 
     /* If the current block is the allocator's border pointer, update the
      * latter to point to the previous block.

+ 4 - 2
src/custom_malloc.c

@@ -80,7 +80,6 @@ void * custom_ahmalloc(allocator_t* allocator, heap_t* heap, size_t size) {
 
         /* FIXME To be refactored - START */
         set_requested_size(ptr, size);
-        mark_used(ptr);
 
         /* Try to split */
 #if defined (SPLITTING_FIXED) || defined (SPLITTING_VARIABLE)
@@ -95,8 +94,11 @@ void * custom_ahmalloc(allocator_t* allocator, heap_t* heap, size_t size) {
 
         if(new_size > min_split_size) {
             split(allocator, heap, ptr, new_size);
+        } else {
+            mark_used(ptr);
         }
-
+#else
+        mark_used(ptr);
 #endif /* (SPLITTING_FIXED) || (SPLITTING_VARIABLE) */
 
         /* Update the used blocks list */

+ 2 - 5
src/split.c

@@ -30,11 +30,9 @@ void split(allocator_t *allocator, heap_t *heap, void *ptr,
             HEADER_SIZE);
 
     /* Resize the previous, used block */
-    set_size(ptr, get_requested_size(ptr));
-    /* set_size() resets the availability of the block */
-    mark_used(ptr);
+    set_size_and_used(ptr, get_requested_size(ptr));
 
-    set_size(new_block, new_block_size);
+    set_size_and_free(new_block, new_block_size);
     set_previous_size_availability(new_block, get_size_availability(ptr));
 
 #ifdef WITH_FIXED_LISTS
@@ -61,7 +59,6 @@ void split(allocator_t *allocator, heap_t *heap, void *ptr,
 #endif /* WITH_FIXED_LISTS */
 
     set_owner(new_block, heap);
-    mark_free(new_block);
 
     if(allocator->border_ptr == ptr) {
         allocator->border_ptr = new_block;

+ 1 - 2
src/sys_alloc.c

@@ -105,12 +105,11 @@ void *sys_alloc(allocator_t *allocator, heap_t *heap, size_t size) {
     allocator->border_ptr = ptr;
 
     /* Set some values for block header */
-    set_size(ptr, req_padding(size));
+    set_size_and_used(ptr, req_padding(size));
     set_previous_size_availability(ptr, previous_size_availability);
 
     /* FIXME To be refactored - START */
     set_requested_size(ptr, size);
-    mark_used(ptr);
 
     /* Update the used blocks list */
     push_block(ptr, heap->used_blocks_head);