Changeset 404315


Ignore:
Timestamp:
07/30/09 11:25:54 (5 years ago)
Author:
David Goodell <goodell@…>
Branches:
master
Children:
8740d7
Parents:
d23ed4
Message:

[svn-r5093] Add MPIU_Assert_fmt_msg for printing messages during assert failure.

This should hopefully reduce duplication of print-like statements when
error checking and provide better messages when asserting.

reviewed by buntinas@.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/include/mpiutil.h

    r5d0888 r404315  
    8383} 
    8484 
     85/* Define the MPIU_Assert_fmt_msg macro.  This macro takes two arguments.  The 
     86 * first is the condition to assert.  The second is a parenthesized list of 
     87 * arguments suitable for passing directly to printf that will yield a relevant 
     88 * error message.  The macro will first evaluate the condition.  If it evaluates 
     89 * to false the macro will take four steps: 
     90 * 
     91 * 1) It will emit an "Assertion failed..." message in the valgrind output with 
     92 *    a backtrace, if valgrind client requests are available and the process is 
     93 *    running under valgrind.  It will also evaluate and print the supplied 
     94 *    message. 
     95 * 2) It will emit an "Assertion failed..." message via MPIU_Internal_error_printf. 
     96 *    The supplied error message will also be evaluated and printed. 
     97 * 3) It will similarly emit the assertion failure and caller supplied messages 
     98 *    to the debug log, if enabled, via MPIU_DBG_MSG_FMT. 
     99 * 4) It will invoke MPID_Abort, just like the other MPIU_Assert* macros. 
     100 * 
     101 * If the compiler doesn't support (...)/__VA_ARGS__ in macros then the user 
     102 * message will not be evaluated or printed.  If NDEBUG is defined or 
     103 * HAVE_ERROR_CHECKING is undefined, this macro will expand to nothing, just 
     104 * like MPIU_Assert. 
     105 * 
     106 * Example usage: 
     107 * 
     108 * MPIU_Assert_fmg_msg(foo > bar,("foo is larger than bar: foo=%d bar=%d",foo,bar)); 
     109 */ 
     110#if (!defined(NDEBUG) && defined(HAVE_ERROR_CHECKING)) 
     111#  if defined(HAVE_MACRO_VA_ARGS) 
     112 
     113#  include "mpiu_valgrind.h" /* for MPIU_VG_ macros */ 
     114 
     115#  define MPIU_ASSERT_FMT_MSG_MAX_SIZE 2048 
     116/* newlines are added internally by this macro, callers do not need to include them */ 
     117#    define MPIU_Assert_fmt_msg(cond_,fmt_arg_parens_)                                 \ 
     118    do {                                                                               \ 
     119        if (!(cond_)) {                                                                \ 
     120            char *msg_ = MPIU_Malloc(MPIU_ASSERT_FMT_MSG_MAX_SIZE);                    \ 
     121            MPIU_Assert_fmt_msg_snprintf_##fmt_arg_parens_;                            \ 
     122            MPIU_VG_PRINTF_BACKTRACE("Assertion failed in file %s at line %d: %s\n",   \ 
     123                                       __FILE__, __LINE__, MPIU_QUOTE(a_));            \ 
     124            MPIU_VG_PRINTF_BACKTRACE("%s\n", msg_);                                    \ 
     125            MPIU_Internal_error_printf("Assertion failed in file %s at line %d: %s\n", \ 
     126                                       __FILE__, __LINE__, MPIU_QUOTE(a_));            \ 
     127            MPIU_Internal_error_printf("%s\n", msg_);                                  \ 
     128            MPIU_DBG_MSG_FMT(ALL, TERSE,                                               \ 
     129                             (MPIU_DBG_FDEST,                                          \ 
     130                              "Assertion failed in file %s at line %d: %s\n",          \ 
     131                              __FILE__, __LINE__, MPIU_QUOTE(a_)));                    \ 
     132            MPIU_DBG_MSG_FMT(ALL, TERSE, (MPIU_DBG_FDEST,"%s\n",msg_));                \ 
     133            MPIU_Free(msg_);                                                           \ 
     134            MPID_Abort(NULL, MPI_SUCCESS, 1, NULL);                                    \ 
     135        }                                                                              \ 
     136    } while (0) 
     137/* NOTE: tightly coupled to the above macro, make changes in either one carefullly! */ 
     138#    define MPIU_Assert_fmt_msg_snprintf_(...) \ 
     139    MPIU_Snprintf(msg_, MPIU_ASSERT_FMT_MSG_MAX_SIZE,__VA_ARGS__) 
     140 
     141#  else /* defined(HAVE_MACRO_VA_ARGS) */ 
     142 
     143#    define MPIU_Assert_fmt_msg(cond_,fmt_arg_parens_)                                 \ 
     144    do {                                                                               \ 
     145        if (!(cond_)) {                                                                \ 
     146            const char *unable_msg_ =                                                  \ 
     147                "macro __VA_ARGS__ not supported, unable to print user message";       \ 
     148            MPIU_VG_PRINTF_BACKTRACE("Assertion failed in file %s at line %d: %s\n",   \ 
     149                                       __FILE__, __LINE__, MPIU_QUOTE(a_));            \ 
     150            MPIU_VG_PRINTF_BACKTRACE("%s\n", unable_msg_);                             \ 
     151            MPIU_Internal_error_printf("Assertion failed in file %s at line %d: %s\n", \ 
     152                                       __FILE__, __LINE__, MPIU_QUOTE(a_));            \ 
     153            MPIU_Internal_error_printf("%s\n", unable_msg_);                           \ 
     154            MPIU_DBG_MSG_FMT(ALL, TERSE,                                               \ 
     155                             (MPIU_DBG_FDEST,                                          \ 
     156                              "Assertion failed in file %s at line %d: %s\n",          \ 
     157                              __FILE__, __LINE__, MPIU_QUOTE(a_)));                    \ 
     158            MPIU_DBG_MSG_FMT(ALL, TERSE, (MPIU_DBG_FDEST,"%s\n",unable_msg_));         \ 
     159            MPID_Abort(NULL, MPI_SUCCESS, 1, NULL);                                    \ 
     160        }                                                                              \ 
     161    } while (0) 
     162 
     163#  endif 
     164#else /* !defined(NDEBUG) && defined(HAVE_ERROR_CHECKING) */ 
     165#    define MPIU_Assert_fmt_msg(cond_,fmt_arg_parens_) 
     166#endif 
     167 
    85168/* 
    86169 * Ensure an MPI_Aint value fits into a signed int. 
Note: See TracChangeset for help on using the changeset viewer.