Browse Source

realloc() on free-list raw blocks: use lock when doing malloc() on the same raw block

Ioannis Koutras 12 years ago
parent
commit
9f07954fe3
1 changed files with 10 additions and 6 deletions
  1. 10 6
      src/freelist/realloc.c

+ 10 - 6
src/freelist/realloc.c

@@ -50,17 +50,25 @@ void * freelist_realloc(freelist_rb_t *raw_block, void *ptr,
     block_header_t *block;
     void *ret;
 
-    block = (block_header_t *)((char *) ptr - HEADER_SIZE);
+    block = get_header(ptr);
 
     if(get_size(block) > req_size) {
         /* TODO Maybe create a memory block in the unneeded space */
         return ptr;
     }
 
+#ifdef HAVE_LOCKS
+    raw_block_header_t *rb;
+    rb = (raw_block_header_t *)
+        ((uintptr_t) raw_block - sizeof(raw_block_header_t));
+#endif /* HAVE_LOCKS */
+
     /* First try to allocate space from the same raw block.
      * If it fails, try a more generic malloc. */
 
+    LOCK_RAW_BLOCK(rb);
     ret = freelist_malloc(raw_block, req_size);
+    UNLOCK_RAW_BLOCK(rb);
 
     if(ret == NULL) {
         ret = malloc(req_size);
@@ -72,13 +80,9 @@ void * freelist_realloc(freelist_rb_t *raw_block, void *ptr,
 
     memcpy(ret, ptr, block->size);
 
-#ifdef HAVE_LOCKS
-    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);
     freelist_free(raw_block, ptr);
     UNLOCK_RAW_BLOCK(rb);
+
     return ret;
 }