]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Factored out Subscriptor error checking into member function
authordanshapero <shapero.daniel@gmail.com>
Wed, 6 Apr 2016 16:58:10 +0000 (09:58 -0700)
committerdanshapero <shapero.daniel@gmail.com>
Wed, 6 Apr 2016 16:58:10 +0000 (09:58 -0700)
include/deal.II/base/subscriptor.h
source/base/subscriptor.cc
tests/lac/sparse_matrix_move.cc
tests/lac/sparse_matrix_move.with_cxx11=on.output

index 4ddd83af30648ef466181b22667e71f894daa87f..d4fd6d9df7e24c7186cdbb211941b1ba97742ad4 100644 (file)
@@ -206,6 +206,13 @@ private:
    * in between and store it here.
    */
   mutable const std::type_info *object_info;
+
+  /**
+   * Check that there are no objects subscribing to this object and throw an
+   * error if there are, in order to guarantee that it is safe to either move
+   * or destroy this object.
+   */
+  void check_no_subscribers () const;
 };
 
 //---------------------------------------------------------------------------
index 07240b88e912b25b77ccf1b2a5e6cc56dbdeff70..8711270c9fb6e681f51f553aea595644bdc4d72b 100644 (file)
@@ -69,10 +69,9 @@ Subscriptor::Subscriptor (Subscriptor &&subscriptor)
   counter(0),
   object_info (subscriptor.object_info)
 {
-  // Explicitly invoke the destructor of `Subscriptor` for the object
-  // to be moved from in order to guarantee that we're not moving an
-  // object that has subscriptions.
-  subscriptor.~Subscriptor();
+  subscriptor.check_no_subscribers();
+  subscriptor.counter = 0;
+  subscriptor.counter_map.clear();
 }
 #endif
 
@@ -80,37 +79,40 @@ Subscriptor::Subscriptor (Subscriptor &&subscriptor)
 
 Subscriptor::~Subscriptor ()
 {
-  // check whether there are still
-  // subscriptions to this object. if
-  // so, output the actual name of
-  // the class to which this object
-  // belongs, i.e. the most derived
-  // class. note that the name may be
-  // mangled, so it need not be the
-  // clear-text class name. however,
-  // you can obtain the latter by
-  // running the c++filt program over
-  // the output.
+  check_no_subscribers();
+  counter = 0;
+  counter_map.clear();
+
+#ifdef DEAL_II_WITH_CXX11
+  object_info = nullptr;
+#else
+  object_info = 0;
+#endif
+}
+
+
+void Subscriptor::check_no_subscribers () const
+{
+  // Check whether there are still subscriptions to this object. If so, output
+  // the actual name of the class to which this object belongs, i.e. the most
+  // derived class. Note that the name may be mangled, so it need not be the
+  // clear-text class name. However, you can obtain the latter by running the
+  // c++filt program over the output.
 #ifdef DEBUG
 
-  // if there are still active pointers, show
-  // a message and kill the program. However,
-  // under some circumstances, this is not so
-  // desirable. For example, in code like this
+  // If there are still active pointers, show a message and kill the program.
+  // However, under some circumstances, this is not so desirable. For example,
+  // in code like this:
   //
-  // Triangulation tria;
-  // DoFHandler *dh = new DoFHandler(tria);
-  // ...some function that throws an exception
+  //     Triangulation tria;
+  //     DoFHandler *dh = new DoFHandler(tria);
+  //     ...some function that throws an exception
   //
-  // the exception will lead to the
-  // destruction of the triangulation, but
-  // since the dof_handler is on the heap it
-  // will not be destroyed. This will trigger
-  // an assertion in the triangulation. If we
-  // kill the program at this point, we will
-  // never be able to learn what caused the
-  // problem. In this situation, just display
-  // a message and continue the program.
+  // the exception will lead to the destruction of the triangulation, but since
+  // the dof_handler is on the heap it will not be destroyed. This will trigger
+  // an assertion in the triangulation. If we kill the program at this point, we
+  // will never be able to learn what caused the problem. In this situation,
+  // just display a message and continue the program.
   if (counter != 0)
     {
       if (std::uncaught_exception() == false)
@@ -147,17 +149,6 @@ Subscriptor::~Subscriptor ()
                     << std::endl;
         }
     }
-  // In case we do not abort
-  // on error, this will tell
-  // do_unsubscribe below that the
-  // object is unused now.
-  counter = 0;
-
-#ifdef DEAL_II_WITH_CXX11
-  object_info = nullptr;
-#else
-  object_info = 0;
-#endif
 
 #endif
 }
index 8e674dde9f20d64c9809475c05d283b4e4a28ad2..7d15ba4acc0e263c425e15b2da5f08297cd6b0f8 100644 (file)
@@ -101,31 +101,5 @@ int main()
     deallog << A.empty() << std::endl;
   }
 
-  {
-    // Try to move a sparse matrix that has a subscription
-    SparseMatrix<double> A = graph_laplacian(sparsity);
-    SmartPointer<SparseMatrix<double> > smart_pointer_to_A(&A);
-
-    bool need_to_catch_exc_in_use = false;
-#ifdef DEBUG
-    need_to_catch_exc_in_use = true;
-#endif
-
-    try
-      {
-        SparseMatrix<double> B = std::move(A);
-      }
-    catch (const Subscriptor::ExcInUse &)
-      {
-        need_to_catch_exc_in_use = false;
-      }
-    catch (...)
-      {
-        return 1;
-      }
-
-    deallog << "Exception caught if in debug mode." << std::endl;
-  }
-
   return 0;
 }
index ced490f8e7ea371970b4607cc71b6af1cc41ae69..7239c9cda828639d6e8f41f7429fabc0c1eeceb9 100644 (file)
@@ -5,4 +5,3 @@ DEAL::64
 DEAL::0.00
 DEAL::16
 DEAL::1
-DEAL::Exception caught if in debug mode.

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.