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: Wed, 16 Jan 2019 17:57:57 -0500 (EST)

branch: static_initialization_for_singleton_instance_pointer
commit ed69b3fc110f7160f7bf689a730eb25c5e3b0138
Author: andrico <address@hidden>
Date:   Wed Jan 16 23:57:10 2019 +0100

    fixing the issue when singleton pointer is not initialized before the other 
global objects
---
 src/getfem/dal_singleton.h | 30 ++++++++++++++++++------------
 1 file changed, 18 insertions(+), 12 deletions(-)

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



reply via email to

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