Преглед изворни кода

freelist_realloc(): do not do anything if requested size is less than the block's one; try to re-allocate to other raw blocks as well

Ioannis Koutras пре 12 година
родитељ
комит
8b687af6cf
2 измењених фајлова са 14 додато и 3 уклоњено
  1. 12 2
      src/freelist/realloc.c
  2. 2 1
      src/realloc.c

+ 12 - 2
src/freelist/realloc.c

@@ -36,8 +36,6 @@
 /**
  * Re-allocates a memory block from a freelist-organized raw block
  *
- * FIXME Tries to re-allocate only in the same raw block.
- *
  * @param  raw_block The pointer of the freelist raw block.
  * @param  ptr       The pointer of the memory block to be re-allocated.
  * @param  req_size  The requested memory size.
@@ -51,9 +49,21 @@ void * freelist_realloc(freelist_rb_t *raw_block, void *ptr,
 
     block = (block_header_t *)((char *) ptr - HEADER_SIZE);
 
+    if(get_size(block) > req_size) {
+        /* TODO Maybe create a memory block in the unneeded space */
+        return ptr;
+    }
+
+    /* First try to allocate space from the same raw block.
+     * If it fails, try a more generic malloc. */
+
     ret = freelist_malloc(raw_block, req_size);
 
     if(ret == NULL) {
+        ret = malloc(req_size);
+    }
+
+    if(ret == NULL) {
         return NULL;
     }
 

+ 2 - 1
src/realloc.c

@@ -46,7 +46,8 @@ void * realloc(void *ptr, size_t size) {
     void *return_ptr = NULL;
 
     if(ptr == NULL) {
-        return malloc(size);
+        return_ptr = malloc(size);
+        goto done;
     }
 
     if(size == 0) {