getfem-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Getfem-commits] (no subject)


From: Andriy Andreykiv
Subject: [Getfem-commits] (no subject)
Date: Mon, 14 Jan 2019 10:34:50 -0500 (EST)

branch: static_initialization_for_singleton_instance_pointer
commit 0b2282d0b93af509b086c30159241aff99909e52
Author: Andriy.Andreykiv <address@hidden>
Date:   Mon Jan 14 13:47:16 2019 +0100

    initializing singleton_instance pointer as a static variable to prevent 
initialization in parallel open_mp blocks
---
 src/getfem/dal_singleton.h | 28 ++++++++++++++--------------
 1 file changed, 14 insertions(+), 14 deletions(-)

diff --git a/src/getfem/dal_singleton.h b/src/getfem/dal_singleton.h
index 891c00f..3bba935 100644
--- a/src/getfem/dal_singleton.h
+++ b/src/getfem/dal_singleton.h
@@ -80,24 +80,21 @@ namespace dal {
   template <typename T, int LEV>
   class singleton_instance : public singleton_instance_base {
 
-    static getfem::omp_distribute<T*>*& omp_distro_pointer() {
-      static auto pointer = new getfem::omp_distribute<T*>{};
-      return pointer;
-    }
+    static getfem::omp_distribute<T*>* pointer;
 
     static T*& instance_pointer() {
-      return omp_distro_pointer()->thrd_cast();
+      return pointer->thrd_cast();
     }
 
     static T*& instance_pointer(size_t ithread) {
-      return (*omp_distro_pointer())(ithread);
+      return (*pointer)(ithread);
     }
 
   public:
 
     /**Instance from thread ithread*/
     inline static T& instance(size_t ithread) {
-      omp_distro_pointer()->on_thread_update();
+      pointer->on_thread_update();
       T*& tinstance_ = instance_pointer(ithread);
       if (!tinstance_) {
         tinstance_ = new T();
@@ -113,11 +110,11 @@ namespace dal {
     }
 
     inline static size_type num_threads() {
-      return omp_distro_pointer()->num_threads();
+      return pointer->num_threads();
     }
 
     inline static size_type this_thread() {
-      return omp_distro_pointer()->this_thread();
+      return pointer->this_thread();
     }
 
     int level() const override {
@@ -125,19 +122,22 @@ namespace dal {
     }
 
     ~singleton_instance() {
-      if (!omp_distro_pointer()) return;
-      for(size_t i = 0; i != omp_distro_pointer()->num_threads(); ++i) {
-        auto &p_singleton = (*omp_distro_pointer())(i);
+      if (!pointer) return;
+      for(size_t i = 0; i != pointer->num_threads(); ++i) {
+        auto &p_singleton = (*pointer)(i);
         if(p_singleton){
           delete p_singleton;
           p_singleton = nullptr;
         }
       }
-      delete omp_distro_pointer();
-      omp_distro_pointer() = nullptr;
+      delete pointer;
+      pointer = nullptr;
     }
   };
 
+  template<typename T, int LEV> getfem::omp_distribute<T*>*
+  singleton_instance<T, LEV>::pointer = new getfem::omp_distribute<T*>{};
+
   /** singleton class.
 
       usage:



reply via email to

[Prev in Thread] Current Thread [Next in Thread]