From 940fe333db157e35ae98218a1ca1ed4f3c17694b Mon Sep 17 00:00:00 2001 From: ziyue <1213642868@qq.com> Date: Thu, 30 Dec 2021 12:02:45 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=9D=E8=AF=95=E8=A7=A3=E5=86=B3=E5=85=A8?= =?UTF-8?q?=E5=B1=80malloc=E7=BB=9F=E8=AE=A1=E7=9B=B8=E5=85=B3=E5=8F=98?= =?UTF-8?q?=E9=87=8F=E6=8F=90=E5=89=8D=E9=94=80=E6=AF=81=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Common/config.cpp | 70 ++++++++++++++++++++++++++----------------- 1 file changed, 43 insertions(+), 27 deletions(-) diff --git a/src/Common/config.cpp b/src/Common/config.cpp index 9906cc66..b4c3f6a3 100644 --- a/src/Common/config.cpp +++ b/src/Common/config.cpp @@ -351,34 +351,50 @@ std::vector getBlockTypeSize() { return ret; } +class MemTotalInfo : public std::enable_shared_from_this { +public: + using Ptr = std::shared_ptr; + atomic mem_usage{0}; + atomic mem_block{0}; + atomic mem_block_map[BLOCK_TYPES]; + + static MemTotalInfo &Instance() { + static auto s_instance = std::make_shared(); + static auto &s_ref = *s_instance; + return s_ref; + } + +private: + void *operator new(size_t sz) { + return __real_malloc(sz); + } + + void operator delete(void *ptr) { + __real_free(ptr); + } +}; + class MemAllocInfo { public: - static atomic total_mem_usage; - static atomic total_mem_block; - static atomic total_mem_block_map[BLOCK_TYPES]; - + MemTotalInfo::Ptr total_mem = MemTotalInfo::Instance().shared_from_this(); atomic mem_usage{0}; atomic mem_block{0}; atomic mem_block_map[BLOCK_TYPES]; }; -atomic MemAllocInfo::total_mem_usage{0}; -atomic MemAllocInfo::total_mem_block{0}; -atomic MemAllocInfo::total_mem_block_map[BLOCK_TYPES]; - static thread_local MemAllocInfo s_alloc_info; uint64_t getTotalMemUsage() { - return MemAllocInfo::total_mem_usage.load(); + return s_alloc_info.total_mem->mem_usage.load(); } uint64_t getTotalMemBlock() { - return MemAllocInfo::total_mem_block.load(); + return s_alloc_info.total_mem->mem_block.load(); } uint64_t getTotalMemBlockByType(int type) { assert(type < BLOCK_TYPES); - return MemAllocInfo::total_mem_block_map[type].load(); + return s_alloc_info.total_mem->mem_block_map[type].load(); } uint64_t getThisThreadMemUsage() { @@ -416,28 +432,28 @@ public: void init_cookie(MemCookie *cookie, size_t c) { int type = get_mem_block_type(c); - MemAllocInfo::total_mem_usage += c; - ++MemAllocInfo::total_mem_block; - ++MemAllocInfo::total_mem_block_map[type]; - - s_alloc_info.mem_usage += c; - ++s_alloc_info.mem_block; - ++s_alloc_info.mem_block_map[type]; - cookie->magic = MemCookie::kMagic; cookie->size = c; cookie->alloc_info = &s_alloc_info; cookie->type = type; + + cookie->alloc_info->mem_usage += c; + ++cookie->alloc_info->mem_block; + ++cookie->alloc_info->mem_block_map[type]; + + cookie->alloc_info->total_mem->mem_usage += c; + ++cookie->alloc_info->total_mem->mem_block; + ++cookie->alloc_info->total_mem->mem_block_map[type]; } void un_init_cookie(MemCookie *cookie) { - MemAllocInfo::total_mem_usage -= cookie->size; - --MemAllocInfo::total_mem_block; - --MemAllocInfo::total_mem_block_map[cookie->type]; - cookie->alloc_info->mem_usage -= cookie->size; --cookie->alloc_info->mem_block; --cookie->alloc_info->mem_block_map[cookie->type]; + + cookie->alloc_info->total_mem->mem_usage -= cookie->size; + --cookie->alloc_info->total_mem->mem_block; + --cookie->alloc_info->total_mem->mem_block_map[cookie->type]; } void *__wrap_malloc(size_t c) { @@ -500,11 +516,11 @@ void *operator new(std::size_t size) { throw std::bad_alloc(); } -void operator delete(void *ptr) { +void operator delete(void *ptr) noexcept { free(ptr); } -void operator delete(void *ptr, std::size_t) { +void operator delete(void *ptr, std::size_t) noexcept { free(ptr); } @@ -516,11 +532,11 @@ void *operator new[](std::size_t size) { throw std::bad_alloc(); } -void operator delete[](void *ptr) { +void operator delete[](void *ptr) noexcept { free(ptr); } -void operator delete[](void *ptr, std::size_t) { +void operator delete[](void *ptr, std::size_t) noexcept { free(ptr); } #endif