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