From 18371fb27adc2cd2ef0653645e41d0d1823efea7 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Tue, 9 Jun 2020 16:48:51 +0300 Subject: [PATCH] - fixed calculation of allocated memory for garbage collection https://forum.zdoom.org/viewtopic.php?t=68897 --- src/common/objects/dobject.h | 2 -- src/common/utility/m_alloc.cpp | 28 +++++++++++++++++++++++++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/common/objects/dobject.h b/src/common/objects/dobject.h index 98d9106a24e..f9c0c0b0a9c 100644 --- a/src/common/objects/dobject.h +++ b/src/common/objects/dobject.h @@ -266,14 +266,12 @@ class DObject void *operator new(size_t len, nonew&) { - GC::AllocBytes += len; return M_Malloc(len); } public: void operator delete (void *mem, nonew&) { - GC::AllocBytes -= _msize(mem); M_Free(mem); } diff --git a/src/common/utility/m_alloc.cpp b/src/common/utility/m_alloc.cpp index 8e3b89ab67f..d1f34c324a2 100644 --- a/src/common/utility/m_alloc.cpp +++ b/src/common/utility/m_alloc.cpp @@ -45,7 +45,7 @@ #endif #include "engineerrors.h" -#include "m_alloc.h" +#include "dobject.h" #ifndef _MSC_VER #define _NORMAL_BLOCK 0 @@ -62,16 +62,22 @@ void *M_Malloc(size_t size) if (block == NULL) I_FatalError("Could not malloc %zu bytes", size); + GC::AllocBytes += _msize(block); return block; } void *M_Realloc(void *memblock, size_t size) { + if (memblock != NULL) + { + GC::AllocBytes -= _msize(memblock); + } void *block = realloc(memblock, size); if (block == NULL) { I_FatalError("Could not realloc %zu bytes", size); } + GC::AllocBytes += _msize(block); return block; } #else @@ -86,6 +92,7 @@ void *M_Malloc(size_t size) *sizeStore = size; block = sizeStore+1; + GC::AllocBytes += _msize(block); return block; } @@ -94,6 +101,10 @@ void *M_Realloc(void *memblock, size_t size) if(memblock == NULL) return M_Malloc(size); + if (memblock != NULL) + { + GC::AllocBytes -= _msize(memblock); + } void *block = realloc(((size_t*) memblock)-1, size+sizeof(size_t)); if (block == NULL) { @@ -104,6 +115,7 @@ void *M_Realloc(void *memblock, size_t size) *sizeStore = size; block = sizeStore+1; + GC::AllocBytes += _msize(block); return block; } #endif @@ -120,16 +132,22 @@ void *M_Malloc_Dbg(size_t size, const char *file, int lineno) if (block == NULL) I_FatalError("Could not malloc %zu bytes in %s, line %d", size, file, lineno); + GC::AllocBytes += _msize(block); return block; } void *M_Realloc_Dbg(void *memblock, size_t size, const char *file, int lineno) { + if (memblock != NULL) + { + GC::AllocBytes -= _msize(memblock); + } void *block = _realloc_dbg(memblock, size, _NORMAL_BLOCK, file, lineno); if (block == NULL) { I_FatalError("Could not realloc %zu bytes in %s, line %d", size, file, lineno); } + GC::AllocBytes += _msize(block); return block; } #else @@ -144,6 +162,7 @@ void *M_Malloc_Dbg(size_t size, const char *file, int lineno) *sizeStore = size; block = sizeStore+1; + GC::AllocBytes += _msize(block); return block; } @@ -152,6 +171,10 @@ void *M_Realloc_Dbg(void *memblock, size_t size, const char *file, int lineno) if(memblock == NULL) return M_Malloc_Dbg(size, file, lineno); + if (memblock != NULL) + { + GC::AllocBytes -= _msize(memblock); + } void *block = _realloc_dbg(((size_t*) memblock)-1, size+sizeof(size_t), _NORMAL_BLOCK, file, lineno); if (block == NULL) @@ -163,6 +186,7 @@ void *M_Realloc_Dbg(void *memblock, size_t size, const char *file, int lineno) *sizeStore = size; block = sizeStore+1; + GC::AllocBytes += _msize(block); return block; } #endif @@ -173,6 +197,7 @@ void M_Free (void *block) { if (block != NULL) { + GC::AllocBytes -= _msize(block); free(block); } } @@ -181,6 +206,7 @@ void M_Free (void *block) { if(block != NULL) { + GC::AllocBytes -= _msize(block); free(((size_t*) block)-1); } }