Skip to content
Snippets Groups Projects
Commit 0248a0fb authored by Michael Kuron's avatar Michael Kuron :mortar_board:
Browse files

Restore per-type refcount maps in FieldAllocator

parent 005a9cb5
Branches
Tags
No related merge requests found
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include "AlignedMalloc.h" #include "AlignedMalloc.h"
#include "core/debug/Debug.h" #include "core/debug/Debug.h"
#include "field/CMakeDefs.h" #include "field/CMakeDefs.h"
#include "core/VectorTrait.h"
#include <map> #include <map>
#include <new> #include <new>
...@@ -51,9 +52,10 @@ namespace field { ...@@ -51,9 +52,10 @@ namespace field {
*/ */
//******************************************************************************************************************* //*******************************************************************************************************************
template<typename T> 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: public:
using BaseType = typename std::conditional<VectorTrait<T>::F_SIZE!=0, typename VectorTrait<T>::OutputType, T>::type;
virtual ~FieldAllocator() = default; virtual ~FieldAllocator() = default;
...@@ -72,14 +74,15 @@ namespace field { ...@@ -72,14 +74,15 @@ namespace field {
uint_t & allocSize1, uint_t & allocSize2, uint_t & allocSize3) uint_t & allocSize1, uint_t & allocSize2, uint_t & allocSize3)
{ {
T * mem = allocateMemory(size0,size1,size2,size3,allocSize1,allocSize2,allocSize3); T * mem = allocateMemory(size0,size1,size2,size3,allocSize1,allocSize2,allocSize3);
BaseType * bmem = reinterpret_cast<BaseType *>(mem);
#ifdef WALBERLA_THREAD_SAFE_FIELD_ALLOCATION #ifdef WALBERLA_THREAD_SAFE_FIELD_ALLOCATION
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp critical( walberla_field_allocator_refcount ) #pragma omp critical( walberla_field_allocator_refcount )
#endif #endif
#endif #endif
{ {
WALBERLA_ASSERT( referenceCounts_.find(mem) == referenceCounts_.end() || referenceCounts_[mem] == 0 ); WALBERLA_ASSERT( referenceCounts_.find(bmem) == referenceCounts_.end() || referenceCounts_[bmem] == 0 );
referenceCounts_[mem] = 1; referenceCounts_[bmem] = 1;
} }
return mem; return mem;
} }
...@@ -96,6 +99,7 @@ namespace field { ...@@ -96,6 +99,7 @@ namespace field {
T * allocate ( uint_t allocSize ) T * allocate ( uint_t allocSize )
{ {
T * mem = allocateMemory( allocSize ); T * mem = allocateMemory( allocSize );
BaseType * bmem = reinterpret_cast<BaseType *>(mem);
#ifdef WALBERLA_THREAD_SAFE_FIELD_ALLOCATION #ifdef WALBERLA_THREAD_SAFE_FIELD_ALLOCATION
#ifdef _OPENMP #ifdef _OPENMP
...@@ -103,8 +107,8 @@ namespace field { ...@@ -103,8 +107,8 @@ namespace field {
#endif #endif
#endif #endif
{ {
WALBERLA_ASSERT( referenceCounts_.find(mem) == referenceCounts_.end() || referenceCounts_[mem] == 0 ); WALBERLA_ASSERT( referenceCounts_.find(bmem) == referenceCounts_.end() || referenceCounts_[bmem] == 0 );
referenceCounts_[mem] = 1; referenceCounts_[bmem] = 1;
} }
return mem; return mem;
} }
...@@ -119,15 +123,17 @@ namespace field { ...@@ -119,15 +123,17 @@ namespace field {
*/ */
void incrementReferenceCount( T * mem ) void incrementReferenceCount( T * mem )
{ {
BaseType * bmem = reinterpret_cast<BaseType *>(mem);
#ifdef WALBERLA_THREAD_SAFE_FIELD_ALLOCATION #ifdef WALBERLA_THREAD_SAFE_FIELD_ALLOCATION
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp critical( walberla_field_allocator_refcount ) #pragma omp critical( walberla_field_allocator_refcount )
#endif #endif
#endif #endif
{ {
WALBERLA_ASSERT( referenceCounts_.find(mem) != referenceCounts_.end() ); WALBERLA_ASSERT( referenceCounts_.find(bmem) != referenceCounts_.end() );
WALBERLA_ASSERT_GREATER( referenceCounts_[mem], 0 ); WALBERLA_ASSERT_GREATER( referenceCounts_[bmem], 0 );
referenceCounts_[mem]++; referenceCounts_[bmem]++;
} }
} }
...@@ -143,6 +149,7 @@ namespace field { ...@@ -143,6 +149,7 @@ namespace field {
*/ */
bool decrementReferenceCount( T * mem ) bool decrementReferenceCount( T * mem )
{ {
BaseType * bmem = reinterpret_cast<BaseType *>(mem);
bool memoryFreed = false; bool memoryFreed = false;
uint_t refCount = 0; uint_t refCount = 0;
...@@ -153,10 +160,10 @@ namespace field { ...@@ -153,10 +160,10 @@ namespace field {
#endif #endif
#endif #endif
{ {
WALBERLA_ASSERT( referenceCounts_.find(mem) != referenceCounts_.end() ); WALBERLA_ASSERT( referenceCounts_.find(bmem) != referenceCounts_.end() );
WALBERLA_ASSERT_GREATER( referenceCounts_[mem], 0 ); WALBERLA_ASSERT_GREATER( referenceCounts_[bmem], 0 );
refCount = --referenceCounts_[mem]; refCount = --referenceCounts_[bmem];
} }
if( refCount == 0 ) { if( refCount == 0 ) {
...@@ -170,6 +177,7 @@ namespace field { ...@@ -170,6 +177,7 @@ namespace field {
uint_t referenceCount ( T * mem ) const uint_t referenceCount ( T * mem ) const
{ {
BaseType * bmem = reinterpret_cast<BaseType *>(mem);
uint_t refCount = 0; uint_t refCount = 0;
#ifdef WALBERLA_THREAD_SAFE_FIELD_ALLOCATION #ifdef WALBERLA_THREAD_SAFE_FIELD_ALLOCATION
#ifdef _OPENMP #ifdef _OPENMP
...@@ -177,8 +185,8 @@ namespace field { ...@@ -177,8 +185,8 @@ namespace field {
#endif #endif
#endif #endif
{ {
WALBERLA_ASSERT( referenceCounts_.find(mem) != referenceCounts_.end() ); WALBERLA_ASSERT( referenceCounts_.find(bmem) != referenceCounts_.end() );
refCount = referenceCounts_[mem]; refCount = referenceCounts_[bmem];
} }
return refCount; return refCount;
...@@ -203,6 +211,9 @@ namespace field { ...@@ -203,6 +211,9 @@ namespace field {
* \param values Return value of allocate function() * \param values Return value of allocate function()
*/ */
virtual void deallocate( T *& values ) = 0; virtual void deallocate( T *& values ) = 0;
private:
using FieldAllocatorBase<BaseType>::referenceCounts_;
}; };
template<typename T> template<typename T>
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment