|
@@ -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;
|
|
|
}
|