Browse Source

realloc(): refactor statistics

Ioannis Koutras 12 years ago
parent
commit
df6c12903c
3 changed files with 60 additions and 40 deletions
  1. 4 0
      private-include/statistics.h
  2. 42 40
      src/realloc.c
  3. 14 0
      src/statistics.c

+ 4 - 0
private-include/statistics.h

@@ -52,6 +52,10 @@
 typedef enum dmm_event_type_en
     { MALLOC
     , FREE
+#ifdef WITH_REALLOC
+    , REALLOC_LT
+    , REALLOC_GT
+#endif /* WITH_REALLOC */
 #ifdef WITH_MEMALIGN
     , MEMALIGN
 #endif /* WITH_MEMALIGN */

+ 42 - 40
src/realloc.c

@@ -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> /* for pagesize */
+#endif /* PAGESIZE_ALIGN */
+
 #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 { /* This has to be a big block */
 
@@ -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 /* PAGESIZE_ALIGN */
+
+        if(full_size < owner_raw_block->size) {
+            /* The re-allocation can take place inside the same big block */
 
             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) 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 /* REQUEST_SIZE_INFO */
+            UPDATE_GLOBAL_STATS(REALLOC_LT);
+#endif /* REQUEST_SIZE_INFO */
 
-#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 /* REQUEST_SIZE_INFO */
-            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 /* WITH_ALLOCATOR_STATS */
 
+            // FIXME This is mmap-specific
+            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) {
+            /* no need to make modifications */
+            return_ptr = ptr;
         } else { /* We have to create a new big block */
 
-#ifdef WITH_ALLOCATOR_STATS
-            size_t size_diff = full_size - owner_raw_block->size;
-#endif /* WITH_ALLOCATOR_STATS */
-
             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 /* WITH_DEBUG */
 
-                release_memory(owner_raw_block);
+#ifdef REQUEST_SIZE_INFO
+                UPDATE_GLOBAL_STATS(REALLOC_GT, size -
+                        owner_raw_block->requested_size);
+#else /* REQUEST_SIZE_INFO */
+                UPDATE_GLOBAL_STATS(REALLOC_GT);
+#endif /* REQUEST_SIZE_INFO */
 
 #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 /* REQUEST_SIZE_INFO */
-                systemallocator.dmm_stats.num_realloc++;
+                systemallocator.dmm_stats.total_mem_allocated += new_block->size
+                    - owner_raw_block->size;
                 UNLOCK_GLOBAL();
 #endif /* WITH_ALLOCATOR_STATS */
 
-                goto done;
+                release_memory(owner_raw_block);
             }
         }
     }
 
-done:
-
     MEM_TRACE("dmmlib - r %p %p %zu\n", ptr, return_ptr, size);
 
     return return_ptr;

+ 14 - 0
src/statistics.c

@@ -61,6 +61,20 @@ void update_stats
             dmm_stats->live_objects--;
             dmm_stats->num_free++;
             break;
+#ifdef WITH_REALLOC
+        case REALLOC_LT :
+#ifdef REQUEST_SIZE_INFO
+            dmm_stats->total_mem_requested -= mem_req;
+#endif /* REQUEST_SIZE_INFO */
+            dmm_stats->num_realloc++;
+            break;
+        case REALLOC_GT :
+#ifdef REQUEST_SIZE_INFO
+            dmm_stats->total_mem_requested += mem_req;
+#endif /* REQUEST_SIZE_INFO */
+            dmm_stats->num_realloc++;
+            break;
+#endif /* WITH_REALLOC */
 #ifdef WITH_MEMALIGN
         case MEMALIGN :
 #ifdef REQUEST_SIZE_INFO