Skip to content
Snippets Groups Projects
Commit 66d268f3 authored by Robert Kloefkorn's avatar Robert Kloefkorn
Browse files

added some safety checks for multi-thread mode.

parent 442bd0fd
No related branches found
No related tags found
No related merge requests found
...@@ -30,17 +30,54 @@ namespace Dune ...@@ -30,17 +30,54 @@ namespace Dune
enum { maxStackObjects = 256 }; enum { maxStackObjects = 256 };
typedef ::ALUGrid::ALUGridFiniteStack< Object *, maxStackObjects > StackType; typedef ::ALUGrid::ALUGridFiniteStack< Object *, maxStackObjects > StackType;
// stack to store object pointers
StackType objStack_; StackType objStack_;
// thread number
int thread_;
// return reference to object stack
StackType &objStack () { return objStack_; } StackType &objStack () { return objStack_; }
public: public:
// type of object to be stored
typedef Object ObjectType; typedef Object ObjectType;
//! default constructor // return thread number
ALUMemoryProviderSingleThread() {} static inline int thread()
{
#ifdef _OPENMP
return omp_get_thread_num();
#elif HAVE_DUNE_FEM
return Fem :: ThreadManager :: thread() ;
#else
return 0;
#endif
}
// return maximal possible number of threads
static inline int maxThreads()
{
#ifdef _OPENMP
return omp_get_max_threads();
#elif HAVE_DUNE_FEM
return Fem :: ThreadManager :: maxThreads() ;
#else
return 1;
#endif
}
//! default constructor
ALUMemoryProviderSingleThread()
: objStack_(), thread_( -1 )
{}
//! copy constructor //! copy constructor
ALUMemoryProviderSingleThread( const ALUMemoryProviderSingleThread& org ) : objStack_() {} ALUMemoryProviderSingleThread( const ALUMemoryProviderSingleThread& org )
: objStack_(), thread_( org.thread_ )
{}
//! set thread number this memory provider works for
void setThreadNumber( const int thread ) { thread_ = thread; }
//! call deleteEntity //! call deleteEntity
~ALUMemoryProviderSingleThread (); ~ALUMemoryProviderSingleThread ();
...@@ -51,7 +88,7 @@ namespace Dune ...@@ -51,7 +88,7 @@ namespace Dune
//! i.e. return pointer to Entity //! i.e. return pointer to Entity
template <class FactoryType, class EntityImp> template <class FactoryType, class EntityImp>
inline ObjectType * getEntityObject(const FactoryType& factory, int level , EntityImp * fakePtr ) inline ObjectType * getEntityObject(const FactoryType& factory, int level, EntityImp* )
{ {
if( objStack().empty() ) if( objStack().empty() )
{ {
...@@ -64,7 +101,7 @@ namespace Dune ...@@ -64,7 +101,7 @@ namespace Dune
} }
//! return object, if created default constructor is used //! return object, if created default constructor is used
ObjectType * getEmptyObject (); ObjectType* getEmptyObject ();
//! free, move element to stack, returns NULL //! free, move element to stack, returns NULL
void freeObject (ObjectType * obj); void freeObject (ObjectType * obj);
...@@ -72,6 +109,9 @@ namespace Dune ...@@ -72,6 +109,9 @@ namespace Dune
protected: protected:
inline ObjectType * stackObject() inline ObjectType * stackObject()
{ {
// make sure we operate on the correct thread
alugrid_assert ( thread_ == thread() );
// make sure stack is not empty
alugrid_assert ( ! objStack().empty() ); alugrid_assert ( ! objStack().empty() );
// finite stack does also return object on pop // finite stack does also return object on pop
return objStack().pop(); return objStack().pop();
...@@ -85,9 +125,9 @@ namespace Dune ...@@ -85,9 +125,9 @@ namespace Dune
// //
//************************************************************************ //************************************************************************
template <class Object> template <class FactoryType> template <class Object> template <class FactoryType>
inline typename ALUMemoryProviderSingleThread<Object>::ObjectType * inline typename ALUMemoryProviderSingleThread<Object>::ObjectType*
ALUMemoryProviderSingleThread<Object>::getObject ALUMemoryProviderSingleThread<Object>::
(const FactoryType &factory, int level ) getObject( const FactoryType &factory, int level )
{ {
if( objStack().empty() ) if( objStack().empty() )
{ {
...@@ -126,7 +166,9 @@ namespace Dune ...@@ -126,7 +166,9 @@ namespace Dune
template <class Object> template <class Object>
inline void ALUMemoryProviderSingleThread<Object>::freeObject( Object * obj ) inline void ALUMemoryProviderSingleThread<Object>::freeObject( Object * obj )
{ {
// make sure we operate on the correct thread
alugrid_assert ( thread_ == thread() );
StackType& stk = objStack(); StackType& stk = objStack();
if( stk.full() ) if( stk.full() )
delete obj; delete obj;
...@@ -148,39 +190,36 @@ namespace Dune ...@@ -148,39 +190,36 @@ namespace Dune
return memProviders_[ thread ]; return memProviders_[ thread ];
} }
public: void init ()
// return thread number
static inline int thread()
{ {
#ifdef _OPENMP const int threads = maxThreads();
return omp_get_thread_num(); for( int thread = 0; thread < threads; ++ thread )
#elif HAVE_DUNE_FEM {
return Fem :: ThreadManager :: thread() ; memProviders_[ thread ].setThreadNumber( thread );
#else }
return 0;
#endif
} }
public:
// return thread number
static inline int thread() { return MemoryProvider :: thread(); }
// return maximal possible number of threads // return maximal possible number of threads
static inline int maxThreads() static inline int maxThreads() { return MemoryProvider :: maxThreads(); }
{
#ifdef _OPENMP
return omp_get_max_threads();
#elif HAVE_DUNE_FEM
return Fem :: ThreadManager :: maxThreads() ;
#else
return 1;
#endif
}
// type of stored object // type of stored object
typedef Object ObjectType; typedef Object ObjectType;
//! default constructor //! default constructor
ALUMemoryProvider() : memProviders_( maxThreads() ) {} ALUMemoryProvider() : memProviders_( maxThreads() )
{
init();
}
//! copy constructor (don't copy memory providers) //! copy constructor (don't copy memory providers)
ALUMemoryProvider( const ALUMemoryProvider& org ) : memProviders_( maxThreads() ) {} ALUMemoryProvider( const ALUMemoryProvider& org ) : memProviders_( maxThreads() )
{
init();
}
//! i.e. return pointer to Entity //! i.e. return pointer to Entity
template <class FactoryType> template <class FactoryType>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment