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