From 0248a0fb0768273eeefe46e43f9202c422cb707a Mon Sep 17 00:00:00 2001 From: Michael Kuron <mkuron@icp.uni-stuttgart.de> Date: Wed, 11 Mar 2020 12:01:00 +0100 Subject: [PATCH] Restore per-type refcount maps in FieldAllocator --- src/field/allocation/FieldAllocator.h | 37 +++++++++++++++++---------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/src/field/allocation/FieldAllocator.h b/src/field/allocation/FieldAllocator.h index f6e0000f2..f78771e15 100644 --- a/src/field/allocation/FieldAllocator.h +++ b/src/field/allocation/FieldAllocator.h @@ -25,6 +25,7 @@ #include "AlignedMalloc.h" #include "core/debug/Debug.h" #include "field/CMakeDefs.h" +#include "core/VectorTrait.h" #include <map> #include <new> @@ -51,9 +52,10 @@ namespace field { */ //******************************************************************************************************************* template<typename T> - class FieldAllocator : FieldAllocatorBase<void> + class FieldAllocator : FieldAllocatorBase<typename std::conditional<VectorTrait<T>::F_SIZE!=0, typename VectorTrait<T>::OutputType, T>::type> { public: + using BaseType = typename std::conditional<VectorTrait<T>::F_SIZE!=0, typename VectorTrait<T>::OutputType, T>::type; virtual ~FieldAllocator() = default; @@ -72,14 +74,15 @@ namespace field { uint_t & allocSize1, uint_t & allocSize2, uint_t & allocSize3) { T * mem = allocateMemory(size0,size1,size2,size3,allocSize1,allocSize2,allocSize3); + BaseType * bmem = reinterpret_cast<BaseType *>(mem); #ifdef WALBERLA_THREAD_SAFE_FIELD_ALLOCATION #ifdef _OPENMP #pragma omp critical( walberla_field_allocator_refcount ) #endif #endif { - WALBERLA_ASSERT( referenceCounts_.find(mem) == referenceCounts_.end() || referenceCounts_[mem] == 0 ); - referenceCounts_[mem] = 1; + WALBERLA_ASSERT( referenceCounts_.find(bmem) == referenceCounts_.end() || referenceCounts_[bmem] == 0 ); + referenceCounts_[bmem] = 1; } return mem; } @@ -96,6 +99,7 @@ namespace field { T * allocate ( uint_t allocSize ) { T * mem = allocateMemory( allocSize ); + BaseType * bmem = reinterpret_cast<BaseType *>(mem); #ifdef WALBERLA_THREAD_SAFE_FIELD_ALLOCATION #ifdef _OPENMP @@ -103,8 +107,8 @@ namespace field { #endif #endif { - WALBERLA_ASSERT( referenceCounts_.find(mem) == referenceCounts_.end() || referenceCounts_[mem] == 0 ); - referenceCounts_[mem] = 1; + WALBERLA_ASSERT( referenceCounts_.find(bmem) == referenceCounts_.end() || referenceCounts_[bmem] == 0 ); + referenceCounts_[bmem] = 1; } return mem; } @@ -119,15 +123,17 @@ namespace field { */ void incrementReferenceCount( T * mem ) { + BaseType * bmem = reinterpret_cast<BaseType *>(mem); + #ifdef WALBERLA_THREAD_SAFE_FIELD_ALLOCATION #ifdef _OPENMP #pragma omp critical( walberla_field_allocator_refcount ) #endif #endif { - WALBERLA_ASSERT( referenceCounts_.find(mem) != referenceCounts_.end() ); - WALBERLA_ASSERT_GREATER( referenceCounts_[mem], 0 ); - referenceCounts_[mem]++; + WALBERLA_ASSERT( referenceCounts_.find(bmem) != referenceCounts_.end() ); + WALBERLA_ASSERT_GREATER( referenceCounts_[bmem], 0 ); + referenceCounts_[bmem]++; } } @@ -143,6 +149,7 @@ namespace field { */ bool decrementReferenceCount( T * mem ) { + BaseType * bmem = reinterpret_cast<BaseType *>(mem); bool memoryFreed = false; uint_t refCount = 0; @@ -153,10 +160,10 @@ namespace field { #endif #endif { - WALBERLA_ASSERT( referenceCounts_.find(mem) != referenceCounts_.end() ); - WALBERLA_ASSERT_GREATER( referenceCounts_[mem], 0 ); + WALBERLA_ASSERT( referenceCounts_.find(bmem) != referenceCounts_.end() ); + WALBERLA_ASSERT_GREATER( referenceCounts_[bmem], 0 ); - refCount = --referenceCounts_[mem]; + refCount = --referenceCounts_[bmem]; } if( refCount == 0 ) { @@ -170,6 +177,7 @@ namespace field { uint_t referenceCount ( T * mem ) const { + BaseType * bmem = reinterpret_cast<BaseType *>(mem); uint_t refCount = 0; #ifdef WALBERLA_THREAD_SAFE_FIELD_ALLOCATION #ifdef _OPENMP @@ -177,8 +185,8 @@ namespace field { #endif #endif { - WALBERLA_ASSERT( referenceCounts_.find(mem) != referenceCounts_.end() ); - refCount = referenceCounts_[mem]; + WALBERLA_ASSERT( referenceCounts_.find(bmem) != referenceCounts_.end() ); + refCount = referenceCounts_[bmem]; } return refCount; @@ -203,6 +211,9 @@ namespace field { * \param values Return value of allocate function() */ virtual void deallocate( T *& values ) = 0; + + private: + using FieldAllocatorBase<BaseType>::referenceCounts_; }; template<typename T> -- GitLab