|
@@ -25,21 +25,24 @@
|
|
|
|
|
|
#include "dmmlib/dmmlib.h"
|
|
|
|
|
|
-#include <stdbool.h>
|
|
|
-
|
|
|
+#include "locks.h"
|
|
|
#include "default_rb.h"
|
|
|
+#include "other.h"
|
|
|
|
|
|
#include "release_memory.h"
|
|
|
#include <sys/mman.h>
|
|
|
|
|
|
#include <string.h>
|
|
|
|
|
|
+#ifdef WITH_DEBUG
|
|
|
+#include "debug.h"
|
|
|
+#endif /* WITH_DEBUG */
|
|
|
+
|
|
|
#include "trace.h"
|
|
|
|
|
|
void * realloc(void *ptr, size_t size) {
|
|
|
- raw_block_header_t *current_raw_block;
|
|
|
- bool found;
|
|
|
- void *return_ptr;
|
|
|
+ raw_block_header_t *owner_raw_block;
|
|
|
+ void *return_ptr = NULL;
|
|
|
|
|
|
if(ptr == NULL) {
|
|
|
return malloc(size);
|
|
@@ -47,27 +50,16 @@ void * realloc(void *ptr, size_t size) {
|
|
|
|
|
|
if(size == 0) {
|
|
|
free(ptr);
|
|
|
- return_ptr = malloc((size_t) 32); // FIXME 32 <- minimum size
|
|
|
goto done;
|
|
|
}
|
|
|
|
|
|
- current_raw_block = systemallocator.raw_block_head;
|
|
|
- found = false;
|
|
|
-
|
|
|
- while(current_raw_block) {
|
|
|
- if(((char *)ptr > (char *)current_raw_block) &&
|
|
|
- ((char *)ptr < (char *)(current_raw_block) +
|
|
|
- current_raw_block->size)) {
|
|
|
- found = true;
|
|
|
- break;
|
|
|
- }
|
|
|
- current_raw_block = current_raw_block->next_raw_block;
|
|
|
- }
|
|
|
+ owner_raw_block = find_raw_block_owner(systemallocator.raw_block_head,
|
|
|
+ ptr);
|
|
|
|
|
|
- if(found == true) {
|
|
|
+ if(owner_raw_block != NULL) {
|
|
|
|
|
|
DEFAULT_RB_T *encapsulated_rb = (DEFAULT_RB_T *)
|
|
|
- ((uintptr_t) current_raw_block + sizeof(raw_block_header_t));
|
|
|
+ ((uintptr_t) owner_raw_block + sizeof(raw_block_header_t));
|
|
|
|
|
|
return_ptr = dmmlib_realloc(encapsulated_rb, ptr, size);
|
|
|
goto done;
|
|
@@ -79,19 +71,19 @@ void * realloc(void *ptr, size_t size) {
|
|
|
// greater, a new big block is initialized, data is copied there and the
|
|
|
// old big block gets de-allocated.
|
|
|
|
|
|
- current_raw_block = (raw_block_header_t *)
|
|
|
+ owner_raw_block = (raw_block_header_t *)
|
|
|
((uintptr_t) ptr - sizeof(raw_block_header_t));
|
|
|
|
|
|
size_t full_size = sizeof(raw_block_header_t) + size;
|
|
|
|
|
|
- if(full_size <= current_raw_block->size) {
|
|
|
+ if(full_size <= owner_raw_block->size) {
|
|
|
|
|
|
- size_t remaining_size = current_raw_block->size - full_size;
|
|
|
- current_raw_block->size = full_size;
|
|
|
+ size_t remaining_size = owner_raw_block->size - full_size;
|
|
|
+ owner_raw_block->size = full_size;
|
|
|
|
|
|
// FIXME This is mmap-specific
|
|
|
- munmap((void *)((uintptr_t) current_raw_block +
|
|
|
- current_raw_block->size), remaining_size);
|
|
|
+ munmap((void *)((uintptr_t) owner_raw_block +
|
|
|
+ owner_raw_block->size), remaining_size);
|
|
|
|
|
|
#ifdef WITH_ALLOCATOR_STATS
|
|
|
systemallocator.dmm_stats.total_mem_allocated -=
|
|
@@ -110,9 +102,9 @@ void * realloc(void *ptr, size_t size) {
|
|
|
return_ptr = ptr;
|
|
|
goto done;
|
|
|
|
|
|
- } else {
|
|
|
+ } else { /* We have to create a new big block */
|
|
|
|
|
|
- size_t size_diff = full_size - current_raw_block->size;
|
|
|
+ size_t size_diff = full_size - owner_raw_block->size;
|
|
|
|
|
|
raw_block_header_t *new_block = create_raw_block(full_size,
|
|
|
BIGBLOCK);
|
|
@@ -126,11 +118,17 @@ void * realloc(void *ptr, size_t size) {
|
|
|
|
|
|
memcpy((void *)((uintptr_t) new_block +
|
|
|
sizeof(raw_block_header_t)), ptr,
|
|
|
- current_raw_block->size - sizeof(raw_block_header_t));
|
|
|
+ owner_raw_block->size - sizeof(raw_block_header_t));
|
|
|
+
|
|
|
+#ifdef WITH_DEBUG
|
|
|
+ remove_from_big_rb_list(owner_raw_block);
|
|
|
+ add_to_big_rb_list(new_block);
|
|
|
+#endif /* WITH_DEBUG */
|
|
|
|
|
|
- release_memory(current_raw_block);
|
|
|
+ release_memory(owner_raw_block);
|
|
|
|
|
|
#ifdef WITH_ALLOCATOR_STATS
|
|
|
+ lock_global();
|
|
|
systemallocator.dmm_stats.total_mem_allocated +=
|
|
|
size_diff;
|
|
|
TRACE_2("dmmlib - ms all %zu\n",
|
|
@@ -142,10 +140,11 @@ void * realloc(void *ptr, size_t size) {
|
|
|
systemallocator.dmm_stats.total_mem_requested);
|
|
|
#endif /* REQUEST_SIZE_INFO */
|
|
|
systemallocator.dmm_stats.num_realloc++;
|
|
|
+ unlock_global();
|
|
|
#endif /* WITH_ALLOCATOR_STATS */
|
|
|
|
|
|
- return_ptr = (void *)((char *)new_block +
|
|
|
- sizeof(raw_block_header_t));
|
|
|
+ return_ptr = (void *)
|
|
|
+ ((uintptr_t) new_block + sizeof(raw_block_header_t));
|
|
|
goto done;
|
|
|
}
|
|
|
}
|