1 /* -*- Mode: C; c-basic-offset:4 ; -*- */ 2 /* 3 * (C) 2005 by Argonne National Laboratory. 4 * See COPYRIGHT in top-level directory. 5 */ 6 #ifndef MPIDBG_H_INCLUDED 7 #define MPIDBG_H_INCLUDED 8 #include <stdio.h> 9 #include <stdarg.h> 10 #include "mpibase.h" 11 /* 12 * Multilevel debugging and tracing macros. 13 * The design is discussed at 14 * http://www-unix.mcs.anl.gov/mpi/mpich2/developer/design/debugmsg.htm 15 * 16 * Basically, this provide a way to place debugging messages into 17 * groups (called *classes*), with levels of detail, and arbitrary 18 * messages. The messages can be turned on and off using environment 19 * variables and/or command-line options. 20 */ 21 22 #ifdef USE_DBG_LOGGING 23 #define MPIU_DBG_SELECTED(_class,_level) \ 24 ((MPIU_DBG_##_class & MPIU_DBG_ActiveClasses) && \ 25 MPIU_DBG_##_level <= MPIU_DBG_MaxLevel) 26 #define MPIU_DBG_MSG(_class,_level,_string) \ 27 {if ( (MPIU_DBG_##_class & MPIU_DBG_ActiveClasses) && \ 28 MPIU_DBG_##_level <= MPIU_DBG_MaxLevel ) {\ 29 MPIU_DBG_Outevent( __FILE__, __LINE__, MPIU_DBG_##_class, 0, "%s", _string ); }} 30 #define MPIU_DBG_MSG_S(_class,_level,_fmat,_string) \ 31 {if ( (MPIU_DBG_##_class & MPIU_DBG_ActiveClasses) && \ 32 MPIU_DBG_##_level <= MPIU_DBG_MaxLevel ) {\ 33 MPIU_DBG_Outevent( __FILE__, __LINE__, MPIU_DBG_##_class, 1, _fmat, _string ); }} 34 #define MPIU_DBG_MSG_D(_class,_level,_fmat,_int) \ 35 {if ( (MPIU_DBG_##_class & MPIU_DBG_ActiveClasses) && \ 36 MPIU_DBG_##_level <= MPIU_DBG_MaxLevel ) {\ 37 MPIU_DBG_Outevent( __FILE__, __LINE__, MPIU_DBG_##_class, 2, _fmat, _int ); }} 38 #define MPIU_DBG_MSG_P(_class,_level,_fmat,_pointer) \ 39 {if ( (MPIU_DBG_##_class & MPIU_DBG_ActiveClasses) && \ 40 MPIU_DBG_##_level <= MPIU_DBG_MaxLevel ) {\ 41 MPIU_DBG_Outevent( __FILE__, __LINE__, MPIU_DBG_##_class, 3, _fmat, _pointer ); }} 42 43 #define MPIU_DBG_MAXLINE 256 44 #define MPIU_DBG_FDEST _s,(size_t)MPIU_DBG_MAXLINE 45 /*M 46 MPIU_DBG_MSG_FMT - General debugging output macro 47 48 Notes: 49 To use this macro, the third argument should be an "sprintf" - style 50 argument, using MPIU_DBG_FDEST as the buffer argument. For example, 51 .vb 52 MPIU_DBG_MSG_FMT(CMM,VERBOSE,(MPIU_DBG_FDEST,"fmat",args...)); 53 .ve 54 M*/ 55 #define MPIU_DBG_MSG_FMT(_class,_level,_fmatargs) \ 56 {if ( (MPIU_DBG_##_class & MPIU_DBG_ActiveClasses) && \ 57 MPIU_DBG_##_level <= MPIU_DBG_MaxLevel ) {\ 58 char _s[MPIU_DBG_MAXLINE]; \ 59 MPIU_Snprintf _fmatargs ; \ 60 MPIU_DBG_Outevent( __FILE__, __LINE__, MPIU_DBG_##_class, 0, "%s", _s ); }} 61 #define MPIU_DBG_STMT(_class,_level,_stmt) \ 62 {if ( (MPIU_DBG_##_class & MPIU_DBG_ActiveClasses) && \ 63 MPIU_DBG_##_level <= MPIU_DBG_MaxLevel ) { _stmt; }} 64 65 #define MPIU_DBG_OUT(_class,_msg) \ 66 MPIU_DBG_Outevent( __FILE__, __LINE__, MPIU_DBG_##_class, 0, "%s", _msg ) 67 #define MPIU_DBG_OUT_FMT(_class,_fmatargs) \ 68 { char _s[MPIU_DBG_MAXLINE]; \ 69 MPIU_Snprintf _fmatargs ; \ 70 MPIU_DBG_Outevent( __FILE__, __LINE__, MPIU_DBG_##_class, 0, "%s", _s );} 71 72 #else 73 #define MPIU_DBG_SELECTED(_class,_level) 0 74 #define MPIU_DBG_MSG(_class,_level,_string) 75 #define MPIU_DBG_MSG_S(_class,_level,_fmat,_string) 76 #define MPIU_DBG_MSG_D(_class,_level,_fmat,_int) 77 #define MPIU_DBG_MSG_P(_class,_level,_fmat,_int) 78 #define MPIU_DBG_MSG_FMT(_class,_level,_fmatargs) 79 #define MPIU_DBG_STMT(_class,_level,_stmt) 80 #define MPIU_DBG_OUT(_class,_msg) 81 #define MPIU_DBG_OUT_FMT(_class,_fmtargs) 82 #endif 83 84 /* Special constants */ 85 enum MPIU_DBG_LEVEL { MPIU_DBG_TERSE = 0, 86 MPIU_DBG_TYPICAL = 50, 87 MPIU_DBG_VERBOSE = 99 }; 88 /* Any change in MPIU_DBG_CLASS must be matched by changes in 89 MPIU_Classnames in src/util/dbg/dbg_printf.c */ 90 enum MPIU_DBG_CLASS { MPIU_DBG_PT2PT = 0x1, 91 MPIU_DBG_RMA = 0x2, 92 MPIU_DBG_THREAD = 0x4, 93 MPIU_DBG_PM = 0x8, 94 MPIU_DBG_ROUTINE_ENTER = 0x10, 95 MPIU_DBG_ROUTINE_EXIT = 0x20, 96 MPIU_DBG_SYSCALL = 0x40, 97 MPIU_DBG_DATATYPE = 0x80, 98 MPIU_DBG_HANDLE = 0x100, 99 MPIU_DBG_COMM = 0x200, 100 MPIU_DBG_BSEND = 0x400, 101 MPIU_DBG_OTHER = 0x800, 102 MPIU_DBG_CH3_CONNECT = 0x1000, 103 MPIU_DBG_CH3_DISCONNECT= 0x2000, 104 MPIU_DBG_CH3_PROGRESS = 0x4000, 105 MPIU_DBG_CH3_CHANNEL = 0x8000, 106 MPIU_DBG_CH3_OTHER = 0x10000, 107 MPIU_DBG_CH3_MSG = 0x20000, 108 MPIU_DBG_CH3 = 0x3f000, /* alias for all Ch3*/ 109 MPIU_DBG_NEM_SOCK_FUNC = 0x40000, 110 MPIU_DBG_NEM_SOCK_DET = 0x80000, 111 MPIU_DBG_VC = 0x100000, 112 MPIU_DBG_REFCOUNT = 0x200000, 113 MPIU_DBG_ROMIO = 0x400000, 114 MPIU_DBG_ERRHAND = 0x800000, 115 MPIU_DBG_ALL = (~0) }; /* alias for all */ 116 117 extern int MPIU_DBG_ActiveClasses; 118 extern int MPIU_DBG_MaxLevel; 119 typedef enum MPIU_dbg_state_t 120 { 121 MPIU_DBG_STATE_NONE = 0, 122 MPIU_DBG_STATE_UNINIT = 1, 123 MPIU_DBG_STATE_STDOUT = 2, 124 MPIU_DBG_STATE_MEMLOG = 4, 125 MPIU_DBG_STATE_FILE = 8 126 } 127 MPIU_dbg_state_t; 128 129 int MPIU_dbg_init(int rank); 130 int MPIU_dbg_printf(const char *str, ...) ATTRIBUTE((format(printf,1,2))); 131 int MPIU_dbglog_printf(const char *str, ...) ATTRIBUTE((format(printf,1,2))); 132 int MPIU_dbglog_vprintf(const char *str, va_list ap); 133 void MPIU_dump_dbg_memlog_to_stdout(void); 134 void MPIU_dump_dbg_memlog_to_file(const char *filename); 135 void MPIU_dump_dbg_memlog(FILE * fp); 136 137 extern MPIU_dbg_state_t MPIU_dbg_state; 138 extern FILE * MPIU_dbg_fp; 139 #define MPIU_dbglog_flush() \ 140 { \ 141 if (MPIU_dbg_state & MPIU_DBG_STATE_STDOUT) \ 142 { \ 143 fflush(stdout); \ 144 } \ 145 } 146 int MPIU_DBG_Outevent(const char *, int, int, int, const char *, ...) 147 ATTRIBUTE((format(printf,5,6))); 148 int MPIU_DBG_Init( int *, char ***, int, int, int ); 149 int MPIU_DBG_PreInit( int *, char ***, int ); 150 151 #endif 152