diff options
author | Juan Linietsky <reduzio@gmail.com> | 2017-07-11 09:27:48 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-07-11 09:27:48 -0300 |
commit | 98a9c8fc5f6590e8233e766ec05dab527d5343ac (patch) | |
tree | 2606905904957cca602c76ae6581a6b9691dffc3 /core | |
parent | 6758ba0d933a4f83e246b500639cbb99f0f0cacd (diff) | |
parent | 711ebafa710f9097d6e0d3dbfb5f4b39f6283701 (diff) |
Merge pull request #9604 from godotengine/revert-9014-improve-mem-stats
Revert "Improve reliability of memory stats"
Diffstat (limited to 'core')
-rw-r--r-- | core/os/memory.cpp | 99 | ||||
-rw-r--r-- | core/os/memory.h | 3 | ||||
-rw-r--r-- | core/safe_refcount.cpp | 67 | ||||
-rw-r--r-- | core/safe_refcount.h | 4 |
4 files changed, 51 insertions, 122 deletions
diff --git a/core/os/memory.cpp b/core/os/memory.cpp index dfc62bf981..069ee48fae 100644 --- a/core/os/memory.cpp +++ b/core/os/memory.cpp @@ -29,7 +29,6 @@ /*************************************************************************/ #include "memory.h" #include "copymem.h" -#include "core/safe_refcount.h" #include "error_macros.h" #include <stdio.h> #include <stdlib.h> @@ -44,44 +43,42 @@ void *operator new(size_t p_size, void *(*p_allocfunc)(size_t p_size)) { return p_allocfunc(p_size); } +#include <stdio.h> + #ifdef DEBUG_ENABLED size_t Memory::mem_usage = 0; size_t Memory::max_usage = 0; -#ifdef DEBUG_MEMORY_TAGGING -#define MEM_UNINIT_TAG 0xEA -#define MEM_RELEASED_TAG 0xAE -#endif -#define PREPAD true -#else -#define PREPAD p_pad_align #endif -uint64_t Memory::alloc_count = 0; +size_t Memory::alloc_count = 0; void *Memory::alloc_static(size_t p_bytes, bool p_pad_align) { - void *mem = malloc(p_bytes + (PREPAD ? PAD_ALIGN : 0)); +#ifdef DEBUG_ENABLED + bool prepad = true; +#else + bool prepad = p_pad_align; +#endif + + void *mem = malloc(p_bytes + (prepad ? PAD_ALIGN : 0)); + + alloc_count++; ERR_FAIL_COND_V(!mem, NULL); - atomic_increment(&alloc_count); + if (prepad) { + uint64_t *s = (uint64_t *)mem; + *s = p_bytes; + + uint8_t *s8 = (uint8_t *)mem; - if (PREPAD) { #ifdef DEBUG_ENABLED mem_usage += p_bytes; if (mem_usage > max_usage) { max_usage = mem_usage; } #endif - - uint64_t *s = (uint64_t *)mem; - *s = p_bytes; - - uint8_t *s8 = (uint8_t *)mem + PAD_ALIGN; -#if defined DEBUG_ENABLED && defined DEBUG_MEMORY_TAGGING - memset(s8, MEM_UNINIT_TAG, p_bytes); -#endif - return s8; + return s8 + PAD_ALIGN; } else { return mem; } @@ -95,44 +92,38 @@ void *Memory::realloc_static(void *p_memory, size_t p_bytes, bool p_pad_align) { uint8_t *mem = (uint8_t *)p_memory; - if (PREPAD) { +#ifdef DEBUG_ENABLED + bool prepad = true; +#else + bool prepad = p_pad_align; +#endif + + if (prepad) { mem -= PAD_ALIGN; uint64_t *s = (uint64_t *)mem; - if (p_bytes == 0) { #ifdef DEBUG_ENABLED - mem_usage -= *s; -#ifdef DEBUG_MEMORY_TAGGING - memset(mem, MEM_RELEASED_TAG, PAD_ALIGN + *s); -#endif + mem_usage -= *s; + mem_usage += p_bytes; #endif + + if (p_bytes == 0) { free(mem); return NULL; } else { -#if defined DEBUG_ENABLED && defined DEBUG_MEMORY_TAGGING - if (p_bytes < *s) { - memset(mem + PAD_ALIGN + p_bytes, MEM_RELEASED_TAG, *s - p_bytes); - } -#endif + *s = p_bytes; mem = (uint8_t *)realloc(mem, p_bytes + PAD_ALIGN); ERR_FAIL_COND_V(!mem, NULL); s = (uint64_t *)mem; -#ifdef DEBUG_ENABLED - mem_usage -= *s; - mem_usage += p_bytes; -#ifdef DEBUG_MEMORY_TAGGING - if (p_bytes > *s) { - memset(mem + PAD_ALIGN + *s, MEM_UNINIT_TAG, p_bytes - *s); - } -#endif -#endif + *s = p_bytes; return mem + PAD_ALIGN; } } else { + mem = (uint8_t *)realloc(mem, p_bytes); ERR_FAIL_COND_V(mem == NULL && p_bytes > 0, NULL); @@ -147,19 +138,27 @@ void Memory::free_static(void *p_ptr, bool p_pad_align) { uint8_t *mem = (uint8_t *)p_ptr; - if (PREPAD) { - mem -= PAD_ALIGN; #ifdef DEBUG_ENABLED - const uint64_t s = *((uint64_t *)mem); - mem_usage -= s; -#ifdef DEBUG_MEMORY_TAGGING - memset(mem, MEM_RELEASED_TAG, PAD_ALIGN + s); + bool prepad = true; +#else + bool prepad = p_pad_align; #endif + + alloc_count--; + + if (prepad) { + mem -= PAD_ALIGN; + uint64_t *s = (uint64_t *)mem; + +#ifdef DEBUG_ENABLED + mem_usage -= *s; #endif - } - atomic_decrement(&alloc_count); - free(mem); + free(mem); + } else { + + free(mem); + } } size_t Memory::get_mem_available() { diff --git a/core/os/memory.h b/core/os/memory.h index 8c3e26219a..b3eb599955 100644 --- a/core/os/memory.h +++ b/core/os/memory.h @@ -48,7 +48,8 @@ class Memory { static size_t mem_usage; static size_t max_usage; #endif - static uint64_t alloc_count; + + static size_t alloc_count; public: static void *alloc_static(size_t p_bytes, bool p_pad_align = false); diff --git a/core/safe_refcount.cpp b/core/safe_refcount.cpp index 95a274cda7..e4a5a994e6 100644 --- a/core/safe_refcount.cpp +++ b/core/safe_refcount.cpp @@ -57,30 +57,6 @@ uint32_t atomic_decrement(register uint32_t *pw) { return *pw; } -uint64_t atomic_conditional_increment(register uint64_t *pw) { - - if (*pw == 0) - return 0; - - (*pw)++; - - return *pw; -} - -uint64_t atomic_increment(register uint64_t *pw) { - - (*pw)++; - - return *pw; -} - -uint64_t atomic_decrement(register uint64_t *pw) { - - (*pw)--; - - return *pw; -} - #else #ifdef _MSC_VER @@ -108,28 +84,6 @@ uint32_t atomic_decrement(register uint32_t *pw) { uint32_t atomic_increment(register uint32_t *pw) { return InterlockedIncrement((LONG volatile *)pw); } - -uint64_t atomic_conditional_increment(register uint64_t *pw) { - - /* try to increment until it actually works */ - // taken from boost - - while (true) { - uint64_t tmp = static_cast<uint64_t const volatile &>(*pw); - if (tmp == 0) - return 0; // if zero, can't add to it anymore - if (InterlockedCompareExchange64((LONGLONG volatile *)pw, tmp + 1, tmp) == tmp) - return tmp + 1; - } -} - -uint64_t atomic_decrement(register uint64_t *pw) { - return InterlockedDecrement64((LONGLONG volatile *)pw); -} - -uint64_t atomic_increment(register uint64_t *pw) { - return InterlockedIncrement64((LONGLONG volatile *)pw); -} #elif defined(__GNUC__) uint32_t atomic_conditional_increment(register uint32_t *pw) { @@ -153,27 +107,6 @@ uint32_t atomic_increment(register uint32_t *pw) { return __sync_add_and_fetch(pw, 1); } -uint64_t atomic_conditional_increment(register uint64_t *pw) { - - while (true) { - uint64_t tmp = static_cast<uint64_t const volatile &>(*pw); - if (tmp == 0) - return 0; // if zero, can't add to it anymore - if (__sync_val_compare_and_swap(pw, tmp, tmp + 1) == tmp) - return tmp + 1; - } -} - -uint64_t atomic_decrement(register uint64_t *pw) { - - return __sync_sub_and_fetch(pw, 1); -} - -uint64_t atomic_increment(register uint64_t *pw) { - - return __sync_add_and_fetch(pw, 1); -} - #else //no threads supported? #error Must provide atomic functions for this platform or compiler! diff --git a/core/safe_refcount.h b/core/safe_refcount.h index 5c9fd996a0..d30f563b56 100644 --- a/core/safe_refcount.h +++ b/core/safe_refcount.h @@ -40,10 +40,6 @@ uint32_t atomic_conditional_increment(register uint32_t *counter); uint32_t atomic_decrement(register uint32_t *pw); uint32_t atomic_increment(register uint32_t *pw); -uint64_t atomic_conditional_increment(register uint64_t *counter); -uint64_t atomic_decrement(register uint64_t *pw); -uint64_t atomic_increment(register uint64_t *pw); - struct SafeRefCount { uint32_t count; |