tweak realloc-pool realloc behavior.
authorRobin Gareus <robin@gareus.org>
Tue, 19 Jul 2016 13:05:16 +0000 (15:05 +0200)
committerRobin Gareus <robin@gareus.org>
Tue, 19 Jul 2016 13:05:16 +0000 (15:05 +0200)
* ignore provided old-size from lua, use internal segment size.
* fix behavior on OOM (leave memory untouched)

libs/pbd/reallocpool.cc

index d707aa75cb08542a454f58dbbcc09c16fb3cdb88..0bf37f35179f4b620488e11b8e4c0c1a50925cc4 100644 (file)
 #include "pbd/reallocpool.h"
 
 #ifdef RAP_WITH_SEGMENT_STATS
 #include "pbd/reallocpool.h"
 
 #ifdef RAP_WITH_SEGMENT_STATS
+#include <assert.h>
 #define STATS_segment collect_segment_stats();
 #define STATS_segment collect_segment_stats();
+#define ASSERT assert
 #else
 #define STATS_segment
 #else
 #define STATS_segment
+#define ASSERT
 #endif
 
 #ifdef RAP_WITH_CALL_STATS
 #endif
 
 #ifdef RAP_WITH_CALL_STATS
@@ -106,6 +109,8 @@ ReallocPool::~ReallocPool ()
 void *
 ReallocPool::_realloc (void *ptr, size_t oldsize, size_t newsize) {
        void *rv = NULL;
 void *
 ReallocPool::_realloc (void *ptr, size_t oldsize, size_t newsize) {
        void *rv = NULL;
+       ASSERT (!ptr || oldsize <= _asize (ptr));
+       oldsize = _asize (ptr); // ignore provided oldsize
 
        if (ptr == 0 && newsize == 0) {
                STATS_inc(_n_noop);
 
        if (ptr == 0 && newsize == 0) {
                STATS_inc(_n_noop);
@@ -130,6 +135,7 @@ ReallocPool::_realloc (void *ptr, size_t oldsize, size_t newsize) {
        }
 
        if (newsize == oldsize) {
        }
 
        if (newsize == oldsize) {
+               ASSERT (_asize (ptr) <= newsize);
                STATS_inc(_n_noop);
                return ptr;
        }
                STATS_inc(_n_noop);
                return ptr;
        }
@@ -145,7 +151,9 @@ ReallocPool::_realloc (void *ptr, size_t oldsize, size_t newsize) {
                if ((rv = _malloc (newsize))) {
                        memcpy (rv, ptr, oldsize);
                }
                if ((rv = _malloc (newsize))) {
                        memcpy (rv, ptr, oldsize);
                }
-               _free (ptr);
+               if (rv) {
+                       _free (ptr);
+               }
                STATS_if(!rv, _n_oom);
                STATS_inc(_n_grow);
                STATS_hist(_hist_grow, newsize);
                STATS_if(!rv, _n_oom);
                STATS_inc(_n_grow);
                STATS_hist(_hist_grow, newsize);
@@ -154,6 +162,7 @@ ReallocPool::_realloc (void *ptr, size_t oldsize, size_t newsize) {
        }
 
        if (newsize < oldsize) {
        }
 
        if (newsize < oldsize) {
+               ASSERT (_asize (ptr) >= newsize);
 #if 0 // re-allocate
                if ((rv = _malloc (newsize))) {
                        memccpy (rv, ptr, newsize);
 #if 0 // re-allocate
                if ((rv = _malloc (newsize))) {
                        memccpy (rv, ptr, newsize);
@@ -205,6 +214,7 @@ ReallocPool::_malloc (size_t s) {
 #endif
 
        while (1) { // iterates at most once over the available pool
 #endif
 
        while (1) { // iterates at most once over the available pool
+               ASSERT (SEGSIZ != 0);
                while (SEGSIZ > 0) {
                        traversed += SEGSIZ + sop;
                        if (traversed >= _poolsize) {
                while (SEGSIZ > 0) {
                        traversed += SEGSIZ + sop;
                        if (traversed >= _poolsize) {
@@ -334,6 +344,9 @@ ReallocPool::dumpsegments ()
        const poolsize_t sop = sizeof(poolsize_t);
        poolsize_t *in = (poolsize_t*) p;
        unsigned int traversed = 0;
        const poolsize_t sop = sizeof(poolsize_t);
        poolsize_t *in = (poolsize_t*) p;
        unsigned int traversed = 0;
+#ifdef RAP_WITH_CALL_STATS
+       size_t used = 0;
+#endif
        printf ("<<<<< %s\n", _name.c_str());
        while (1) {
                if ((*in) > 0) {
        printf ("<<<<< %s\n", _name.c_str());
        while (1) {
                if ((*in) > 0) {
@@ -341,6 +354,9 @@ ReallocPool::dumpsegments ()
                        printf ("0x%08x   data %p\n", traversed + sop , p + sop);
                        traversed += *in + sop;
                        p += *in + sop;
                        printf ("0x%08x   data %p\n", traversed + sop , p + sop);
                        traversed += *in + sop;
                        p += *in + sop;
+#ifdef RAP_WITH_CALL_STATS
+                       used += *in;
+#endif
                } else if ((*in) < 0) {
                        printf ("0x%08x free %4d [+%d]\n", traversed, -*in, sop);
                        traversed += -*in + sop;
                } else if ((*in) < 0) {
                        printf ("0x%08x free %4d [+%d]\n", traversed, -*in, sop);
                        traversed += -*in + sop;
@@ -359,6 +375,9 @@ ReallocPool::dumpsegments ()
                        break;
                }
        }
                        break;
                }
        }
+#ifdef RAP_WITH_CALL_STATS
+       ASSERT (_cur_used == used);
+#endif
        printf (">>>>>\n");
 }
 
        printf (">>>>>\n");
 }