1*d6b92ffaSHans Petter Selasky /* 2*d6b92ffaSHans Petter Selasky * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved. 3*d6b92ffaSHans Petter Selasky * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. 4*d6b92ffaSHans Petter Selasky * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. 5*d6b92ffaSHans Petter Selasky * 6*d6b92ffaSHans Petter Selasky * This software is available to you under a choice of one of two 7*d6b92ffaSHans Petter Selasky * licenses. You may choose to be licensed under the terms of the GNU 8*d6b92ffaSHans Petter Selasky * General Public License (GPL) Version 2, available from the file 9*d6b92ffaSHans Petter Selasky * COPYING in the main directory of this source tree, or the 10*d6b92ffaSHans Petter Selasky * OpenIB.org BSD license below: 11*d6b92ffaSHans Petter Selasky * 12*d6b92ffaSHans Petter Selasky * Redistribution and use in source and binary forms, with or 13*d6b92ffaSHans Petter Selasky * without modification, are permitted provided that the following 14*d6b92ffaSHans Petter Selasky * conditions are met: 15*d6b92ffaSHans Petter Selasky * 16*d6b92ffaSHans Petter Selasky * - Redistributions of source code must retain the above 17*d6b92ffaSHans Petter Selasky * copyright notice, this list of conditions and the following 18*d6b92ffaSHans Petter Selasky * disclaimer. 19*d6b92ffaSHans Petter Selasky * 20*d6b92ffaSHans Petter Selasky * - Redistributions in binary form must reproduce the above 21*d6b92ffaSHans Petter Selasky * copyright notice, this list of conditions and the following 22*d6b92ffaSHans Petter Selasky * disclaimer in the documentation and/or other materials 23*d6b92ffaSHans Petter Selasky * provided with the distribution. 24*d6b92ffaSHans Petter Selasky * 25*d6b92ffaSHans Petter Selasky * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 26*d6b92ffaSHans Petter Selasky * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 27*d6b92ffaSHans Petter Selasky * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 28*d6b92ffaSHans Petter Selasky * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 29*d6b92ffaSHans Petter Selasky * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 30*d6b92ffaSHans Petter Selasky * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 31*d6b92ffaSHans Petter Selasky * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 32*d6b92ffaSHans Petter Selasky * SOFTWARE. 33*d6b92ffaSHans Petter Selasky * 34*d6b92ffaSHans Petter Selasky */ 35*d6b92ffaSHans Petter Selasky 36*d6b92ffaSHans Petter Selasky /* 37*d6b92ffaSHans Petter Selasky * Abstract: 38*d6b92ffaSHans Petter Selasky * Declaration of functions for reporting debug output. 39*d6b92ffaSHans Petter Selasky */ 40*d6b92ffaSHans Petter Selasky 41*d6b92ffaSHans Petter Selasky #ifndef _CL_DEBUG_H_ 42*d6b92ffaSHans Petter Selasky #define _CL_DEBUG_H_ 43*d6b92ffaSHans Petter Selasky 44*d6b92ffaSHans Petter Selasky #include <complib/cl_debug_osd.h> 45*d6b92ffaSHans Petter Selasky 46*d6b92ffaSHans Petter Selasky #ifdef __cplusplus 47*d6b92ffaSHans Petter Selasky # define BEGIN_C_DECLS extern "C" { 48*d6b92ffaSHans Petter Selasky # define END_C_DECLS } 49*d6b92ffaSHans Petter Selasky #else /* !__cplusplus */ 50*d6b92ffaSHans Petter Selasky # define BEGIN_C_DECLS 51*d6b92ffaSHans Petter Selasky # define END_C_DECLS 52*d6b92ffaSHans Petter Selasky #endif /* __cplusplus */ 53*d6b92ffaSHans Petter Selasky 54*d6b92ffaSHans Petter Selasky BEGIN_C_DECLS 55*d6b92ffaSHans Petter Selasky /****h* Component Library/Debug Output 56*d6b92ffaSHans Petter Selasky * NAME 57*d6b92ffaSHans Petter Selasky * Debug Output 58*d6b92ffaSHans Petter Selasky * 59*d6b92ffaSHans Petter Selasky * DESCRIPTION 60*d6b92ffaSHans Petter Selasky * The debug output functions and macros send debug messages to the current 61*d6b92ffaSHans Petter Selasky * debug target. 62*d6b92ffaSHans Petter Selasky *********/ 63*d6b92ffaSHans Petter Selasky /****f* Component Library: Debug Output/cl_break 64*d6b92ffaSHans Petter Selasky * NAME 65*d6b92ffaSHans Petter Selasky * cl_break 66*d6b92ffaSHans Petter Selasky * 67*d6b92ffaSHans Petter Selasky * DESCRIPTION 68*d6b92ffaSHans Petter Selasky * The cl_break function halts execution. 69*d6b92ffaSHans Petter Selasky * 70*d6b92ffaSHans Petter Selasky * SYNOPSIS 71*d6b92ffaSHans Petter Selasky * void 72*d6b92ffaSHans Petter Selasky * cl_break(); 73*d6b92ffaSHans Petter Selasky * 74*d6b92ffaSHans Petter Selasky * RETURN VALUE 75*d6b92ffaSHans Petter Selasky * This function does not return a value. 76*d6b92ffaSHans Petter Selasky * 77*d6b92ffaSHans Petter Selasky * NOTES 78*d6b92ffaSHans Petter Selasky * In a release build, cl_break has no effect. 79*d6b92ffaSHans Petter Selasky *********/ 80*d6b92ffaSHans Petter Selasky /****f* Component Library: Debug Output/cl_is_debug 81*d6b92ffaSHans Petter Selasky * NAME 82*d6b92ffaSHans Petter Selasky * cl_is_debug 83*d6b92ffaSHans Petter Selasky * 84*d6b92ffaSHans Petter Selasky * DESCRIPTION 85*d6b92ffaSHans Petter Selasky * The cl_is_debug function returns TRUE if the complib was compiled 86*d6b92ffaSHans Petter Selasky * in debug mode, and FALSE otherwise. 87*d6b92ffaSHans Petter Selasky * 88*d6b92ffaSHans Petter Selasky * SYNOPSIS 89*d6b92ffaSHans Petter Selasky */ 90*d6b92ffaSHans Petter Selasky boolean_t cl_is_debug(void); 91*d6b92ffaSHans Petter Selasky /* 92*d6b92ffaSHans Petter Selasky * PARAMETERS 93*d6b92ffaSHans Petter Selasky * None 94*d6b92ffaSHans Petter Selasky * 95*d6b92ffaSHans Petter Selasky * RETURN VALUE 96*d6b92ffaSHans Petter Selasky * TRUE if compiled in debug version. FALSE otherwise. 97*d6b92ffaSHans Petter Selasky * 98*d6b92ffaSHans Petter Selasky * NOTES 99*d6b92ffaSHans Petter Selasky * 100*d6b92ffaSHans Petter Selasky *********/ 101*d6b92ffaSHans Petter Selasky 102*d6b92ffaSHans Petter Selasky #if defined( _DEBUG_ ) 103*d6b92ffaSHans Petter Selasky #ifndef cl_dbg_out 104*d6b92ffaSHans Petter Selasky /****f* Component Library: Debug Output/cl_dbg_out 105*d6b92ffaSHans Petter Selasky * NAME 106*d6b92ffaSHans Petter Selasky * cl_dbg_out 107*d6b92ffaSHans Petter Selasky * 108*d6b92ffaSHans Petter Selasky * DESCRIPTION 109*d6b92ffaSHans Petter Selasky * The cl_dbg_out function sends a debug message to the debug target in 110*d6b92ffaSHans Petter Selasky * debug builds only. 111*d6b92ffaSHans Petter Selasky * 112*d6b92ffaSHans Petter Selasky * SYNOPSIS 113*d6b92ffaSHans Petter Selasky */ 114*d6b92ffaSHans Petter Selasky void cl_dbg_out(IN const char *const debug_message, IN ...); 115*d6b92ffaSHans Petter Selasky /* 116*d6b92ffaSHans Petter Selasky * PARAMETERS 117*d6b92ffaSHans Petter Selasky * debug_message 118*d6b92ffaSHans Petter Selasky * [in] ANSI string formatted identically as for a call to the standard C 119*d6b92ffaSHans Petter Selasky * function printf. 120*d6b92ffaSHans Petter Selasky * 121*d6b92ffaSHans Petter Selasky * ... 122*d6b92ffaSHans Petter Selasky * [in] Extra parameters for string formatting, as defined for the 123*d6b92ffaSHans Petter Selasky * standard C function printf. 124*d6b92ffaSHans Petter Selasky * 125*d6b92ffaSHans Petter Selasky * RETURN VALUE 126*d6b92ffaSHans Petter Selasky * This function does not return a value. 127*d6b92ffaSHans Petter Selasky * 128*d6b92ffaSHans Petter Selasky * NOTES 129*d6b92ffaSHans Petter Selasky * In a release build, cl_dbg_out has no effect. 130*d6b92ffaSHans Petter Selasky * 131*d6b92ffaSHans Petter Selasky * The formatting of the debug_message string is the same as for printf 132*d6b92ffaSHans Petter Selasky * 133*d6b92ffaSHans Petter Selasky * cl_dbg_out sends the debug message to the current debug target. 134*d6b92ffaSHans Petter Selasky * 135*d6b92ffaSHans Petter Selasky * SEE ALSO 136*d6b92ffaSHans Petter Selasky * Debug Output, cl_msg_out 137*d6b92ffaSHans Petter Selasky *********/ 138*d6b92ffaSHans Petter Selasky #endif 139*d6b92ffaSHans Petter Selasky #else 140*d6b92ffaSHans Petter Selasky static inline void cl_dbg_out(IN const char *const debug_message, IN ...) 141*d6b92ffaSHans Petter Selasky { 142*d6b92ffaSHans Petter Selasky UNUSED_PARAM(debug_message); 143*d6b92ffaSHans Petter Selasky } 144*d6b92ffaSHans Petter Selasky #endif /* defined( _DEBUG_ ) */ 145*d6b92ffaSHans Petter Selasky 146*d6b92ffaSHans Petter Selasky #ifndef cl_msg_out 147*d6b92ffaSHans Petter Selasky /****f* Component Library: Debug Output/cl_msg_out 148*d6b92ffaSHans Petter Selasky * NAME 149*d6b92ffaSHans Petter Selasky * cl_msg_out 150*d6b92ffaSHans Petter Selasky * 151*d6b92ffaSHans Petter Selasky * DESCRIPTION 152*d6b92ffaSHans Petter Selasky * The cl_msg_out function sends a debug message to the message log target. 153*d6b92ffaSHans Petter Selasky * 154*d6b92ffaSHans Petter Selasky * SYNOPSIS 155*d6b92ffaSHans Petter Selasky */ 156*d6b92ffaSHans Petter Selasky void cl_msg_out(IN const char *const message, IN ...); 157*d6b92ffaSHans Petter Selasky /* 158*d6b92ffaSHans Petter Selasky * PARAMETERS 159*d6b92ffaSHans Petter Selasky * message 160*d6b92ffaSHans Petter Selasky * [in] ANSI string formatted identically as for a call to the standard C 161*d6b92ffaSHans Petter Selasky * function printf. 162*d6b92ffaSHans Petter Selasky * 163*d6b92ffaSHans Petter Selasky * ... 164*d6b92ffaSHans Petter Selasky * [in] Extra parameters for string formatting, as defined for the 165*d6b92ffaSHans Petter Selasky * standard C function printf. 166*d6b92ffaSHans Petter Selasky * 167*d6b92ffaSHans Petter Selasky * RETURN VALUE 168*d6b92ffaSHans Petter Selasky * This function does not return a value. 169*d6b92ffaSHans Petter Selasky * 170*d6b92ffaSHans Petter Selasky * NOTES 171*d6b92ffaSHans Petter Selasky * cl_msg_out is available in both debug and release builds. 172*d6b92ffaSHans Petter Selasky * 173*d6b92ffaSHans Petter Selasky * The formatting of the message string is the same as for printf 174*d6b92ffaSHans Petter Selasky * 175*d6b92ffaSHans Petter Selasky * cl_msg_out sends the message to the current message logging target. 176*d6b92ffaSHans Petter Selasky * 177*d6b92ffaSHans Petter Selasky * SEE ALSO 178*d6b92ffaSHans Petter Selasky * Debug Output, cl_dbg_out 179*d6b92ffaSHans Petter Selasky *********/ 180*d6b92ffaSHans Petter Selasky #endif 181*d6b92ffaSHans Petter Selasky 182*d6b92ffaSHans Petter Selasky /****d* Component Library: Debug Output/Debug Levels 183*d6b92ffaSHans Petter Selasky * NAME 184*d6b92ffaSHans Petter Selasky * Debug Levels 185*d6b92ffaSHans Petter Selasky * 186*d6b92ffaSHans Petter Selasky * DESCRIPTION 187*d6b92ffaSHans Petter Selasky * The debug output macros reserve the upper bit of the debug level to 188*d6b92ffaSHans Petter Selasky * convey an error. 189*d6b92ffaSHans Petter Selasky * 190*d6b92ffaSHans Petter Selasky * SYNOPSIS 191*d6b92ffaSHans Petter Selasky */ 192*d6b92ffaSHans Petter Selasky #define CL_DBG_DISABLE 0 193*d6b92ffaSHans Petter Selasky #define CL_DBG_ERROR 0x80000000 194*d6b92ffaSHans Petter Selasky #define CL_DBG_ALL 0xFFFFFFFF 195*d6b92ffaSHans Petter Selasky /* 196*d6b92ffaSHans Petter Selasky * VALUES 197*d6b92ffaSHans Petter Selasky * CL_DBG_DISABLE 198*d6b92ffaSHans Petter Selasky * Disable all debug output, including errors. 199*d6b92ffaSHans Petter Selasky * 200*d6b92ffaSHans Petter Selasky * CL_DBG_ERROR 201*d6b92ffaSHans Petter Selasky * Enable error debug output. 202*d6b92ffaSHans Petter Selasky * 203*d6b92ffaSHans Petter Selasky * CL_DBG_ALL 204*d6b92ffaSHans Petter Selasky * Enbale all debug output. 205*d6b92ffaSHans Petter Selasky * 206*d6b92ffaSHans Petter Selasky * NOTES 207*d6b92ffaSHans Petter Selasky * Users can define custom debug levels using the lower 31 bits of their 208*d6b92ffaSHans Petter Selasky * debug level to control non-error debug output. Error messages are 209*d6b92ffaSHans Petter Selasky * always displayed, regardless of the lower bit definition. 210*d6b92ffaSHans Petter Selasky * 211*d6b92ffaSHans Petter Selasky * When specifying the debug output desired for non-error messages 212*d6b92ffaSHans Petter Selasky * (the CHK_LVL parameter in the debug output macros), users must define 213*d6b92ffaSHans Petter Selasky * all bits whose output they are interested in. 214*d6b92ffaSHans Petter Selasky * 215*d6b92ffaSHans Petter Selasky * SEE ALSO 216*d6b92ffaSHans Petter Selasky * Debug Output, CL_PRINT, CL_ENTER, CL_EXIT, CL_TRACE, CL_TRACE_EXIT 217*d6b92ffaSHans Petter Selasky *********/ 218*d6b92ffaSHans Petter Selasky 219*d6b92ffaSHans Petter Selasky #if defined(_DEBUG_) 220*d6b92ffaSHans Petter Selasky 221*d6b92ffaSHans Petter Selasky /****d* Component Library: Debug Output/CL_PRINT 222*d6b92ffaSHans Petter Selasky * NAME 223*d6b92ffaSHans Petter Selasky * CL_PRINT 224*d6b92ffaSHans Petter Selasky * 225*d6b92ffaSHans Petter Selasky * DESCRIPTION 226*d6b92ffaSHans Petter Selasky * The CL_PRINT macro sends a string to the current debug target if 227*d6b92ffaSHans Petter Selasky * the requested debug level matches the current debug level. 228*d6b92ffaSHans Petter Selasky * 229*d6b92ffaSHans Petter Selasky * SYNOPSIS 230*d6b92ffaSHans Petter Selasky * CL_PRINT( DBG_LVL, CHK_LVL, STRING ); 231*d6b92ffaSHans Petter Selasky * 232*d6b92ffaSHans Petter Selasky * PARAMETERS 233*d6b92ffaSHans Petter Selasky * DBG_LVL 234*d6b92ffaSHans Petter Selasky * [in] Debug level for the string to output 235*d6b92ffaSHans Petter Selasky * 236*d6b92ffaSHans Petter Selasky * CHK_LVL 237*d6b92ffaSHans Petter Selasky * [in] Current debug level against which to check DBG_LVL 238*d6b92ffaSHans Petter Selasky * 239*d6b92ffaSHans Petter Selasky * STRING 240*d6b92ffaSHans Petter Selasky * [in] String to send to the current debug target. The string includes 241*d6b92ffaSHans Petter Selasky * parentheses in order to allow additional parameters. 242*d6b92ffaSHans Petter Selasky * 243*d6b92ffaSHans Petter Selasky * RETURN VALUE 244*d6b92ffaSHans Petter Selasky * This macro does not return a value. 245*d6b92ffaSHans Petter Selasky * 246*d6b92ffaSHans Petter Selasky * EXAMPLE 247*d6b92ffaSHans Petter Selasky * #define MY_FUNC_DBG_LVL 1 248*d6b92ffaSHans Petter Selasky * 249*d6b92ffaSHans Petter Selasky * uint32_t my_dbg_lvl = CL_DBG_ALL; 250*d6b92ffaSHans Petter Selasky * 251*d6b92ffaSHans Petter Selasky * void 252*d6b92ffaSHans Petter Selasky * my_func() 253*d6b92ffaSHans Petter Selasky * { 254*d6b92ffaSHans Petter Selasky * CL_PRINT( MY_FUNC_DBG_LVL, my_dbg_lvl, ("Hello %s!\n", "world") ); 255*d6b92ffaSHans Petter Selasky * } 256*d6b92ffaSHans Petter Selasky * 257*d6b92ffaSHans Petter Selasky * RESULT 258*d6b92ffaSHans Petter Selasky * Hello world! 259*d6b92ffaSHans Petter Selasky * 260*d6b92ffaSHans Petter Selasky * NOTES 261*d6b92ffaSHans Petter Selasky * The requested string is printed only if all bits set in DBG_LVL are also 262*d6b92ffaSHans Petter Selasky * set in CHK_LVL unless the most significant bit is set (indicating an 263*d6b92ffaSHans Petter Selasky * error), in which case the lower bits are ignored. CHK_LVL may have 264*d6b92ffaSHans Petter Selasky * additional bits set. 265*d6b92ffaSHans Petter Selasky * 266*d6b92ffaSHans Petter Selasky * In multi-processor environments where the current processor can be 267*d6b92ffaSHans Petter Selasky * determined, the zero-based number of the processor on which the output 268*d6b92ffaSHans Petter Selasky * is generated is prepended to the output. 269*d6b92ffaSHans Petter Selasky * 270*d6b92ffaSHans Petter Selasky * SEE ALSO 271*d6b92ffaSHans Petter Selasky * Debug Output, Debug Levels, CL_ENTER, CL_EXIT, CL_TRACE, CL_TRACE_EXIT 272*d6b92ffaSHans Petter Selasky *********/ 273*d6b92ffaSHans Petter Selasky #define CL_PRINT( DBG_LVL, CHK_LVL, STRING ) \ 274*d6b92ffaSHans Petter Selasky { \ 275*d6b92ffaSHans Petter Selasky if( DBG_LVL & CL_DBG_ERROR ) \ 276*d6b92ffaSHans Petter Selasky cl_dbg_out STRING; \ 277*d6b92ffaSHans Petter Selasky else if( (DBG_LVL & CHK_LVL) == DBG_LVL ) \ 278*d6b92ffaSHans Petter Selasky cl_dbg_out STRING; \ 279*d6b92ffaSHans Petter Selasky } 280*d6b92ffaSHans Petter Selasky 281*d6b92ffaSHans Petter Selasky /****d* Component Library: Debug Output/CL_ENTER 282*d6b92ffaSHans Petter Selasky * NAME 283*d6b92ffaSHans Petter Selasky * CL_ENTER 284*d6b92ffaSHans Petter Selasky * 285*d6b92ffaSHans Petter Selasky * DESCRIPTION 286*d6b92ffaSHans Petter Selasky * The CL_ENTER macro marks the entrance into a function by sending a 287*d6b92ffaSHans Petter Selasky * string to the current debug target if the requested debug level matches 288*d6b92ffaSHans Petter Selasky * the current debug level. 289*d6b92ffaSHans Petter Selasky * 290*d6b92ffaSHans Petter Selasky * SYNOPSIS 291*d6b92ffaSHans Petter Selasky * CL_ENTER( DBG_LVL, CHK_LVL ); 292*d6b92ffaSHans Petter Selasky * 293*d6b92ffaSHans Petter Selasky * PARAMETERS 294*d6b92ffaSHans Petter Selasky * DBG_LVL 295*d6b92ffaSHans Petter Selasky * [in] Debug level for the string to output 296*d6b92ffaSHans Petter Selasky * 297*d6b92ffaSHans Petter Selasky * CHK_LVL 298*d6b92ffaSHans Petter Selasky * [in] Current debug level against which to check DBG_LVL 299*d6b92ffaSHans Petter Selasky * 300*d6b92ffaSHans Petter Selasky * RETURN VALUE 301*d6b92ffaSHans Petter Selasky * This macro does not return a value. 302*d6b92ffaSHans Petter Selasky * 303*d6b92ffaSHans Petter Selasky * EXAMPLE 304*d6b92ffaSHans Petter Selasky * #define __MODULE__ "my_module" 305*d6b92ffaSHans Petter Selasky * #define MY_FUNC_DBG_LVL 1 306*d6b92ffaSHans Petter Selasky * 307*d6b92ffaSHans Petter Selasky * uint32_t my_dbg_lvl = CL_DBG_ALL; 308*d6b92ffaSHans Petter Selasky * 309*d6b92ffaSHans Petter Selasky * void 310*d6b92ffaSHans Petter Selasky * my_func() 311*d6b92ffaSHans Petter Selasky * { 312*d6b92ffaSHans Petter Selasky * CL_ENTER( MY_FUNC_DBG_LVL, my_dbg_lvl ); 313*d6b92ffaSHans Petter Selasky * CL_EXIT( MY_FUNC_DBG_LVL, my_dbg_lvl ); 314*d6b92ffaSHans Petter Selasky * } 315*d6b92ffaSHans Petter Selasky * 316*d6b92ffaSHans Petter Selasky * RESULT 317*d6b92ffaSHans Petter Selasky * my_module:my_func() [ 318*d6b92ffaSHans Petter Selasky * my_module:my_func() ] 319*d6b92ffaSHans Petter Selasky * 320*d6b92ffaSHans Petter Selasky * NOTES 321*d6b92ffaSHans Petter Selasky * The function entrance notification is printed only if all bits set 322*d6b92ffaSHans Petter Selasky * in DBG_LVL are also set in CHK_LVL. CHK_LVL may have additional bits set. 323*d6b92ffaSHans Petter Selasky * 324*d6b92ffaSHans Petter Selasky * If the __MODULE__ preprocessor keyword is defined, that keyword will be 325*d6b92ffaSHans Petter Selasky * prepended to the function name, separated with a colon. 326*d6b92ffaSHans Petter Selasky * 327*d6b92ffaSHans Petter Selasky * In multi-processor environments where the current processor can be 328*d6b92ffaSHans Petter Selasky * determined, the zero-based number of the processor on which the output 329*d6b92ffaSHans Petter Selasky * is generated is prepended to the output. 330*d6b92ffaSHans Petter Selasky * 331*d6b92ffaSHans Petter Selasky * SEE ALSO 332*d6b92ffaSHans Petter Selasky * Debug Output, Debug Levels, CL_PRINT, CL_EXIT, CL_TRACE, CL_TRACE_EXIT 333*d6b92ffaSHans Petter Selasky *********/ 334*d6b92ffaSHans Petter Selasky #define CL_ENTER( DBG_LVL, CHK_LVL ) \ 335*d6b92ffaSHans Petter Selasky CL_CHK_STK; \ 336*d6b92ffaSHans Petter Selasky CL_PRINT( DBG_LVL, CHK_LVL, _CL_DBG_ENTER ); 337*d6b92ffaSHans Petter Selasky 338*d6b92ffaSHans Petter Selasky /****d* Component Library: Debug Output/CL_EXIT 339*d6b92ffaSHans Petter Selasky * NAME 340*d6b92ffaSHans Petter Selasky * CL_EXIT 341*d6b92ffaSHans Petter Selasky * 342*d6b92ffaSHans Petter Selasky * DESCRIPTION 343*d6b92ffaSHans Petter Selasky * The CL_EXIT macro marks the exit from a function by sending a string 344*d6b92ffaSHans Petter Selasky * to the current debug target if the requested debug level matches the 345*d6b92ffaSHans Petter Selasky * current debug level. 346*d6b92ffaSHans Petter Selasky * 347*d6b92ffaSHans Petter Selasky * SYNOPSIS 348*d6b92ffaSHans Petter Selasky * CL_EXIT( DBG_LVL, CHK_LVL ); 349*d6b92ffaSHans Petter Selasky * 350*d6b92ffaSHans Petter Selasky * PARAMETERS 351*d6b92ffaSHans Petter Selasky * DBG_LVL 352*d6b92ffaSHans Petter Selasky * [in] Debug level for the string to output 353*d6b92ffaSHans Petter Selasky * 354*d6b92ffaSHans Petter Selasky * CHK_LVL 355*d6b92ffaSHans Petter Selasky * [in] Current debug level against which to check DBG_LVL 356*d6b92ffaSHans Petter Selasky * 357*d6b92ffaSHans Petter Selasky * RETURN VALUE 358*d6b92ffaSHans Petter Selasky * This macro does not return a value. 359*d6b92ffaSHans Petter Selasky * 360*d6b92ffaSHans Petter Selasky * EXAMPLE 361*d6b92ffaSHans Petter Selasky * #define __MODULE__ "my_module" 362*d6b92ffaSHans Petter Selasky * #define MY_FUNC_DBG_LVL 1 363*d6b92ffaSHans Petter Selasky * 364*d6b92ffaSHans Petter Selasky * uint32_t my_dbg_lvl = CL_DBG_ALL; 365*d6b92ffaSHans Petter Selasky * 366*d6b92ffaSHans Petter Selasky * void 367*d6b92ffaSHans Petter Selasky * my_func() 368*d6b92ffaSHans Petter Selasky * { 369*d6b92ffaSHans Petter Selasky * CL_ENTER( MY_FUNC_DBG_LVL, my_dbg_lvl ); 370*d6b92ffaSHans Petter Selasky * CL_EXIT( MY_FUNC_DBG_LVL, my_dbg_lvl ); 371*d6b92ffaSHans Petter Selasky * } 372*d6b92ffaSHans Petter Selasky * 373*d6b92ffaSHans Petter Selasky * RESULT 374*d6b92ffaSHans Petter Selasky * my_module:my_func() [ 375*d6b92ffaSHans Petter Selasky * my_module:my_func() ] 376*d6b92ffaSHans Petter Selasky * 377*d6b92ffaSHans Petter Selasky * NOTES 378*d6b92ffaSHans Petter Selasky * The exit notification is printed only if all bits set in DBG_LVL are also 379*d6b92ffaSHans Petter Selasky * set in CHK_LVL. CHK_LVL may have additional bits set. 380*d6b92ffaSHans Petter Selasky * 381*d6b92ffaSHans Petter Selasky * The CL_EXIT macro must only be used after the CL_ENTRY macro as it 382*d6b92ffaSHans Petter Selasky * depends on that macro's implementation. 383*d6b92ffaSHans Petter Selasky * 384*d6b92ffaSHans Petter Selasky * If the __MODULE__ preprocessor keyword is defined, that keyword will be 385*d6b92ffaSHans Petter Selasky * prepended to the function name, separated with a colon. 386*d6b92ffaSHans Petter Selasky * 387*d6b92ffaSHans Petter Selasky * In multi-processor environments where the current processor can be 388*d6b92ffaSHans Petter Selasky * determined, the zero-based number of the processor on which the output 389*d6b92ffaSHans Petter Selasky * is generated is prepended to the output. 390*d6b92ffaSHans Petter Selasky * 391*d6b92ffaSHans Petter Selasky * SEE ALSO 392*d6b92ffaSHans Petter Selasky * Debug Output, Debug Levels, CL_PRINT, CL_ENTER, CL_TRACE, CL_TRACE_EXIT 393*d6b92ffaSHans Petter Selasky *********/ 394*d6b92ffaSHans Petter Selasky #define CL_EXIT( DBG_LVL, CHK_LVL ) \ 395*d6b92ffaSHans Petter Selasky CL_PRINT( DBG_LVL, CHK_LVL, _CL_DBG_EXIT ); 396*d6b92ffaSHans Petter Selasky 397*d6b92ffaSHans Petter Selasky /****d* Component Library: Debug Output/CL_TRACE 398*d6b92ffaSHans Petter Selasky * NAME 399*d6b92ffaSHans Petter Selasky * CL_TRACE 400*d6b92ffaSHans Petter Selasky * 401*d6b92ffaSHans Petter Selasky * DESCRIPTION 402*d6b92ffaSHans Petter Selasky * The CL_TRACE macro sends a string to the current debug target if 403*d6b92ffaSHans Petter Selasky * the requested debug level matches the current debug level. The 404*d6b92ffaSHans Petter Selasky * output is prepended with the function name and, depending on the 405*d6b92ffaSHans Petter Selasky * debug level requested, an indication of the severity of the message. 406*d6b92ffaSHans Petter Selasky * 407*d6b92ffaSHans Petter Selasky * SYNOPSIS 408*d6b92ffaSHans Petter Selasky * CL_TRACE( DBG_LVL, CHK_LVL, STRING ); 409*d6b92ffaSHans Petter Selasky * 410*d6b92ffaSHans Petter Selasky * PARAMETERS 411*d6b92ffaSHans Petter Selasky * DBG_LVL 412*d6b92ffaSHans Petter Selasky * [in] Debug level for the string to output 413*d6b92ffaSHans Petter Selasky * 414*d6b92ffaSHans Petter Selasky * CHK_LVL 415*d6b92ffaSHans Petter Selasky * [in] Current debug level against which to check DBG_LVL 416*d6b92ffaSHans Petter Selasky * 417*d6b92ffaSHans Petter Selasky * STRING 418*d6b92ffaSHans Petter Selasky * [in] String to send to the current debug target. The string includes 419*d6b92ffaSHans Petter Selasky * parentheses in order to allow additional parameters. 420*d6b92ffaSHans Petter Selasky * 421*d6b92ffaSHans Petter Selasky * RETURN VALUE 422*d6b92ffaSHans Petter Selasky * This macro does not return a value. 423*d6b92ffaSHans Petter Selasky * 424*d6b92ffaSHans Petter Selasky * EXAMPLE 425*d6b92ffaSHans Petter Selasky * #define __MODULE__ "my_module" 426*d6b92ffaSHans Petter Selasky * #define MY_FUNC_DBG_LVL 1 427*d6b92ffaSHans Petter Selasky * 428*d6b92ffaSHans Petter Selasky * uint32_t my_dbg_lvl = CL_DBG_ALL; 429*d6b92ffaSHans Petter Selasky * 430*d6b92ffaSHans Petter Selasky * void 431*d6b92ffaSHans Petter Selasky * my_func() 432*d6b92ffaSHans Petter Selasky * { 433*d6b92ffaSHans Petter Selasky * CL_ENTER( MY_FUNC_DBG_LVL, my_dbg_lvl ); 434*d6b92ffaSHans Petter Selasky * CL_TRACE( MY_FUNC_DBG_LVL, my_dbg_lvl, ("Hello %s!\n", "world") ); 435*d6b92ffaSHans Petter Selasky * CL_EXIT( MY_FUNC_DBG_LVL, my_dbg_lvl ); 436*d6b92ffaSHans Petter Selasky * } 437*d6b92ffaSHans Petter Selasky * 438*d6b92ffaSHans Petter Selasky * RESULT 439*d6b92ffaSHans Petter Selasky * my_module:my_func() [ 440*d6b92ffaSHans Petter Selasky * my_module:my_func(): Hello world! 441*d6b92ffaSHans Petter Selasky * my_module:my_func() ] 442*d6b92ffaSHans Petter Selasky * 443*d6b92ffaSHans Petter Selasky * NOTES 444*d6b92ffaSHans Petter Selasky * The requested string is printed only if all bits set in DBG_LVL are also 445*d6b92ffaSHans Petter Selasky * set in CHK_LVL. CHK_LVL may have additional bits set. 446*d6b92ffaSHans Petter Selasky * 447*d6b92ffaSHans Petter Selasky * The CL_TRACE macro must only be used after the CL_ENTRY macro as it 448*d6b92ffaSHans Petter Selasky * depends on that macro's implementation. 449*d6b92ffaSHans Petter Selasky * 450*d6b92ffaSHans Petter Selasky * If the DBG_LVL has the upper bit set, the output will contain 451*d6b92ffaSHans Petter Selasky * an "!ERROR!" statement between the function name and STRING. 452*d6b92ffaSHans Petter Selasky * 453*d6b92ffaSHans Petter Selasky * If the __MODULE__ preprocessor keyword is defined, that keyword will be 454*d6b92ffaSHans Petter Selasky * prepended to the function name, separated with a colon. 455*d6b92ffaSHans Petter Selasky * 456*d6b92ffaSHans Petter Selasky * In multi-processor environments where the current processor can be 457*d6b92ffaSHans Petter Selasky * determined, the zero-based number of the processor on which the output 458*d6b92ffaSHans Petter Selasky * is generated is prepended to the output. 459*d6b92ffaSHans Petter Selasky * 460*d6b92ffaSHans Petter Selasky * SEE ALSO 461*d6b92ffaSHans Petter Selasky * Debug Output, Debug Levels, CL_PRINT, CL_ENTER, CL_EXIT, CL_TRACE_EXIT 462*d6b92ffaSHans Petter Selasky *********/ 463*d6b92ffaSHans Petter Selasky #define CL_TRACE( DBG_LVL, CHK_LVL, STRING ) \ 464*d6b92ffaSHans Petter Selasky { \ 465*d6b92ffaSHans Petter Selasky switch( DBG_LVL & CL_DBG_ERROR ) \ 466*d6b92ffaSHans Petter Selasky { \ 467*d6b92ffaSHans Petter Selasky case CL_DBG_ERROR: \ 468*d6b92ffaSHans Petter Selasky CL_PRINT( DBG_LVL, CHK_LVL, _CL_DBG_ERROR ); \ 469*d6b92ffaSHans Petter Selasky break; \ 470*d6b92ffaSHans Petter Selasky default: \ 471*d6b92ffaSHans Petter Selasky CL_PRINT( DBG_LVL, CHK_LVL, _CL_DBG_INFO ); \ 472*d6b92ffaSHans Petter Selasky break; \ 473*d6b92ffaSHans Petter Selasky } \ 474*d6b92ffaSHans Petter Selasky CL_PRINT( DBG_LVL, CHK_LVL, STRING ); \ 475*d6b92ffaSHans Petter Selasky } 476*d6b92ffaSHans Petter Selasky 477*d6b92ffaSHans Petter Selasky /****d* Component Library: Debug Output/CL_TRACE_EXIT 478*d6b92ffaSHans Petter Selasky * NAME 479*d6b92ffaSHans Petter Selasky * CL_TRACE_EXIT 480*d6b92ffaSHans Petter Selasky * 481*d6b92ffaSHans Petter Selasky * DESCRIPTION 482*d6b92ffaSHans Petter Selasky * The CL_TRACE_EXIT macro combines the functionality of the CL_TRACE and 483*d6b92ffaSHans Petter Selasky * CL_EXIT macros, in that order. 484*d6b92ffaSHans Petter Selasky * 485*d6b92ffaSHans Petter Selasky * SYNOPSIS 486*d6b92ffaSHans Petter Selasky * CL_TRACE_EXIT( DBG_LVL, CHK_LVL, STRING ); 487*d6b92ffaSHans Petter Selasky * 488*d6b92ffaSHans Petter Selasky * PARAMETERS 489*d6b92ffaSHans Petter Selasky * DBG_LVL 490*d6b92ffaSHans Petter Selasky * [in] Debug level for the string to output 491*d6b92ffaSHans Petter Selasky * 492*d6b92ffaSHans Petter Selasky * CHK_LVL 493*d6b92ffaSHans Petter Selasky * [in] Current debug level against which to check DBG_LVL 494*d6b92ffaSHans Petter Selasky * 495*d6b92ffaSHans Petter Selasky * STRING 496*d6b92ffaSHans Petter Selasky * [in] String to send to the current debug target. The string includes 497*d6b92ffaSHans Petter Selasky * parentheses in order to allow additional parameters. 498*d6b92ffaSHans Petter Selasky * 499*d6b92ffaSHans Petter Selasky * RETURN VALUE 500*d6b92ffaSHans Petter Selasky * This macro does not return a value. 501*d6b92ffaSHans Petter Selasky * 502*d6b92ffaSHans Petter Selasky * EXAMPLE 503*d6b92ffaSHans Petter Selasky * #define __MODULE__ "my_module" 504*d6b92ffaSHans Petter Selasky * #define MY_FUNC_DBG_LVL 1 505*d6b92ffaSHans Petter Selasky * 506*d6b92ffaSHans Petter Selasky * uint32_t my_dbg_lvl = CL_DBG_ALL; 507*d6b92ffaSHans Petter Selasky * 508*d6b92ffaSHans Petter Selasky * void 509*d6b92ffaSHans Petter Selasky * my_func() 510*d6b92ffaSHans Petter Selasky * { 511*d6b92ffaSHans Petter Selasky * CL_ENTER( MY_FUNC_DBG_LVL, my_dbg_lvl ); 512*d6b92ffaSHans Petter Selasky * CL_TRACE_EXIT( MY_FUNC_DBG_LVL, my_dbg_lvl, ("Hello %s!\n", "world") ); 513*d6b92ffaSHans Petter Selasky * } 514*d6b92ffaSHans Petter Selasky * 515*d6b92ffaSHans Petter Selasky * RESULT 516*d6b92ffaSHans Petter Selasky * my_module:my_func() [ 517*d6b92ffaSHans Petter Selasky * my_module:my_func(): Hello world! 518*d6b92ffaSHans Petter Selasky * my_module:my_func() ] 519*d6b92ffaSHans Petter Selasky * 520*d6b92ffaSHans Petter Selasky * NOTES 521*d6b92ffaSHans Petter Selasky * The requested string is printed only if all bits set in DBG_LVL are also 522*d6b92ffaSHans Petter Selasky * set in CHK_LVL. CHK_LVL may have additional bits set. 523*d6b92ffaSHans Petter Selasky * 524*d6b92ffaSHans Petter Selasky * The CL_TRACE_EXIT macro must only be used after the CL_ENTRY macro as it 525*d6b92ffaSHans Petter Selasky * depends on that macro's implementation. 526*d6b92ffaSHans Petter Selasky * 527*d6b92ffaSHans Petter Selasky * If the DBG_LVL has the upper bit set, the output will contain 528*d6b92ffaSHans Petter Selasky * an "!ERROR!" statement between the function name and STRING. 529*d6b92ffaSHans Petter Selasky * 530*d6b92ffaSHans Petter Selasky * If the __MODULE__ preprocessor keyword is defined, that keyword will be 531*d6b92ffaSHans Petter Selasky * prepended to the function name, separated with a colon. 532*d6b92ffaSHans Petter Selasky * 533*d6b92ffaSHans Petter Selasky * In multi-processor environments where the current processor can be 534*d6b92ffaSHans Petter Selasky * determined, the zero-based number of the processor on which the output 535*d6b92ffaSHans Petter Selasky * is generated is prepended to the output. 536*d6b92ffaSHans Petter Selasky * 537*d6b92ffaSHans Petter Selasky * SEE ALSO 538*d6b92ffaSHans Petter Selasky * Debug Output, Debug Levels, CL_PRINT, CL_ENTER, CL_EXIT, CL_TRACE 539*d6b92ffaSHans Petter Selasky *********/ 540*d6b92ffaSHans Petter Selasky #define CL_TRACE_EXIT( DBG_LVL, CHK_LVL, STRING ) \ 541*d6b92ffaSHans Petter Selasky CL_TRACE( DBG_LVL, CHK_LVL, STRING ); \ 542*d6b92ffaSHans Petter Selasky CL_EXIT( DBG_LVL, CHK_LVL ); 543*d6b92ffaSHans Petter Selasky 544*d6b92ffaSHans Petter Selasky #else /* defined(_DEBUG_) */ 545*d6b92ffaSHans Petter Selasky 546*d6b92ffaSHans Petter Selasky /* Define as NULL macros in a free build. */ 547*d6b92ffaSHans Petter Selasky #define CL_PRINT( DBG_LVL, CHK_LVL, STRING ); 548*d6b92ffaSHans Petter Selasky #define CL_ENTER( DBG_LVL, CHK_LVL ); 549*d6b92ffaSHans Petter Selasky #define CL_EXIT( DBG_LVL, CHK_LVL ); 550*d6b92ffaSHans Petter Selasky #define CL_TRACE( DBG_LVL, CHK_LVL, STRING ); 551*d6b92ffaSHans Petter Selasky #define CL_TRACE_EXIT( DBG_LVL, CHK_LVL, STRING ); 552*d6b92ffaSHans Petter Selasky 553*d6b92ffaSHans Petter Selasky #endif /* defined(_DEBUG_) */ 554*d6b92ffaSHans Petter Selasky 555*d6b92ffaSHans Petter Selasky /****d* Component Library: Debug Output/64-bit Print Format 556*d6b92ffaSHans Petter Selasky * NAME 557*d6b92ffaSHans Petter Selasky * 64-bit Print Format 558*d6b92ffaSHans Petter Selasky * 559*d6b92ffaSHans Petter Selasky * DESCRIPTION 560*d6b92ffaSHans Petter Selasky * The 64-bit print keywords allow users to use 64-bit values in debug or 561*d6b92ffaSHans Petter Selasky * console output. 562*d6b92ffaSHans Petter Selasky * 563*d6b92ffaSHans Petter Selasky * Different platforms define 64-bit print formats differently. The 64-bit 564*d6b92ffaSHans Petter Selasky * print formats exposed by the component library are supported in all 565*d6b92ffaSHans Petter Selasky * platforms. 566*d6b92ffaSHans Petter Selasky * 567*d6b92ffaSHans Petter Selasky * VALUES 568*d6b92ffaSHans Petter Selasky * PRId64 569*d6b92ffaSHans Petter Selasky * Print a 64-bit integer in signed decimal format. 570*d6b92ffaSHans Petter Selasky * PRIx64 571*d6b92ffaSHans Petter Selasky * Print a 64-bit integer in hexadecimal format. 572*d6b92ffaSHans Petter Selasky * PRIo64 573*d6b92ffaSHans Petter Selasky * Print a 64-bit integer in octal format. 574*d6b92ffaSHans Petter Selasky * PRIu64 575*d6b92ffaSHans Petter Selasky * Print a 64-bit integer in unsigned decimal format. 576*d6b92ffaSHans Petter Selasky * 577*d6b92ffaSHans Petter Selasky * EXAMPLE 578*d6b92ffaSHans Petter Selasky * uint64 MyVal = 2; 579*d6b92ffaSHans Petter Selasky * // Print a 64-bit integer in hexadecimal format. 580*d6b92ffaSHans Petter Selasky * cl_dbg_out( "MyVal: 0x%" PRIx64 "\n", MyVal ); 581*d6b92ffaSHans Petter Selasky * 582*d6b92ffaSHans Petter Selasky * NOTES 583*d6b92ffaSHans Petter Selasky * Standard print flags to specify padding and precision can still be used 584*d6b92ffaSHans Petter Selasky * following the '%' sign in the string preceding the 64-bit print keyword. 585*d6b92ffaSHans Petter Selasky * 586*d6b92ffaSHans Petter Selasky * The above keywords are strings and make use of compilers' string 587*d6b92ffaSHans Petter Selasky * concatenation ability. 588*d6b92ffaSHans Petter Selasky *********/ 589*d6b92ffaSHans Petter Selasky void complib_init(void); 590*d6b92ffaSHans Petter Selasky 591*d6b92ffaSHans Petter Selasky void complib_exit(void); 592*d6b92ffaSHans Petter Selasky 593*d6b92ffaSHans Petter Selasky END_C_DECLS 594*d6b92ffaSHans Petter Selasky #endif /* _CL_DEBUG_H_ */ 595