# HG changeset patch # User Peter D. Barnes, Jr. # Date 1439503885 25200 # Node ID f5730aec63d0ffd27759fe365b08e868efe0a056 # Parent 8270f8d16d6b957ba70d0ffbfce7556390325817 NS_FATAL_ERROR_CONT macro, to report an error message, but allow the caller to terminate later. diff -r 8270f8d16d6b -r f5730aec63d0 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 */