From 73d58256b742d9c16b28281215a8433c55c997be Mon Sep 17 00:00:00 2001 From: Rye Mutt <rye@alchemyviewer.org> Date: Sat, 23 Apr 2022 07:19:04 -0400 Subject: [PATCH] Introduce memory pooling into octree --- indra/llmath/lloctree.h | 77 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/indra/llmath/lloctree.h b/indra/llmath/lloctree.h index 70e2f23ef90..ffd63a9f267 100644 --- a/indra/llmath/lloctree.h +++ b/indra/llmath/lloctree.h @@ -31,6 +31,8 @@ #include "v3math.h" #include "llvector4a.h" #include <vector> +#include "fix_macros.h" +#include <boost/pool/pool.hpp> #define OCT_ERRS LL_WARNS("OctreeErrors") @@ -45,6 +47,10 @@ extern float gOctreeMinSize; #define LL_OCTREE_MAX_CAPACITY 128 #endif*/ +#if !LL_DEBUG +#define LL_OCTREE_POOLS 1 +#endif + template <class T> class LLOctreeNode; template <class T> @@ -93,6 +99,40 @@ class LLOctreeNode : public LLTreeNode<T> typedef LLOctreeNode<T> oct_node; typedef LLOctreeListener<T> oct_listener; +#if LL_OCTREE_POOLS + struct octree_pool_alloc + { + typedef std::size_t size_type; + typedef std::ptrdiff_t difference_type; + + static char * malloc(const size_type bytes) + { return (char *)ll_aligned_malloc_16(bytes); } + static void free(char * const block) + { ll_aligned_free_16(block); } + }; + static boost::pool<octree_pool_alloc>& getPool(const std::size_t& size) + { + static boost::pool<octree_pool_alloc> sPool((std::size_t)LL_NEXT_ALIGNED_ADDRESS((char*)size),1200); + llassert_always((std::size_t)LL_NEXT_ALIGNED_ADDRESS((char*)size) == sPool.get_requested_size()); + return sPool; + } + void* operator new(size_t size) + { + return getPool(size).malloc(); + } + void* operator new[](size_t size) + { + return getPool(size).malloc(); + } + void operator delete(void* ptr) + { + getPool(sizeof(LLOctreeNode<T>)).free(ptr); + } + void operator delete[](void* ptr) + { + getPool(sizeof(LLOctreeNode<T>)).free(ptr); + } +#else void* operator new(size_t size) { return ll_aligned_malloc_16(size); @@ -102,6 +142,7 @@ class LLOctreeNode : public LLTreeNode<T> { ll_aligned_free_16(ptr); } +#endif LLOctreeNode( const LLVector4a& center, const LLVector4a& size, @@ -676,6 +717,42 @@ class LLOctreeRoot : public LLOctreeNode<T> : BaseType(center, size, parent) { } + +#if LL_OCTREE_POOLS + void* operator new(size_t size) + { + return LLOctreeNode<T>::getPool(size).malloc(); + } + void* operator new[](size_t size) + { + return LLOctreeNode<T>::getPool(size).malloc(); + } + void operator delete(void* ptr) + { + LLOctreeNode<T>::getPool(sizeof(LLOctreeNode<T>)).free(ptr); + } + void operator delete[](void* ptr) + { + LLOctreeNode<T>::getPool(sizeof(LLOctreeNode<T>)).free(ptr); + } +#else + void* operator new(size_t size) + { + return ll_aligned_malloc_16(size); + } + void* operator new[](size_t size) + { + return ll_aligned_malloc_16(size); + } + void operator delete(void* ptr) + { + ll_aligned_free_16(ptr); + } + void operator delete[](void* ptr) + { + ll_aligned_free_16(ptr); + } +#endif bool balance() { -- GitLab