NS_FATAL_ERROR_CONT macro, to report an error message, but allow the caller to terminate later.
authorPeter D. Barnes, Jr. <barnes26@llnl.gov>
Thu, 13 Aug 2015 15:11:25 -0700
changeset 11601 f5730aec63d0
parent 11600 8270f8d16d6b
child 11602 4157e36ac177
NS_FATAL_ERROR_CONT macro, to report an error message, but allow the caller to terminate later.
src/core/model/fatal-error.h
--- a/src/core/model/fatal-error.h	Wed Aug 12 16:37:08 2015 -0700
+++ b/src/core/model/fatal-error.h	Thu Aug 13 15:11:25 2015 -0700
@@ -52,57 +52,113 @@
  * on the attempt to execute the flush() function.
  */
 
+/**
+ * \ingroup fatal
+ *
+ * \brief Fatal error reporting implementation.
+ *
+ * When this macro is hit at runtime the error details will
+ * printed to \c stderr, including the supplied \c msg,
+ * and the file name and line number.  Optionally, if \c fatal is true,
+ * the macro will invoke \c std::terminate().  If \c fatal is false,
+ * the invoking function should return an error code to its caller,
+ * which is expected to call NS_FATAL_ERROR to cause termination.
+ *
+ * \param [in] msg The error message to print, if not empty.
+ * \param [in] fatal Call \c std::terminate() if true.
+ *
+ * This macro is enabled unconditionally in all builds,
+ * including debug and optimized builds.
+ */
+#define NS_FATAL_ERROR_IMPL_NO_MSG(fatal) \
+  do                                                      \
+    {                                                     \
+      std::cerr << "file=" << __FILE__ << ", line=" <<    \
+        __LINE__ << std::endl;                            \
+      ::ns3::FatalImpl::FlushStreams ();                  \
+      if (fatal) std::terminate ();                       \
+    }                                                     \
+  while (false)
+
+
+#define NS_FATAL_ERROR_IMPL(msg,fatal) \
+  do                                                    \
+    {                                                   \
+      std::cerr << "msg=\"" << msg << "\", ";           \
+      NS_FATAL_ERROR_IMPL_NO_MSG (fatal);               \
+    }                                                   \
+  while (false)
+
 
 /**
  * \ingroup fatal
  *
- * \brief Fatal error handling
+ * \brief Report a fatal error and terminate.
  *
  * When this macro is hit at runtime, details of filename
- * and line number is printed to stderr, and the program
- * is halted by calling std::terminate(). This will
+ * and line number are printed to \c stderr, and the program
+ * is halted by calling \c std::terminate(). This will
  * trigger any clean up code registered by
- * std::set_terminate (NS3 default is a stream-flushing
+ * \c std::set_terminate (NS3 default is a stream-flushing
  * code), but may be overridden.
  *
  * This macro is enabled unconditionally in all builds,
  * including debug and optimized builds.
  */
-#define NS_FATAL_ERROR_NO_MSG()                           \
-  do                                                      \
-    {                                                     \
-      std::cerr << "file=" << __FILE__ << ", line=" <<    \
-      __LINE__ << std::endl;                            \
-      ::ns3::FatalImpl::FlushStreams ();                  \
-      std::terminate ();                                  \
-    }                                                     \
-  while (false)
+#define NS_FATAL_ERROR_NO_MSG()       NS_FATAL_ERROR_IMPL_NO_MSG (true)
 
 /**
  * \ingroup fatal
  *
- * \brief Fatal error handling
+ * \brief Report a fatal error, deferring termination.
+ *
+ * When this macro is hit at runtime, details of filename
+ * and line number are printed to \c stderr, however the program
+ * is _not_ halted.  It is expected that the function using this
+ * macro will return an error code, and its caller will
+ * invoke NS_FATAL_ERROR(msg) triggering std::terminate().
+ *
+ * This macro is enabled unconditionally in all builds,
+ * including debug and optimized builds.
+ */
+#define NS_FATAL_ERROR_NO_MSG_CONT()  NS_FATAL_ERROR_IMPL_NO_MSG (false)
+
+/**
+ * \ingroup fatal
+ *
+ * \brief Report a fatal error with a message and terminate.
  *
  * \param [in] msg message to output when this macro is hit.
  *
  * When this macro is hit at runtime, the user-specified
- * error message is printed to stderr, followed by a call
+ * error message are printed to \c stderr, followed by a call
  * to the NS_FATAL_ERROR_NO_MSG() macro which prints the
- * details of filename and line number to stderr. The
- * program will be halted by calling std::terminate(),
+ * details of filename and line number to \c stderr. The
+ * program will be halted by calling \c std::terminate(),
  * triggering any clean up code registered by
- * std::set_terminate (NS3 default is a stream-flushing
+ * \c std::set_terminate (NS3 default is a stream-flushing
  * code, but may be overridden).
  *
  * This macro is enabled unconditionally in all builds,
  * including debug and optimized builds.
  */
-#define NS_FATAL_ERROR(msg)                             \
-  do                                                    \
-    {                                                   \
-      std::cerr << "msg=\"" << msg << "\", ";           \
-      NS_FATAL_ERROR_NO_MSG ();                          \
-    }                                                   \
-  while (false)
+#define NS_FATAL_ERROR(msg)           NS_FATAL_ERROR_IMPL (msg, true)
+
+/**
+ * \ingroup fatal
+ *
+ * \brief Report a fatal error with a message, deferring termination.
+ *
+ * When this macro is hit at runtime, details of filename
+ * and line number are printed to \c stderr, however the program
+ * is _not_ halted.  It is expected that the function using this
+ * macro will return an error code, and its caller will
+ * invoke NS_FATAL_ERROR(msg) triggering \c std::terminate().
+ *
+ * This macro is enabled unconditionally in all builds,
+ * including debug and optimized builds.
+ */
+#define NS_FATAL_ERROR_CONT(msg)      NS_FATAL_ERROR_IMPL (msg, false)
+
 
 #endif /* FATAL_ERROR_H */