Browse Source

bitmap_realloc(): check old size if it is bigger, try to use a block in the same raw block

Ioannis Koutras 12 years ago
parent
commit
7ed0480e0a
1 changed files with 29 additions and 15 deletions
  1. 29 15
      src/bitmap/bitmap_realloc.c

+ 29 - 15
src/bitmap/bitmap_realloc.c

@@ -24,6 +24,7 @@
 
 #include "bitmap/bitmap.h"
 #include "dmmlib/dmmlib.h"
+
 #include "memmove.h"
 
 #include "locks.h"
@@ -41,27 +42,40 @@ void * bitmap_realloc(bitmap_rb_t *raw_block, void * ptr,
         size_t req_size) { 
     void *ret;
     chunk_header_t *chunk_header;
+    size_t old_size;
 
-    chunk_header = (chunk_header_t *)((char *)ptr - CHUNK_HDR_SIZE);
-
-    ret = malloc(req_size);
+    chunk_header = (chunk_header_t *)((uintptr_t) ptr - CHUNK_HDR_SIZE);
+    old_size = chunk_header->num_of_cells * raw_block->bytes_per_cell -
+        CHUNK_HDR_SIZE;
 
-    if(req_size > chunk_header->num_of_cells * raw_block->bytes_per_cell -
-            CHUNK_HDR_SIZE) {
-        memmove(ret, ptr, chunk_header->num_of_cells * raw_block->bytes_per_cell
-                - CHUNK_HDR_SIZE);
+    if(old_size >= req_size) {
+        ret = ptr;
+        // TODO Free possibly unneeded cells
     } else {
-        memmove(ret, ptr, req_size);
-    }
 
 #ifdef HAVE_LOCKS
-    raw_block_header_t *rb;
-    rb = (raw_block_header_t *)
-        ((uintptr_t) raw_block - sizeof(raw_block_header_t));
+        raw_block_header_t *rb;
+        rb = (raw_block_header_t *)
+            ((uintptr_t) raw_block - sizeof(raw_block_header_t));
 #endif /* HAVE_LOCKS */
-    lock_raw_block(rb);
-    bitmap_free(raw_block, ptr);
-    unlock_raw_block(rb);
+
+        /* Try initially to allocate space from the same raw block */
+        lock_raw_block(rb);
+        ret = bitmap_malloc(raw_block, req_size);
+        unlock_raw_block(rb);
+
+        /* If no space can be found, try your luck in other raw blocks */
+        if(ret == NULL) {
+            ret = malloc(req_size);
+        }
+
+        if(ret != NULL) {
+            memmove(ret, ptr, old_size);
+            lock_raw_block(rb);
+            bitmap_free(raw_block, ptr);
+            unlock_raw_block(rb);
+        }
+    }
 
     return ret;
 }