|
@@ -30,11 +30,16 @@
|
|
|
#include "locks.h"
|
|
|
#include "default_rb.h"
|
|
|
#include "other.h"
|
|
|
+#include "statistics.h"
|
|
|
|
|
|
#include "release_memory.h"
|
|
|
#include <sys/mman.h>
|
|
|
#include <inttypes.h>
|
|
|
|
|
|
+#ifdef PAGESIZE_ALIGN
|
|
|
+#include <unistd.h>
|
|
|
+#endif
|
|
|
+
|
|
|
#include "memcpy.h"
|
|
|
|
|
|
#include "trace.h"
|
|
@@ -60,7 +65,6 @@ void * realloc(void *ptr, size_t size) {
|
|
|
((uintptr_t) owner_raw_block + sizeof(raw_block_header_t));
|
|
|
|
|
|
return_ptr = dmmlib_realloc(encapsulated_rb, ptr, size);
|
|
|
- goto done;
|
|
|
|
|
|
} else {
|
|
|
|
|
@@ -74,48 +78,52 @@ void * realloc(void *ptr, size_t size) {
|
|
|
|
|
|
size_t full_size = sizeof(raw_block_header_t) + size;
|
|
|
|
|
|
- if(full_size <= owner_raw_block->size) {
|
|
|
+#ifdef PAGESIZE_ALIGN
|
|
|
+ size_t pagesize = (size_t) sysconf(_SC_PAGESIZE);
|
|
|
+ full_size = pagesize * ((full_size + pagesize - 1) / pagesize);
|
|
|
+#endif
|
|
|
+
|
|
|
+ if(full_size < owner_raw_block->size) {
|
|
|
+
|
|
|
|
|
|
size_t remaining_size = owner_raw_block->size - full_size;
|
|
|
- owner_raw_block->size = full_size;
|
|
|
|
|
|
-
|
|
|
- munmap((void *)((uintptr_t) owner_raw_block +
|
|
|
- owner_raw_block->size), remaining_size);
|
|
|
+#ifdef REQUEST_SIZE_INFO
|
|
|
+ UPDATE_GLOBAL_STATS(REALLOC_LT, owner_raw_block->requested_size -
|
|
|
+ size);
|
|
|
+#else
|
|
|
+ UPDATE_GLOBAL_STATS(REALLOC_LT);
|
|
|
+#endif
|
|
|
|
|
|
-#ifdef WITH_ALLOCATOR_STATS
|
|
|
- LOCK_GLOBAL();
|
|
|
- systemallocator.dmm_stats.total_mem_allocated -=
|
|
|
- remaining_size;
|
|
|
- STATS_TRACE("dmmlib - ms all %zu\n",
|
|
|
- systemallocator.dmm_stats.total_mem_allocated);
|
|
|
+ LOCK_RAW_BLOCK(owner_raw_block);
|
|
|
+ owner_raw_block->size = full_size;
|
|
|
#ifdef REQUEST_SIZE_INFO
|
|
|
- systemallocator.dmm_stats.total_mem_requested -=
|
|
|
- remaining_size;
|
|
|
- STATS_TRACE("dmmlib - ms req %zu\n",
|
|
|
- systemallocator.dmm_stats.total_mem_requested);
|
|
|
+ owner_raw_block->requested_size = size;
|
|
|
#endif
|
|
|
- systemallocator.dmm_stats.num_realloc++;
|
|
|
+ UNLOCK_RAW_BLOCK(owner_raw_block);
|
|
|
+
|
|
|
+#ifdef WITH_ALLOCATOR_STATS
|
|
|
+ LOCK_GLOBAL();
|
|
|
+ systemallocator.dmm_stats.total_mem_allocated -= remaining_size;
|
|
|
UNLOCK_GLOBAL();
|
|
|
#endif
|
|
|
|
|
|
+
|
|
|
+ munmap((void *)((uintptr_t) owner_raw_block +
|
|
|
+ owner_raw_block->size), remaining_size);
|
|
|
+
|
|
|
return_ptr = ptr;
|
|
|
- goto done;
|
|
|
|
|
|
+ } else if(full_size == owner_raw_block->size) {
|
|
|
+
|
|
|
+ return_ptr = ptr;
|
|
|
} else {
|
|
|
|
|
|
-#ifdef WITH_ALLOCATOR_STATS
|
|
|
- size_t size_diff = full_size - owner_raw_block->size;
|
|
|
-#endif
|
|
|
-
|
|
|
raw_block_header_t *new_block = create_raw_block(full_size,
|
|
|
BIGBLOCK);
|
|
|
|
|
|
if(new_block == NULL) {
|
|
|
-
|
|
|
return_ptr = NULL;
|
|
|
- goto done;
|
|
|
-
|
|
|
} else {
|
|
|
|
|
|
return_ptr = (void *)
|
|
@@ -137,31 +145,25 @@ void * realloc(void *ptr, size_t size) {
|
|
|
UNLOCK_GLOBAL();
|
|
|
#endif
|
|
|
|
|
|
- release_memory(owner_raw_block);
|
|
|
+#ifdef REQUEST_SIZE_INFO
|
|
|
+ UPDATE_GLOBAL_STATS(REALLOC_GT, size -
|
|
|
+ owner_raw_block->requested_size);
|
|
|
+#else
|
|
|
+ UPDATE_GLOBAL_STATS(REALLOC_GT);
|
|
|
+#endif
|
|
|
|
|
|
#ifdef WITH_ALLOCATOR_STATS
|
|
|
LOCK_GLOBAL();
|
|
|
- systemallocator.dmm_stats.total_mem_allocated +=
|
|
|
- size_diff;
|
|
|
- STATS_TRACE("dmmlib - ms all %zu\n",
|
|
|
- systemallocator.dmm_stats.total_mem_allocated);
|
|
|
-#ifdef REQUEST_SIZE_INFO
|
|
|
- systemallocator.dmm_stats.total_mem_requested +=
|
|
|
- size_diff;
|
|
|
- STATS_TRACE("dmmlib - ms req %zu\n",
|
|
|
- systemallocator.dmm_stats.total_mem_requested);
|
|
|
-#endif
|
|
|
- systemallocator.dmm_stats.num_realloc++;
|
|
|
+ systemallocator.dmm_stats.total_mem_allocated += new_block->size
|
|
|
+ - owner_raw_block->size;
|
|
|
UNLOCK_GLOBAL();
|
|
|
#endif
|
|
|
|
|
|
- goto done;
|
|
|
+ release_memory(owner_raw_block);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-done:
|
|
|
-
|
|
|
MEM_TRACE("dmmlib - r %p %p %zu\n", ptr, return_ptr, size);
|
|
|
|
|
|
return return_ptr;
|