1*0e209d39SAndroid Build Coastguard Worker // © 2016 and later: Unicode, Inc. and others. 2*0e209d39SAndroid Build Coastguard Worker // License & terms of use: http://www.unicode.org/copyright.html 3*0e209d39SAndroid Build Coastguard Worker /* 4*0e209d39SAndroid Build Coastguard Worker ******************************************************************************* 5*0e209d39SAndroid Build Coastguard Worker * 6*0e209d39SAndroid Build Coastguard Worker * Copyright (C) 2003-2009, International Business Machines 7*0e209d39SAndroid Build Coastguard Worker * Corporation and others. All Rights Reserved. 8*0e209d39SAndroid Build Coastguard Worker * 9*0e209d39SAndroid Build Coastguard Worker ******************************************************************************* 10*0e209d39SAndroid Build Coastguard Worker * file name: utracimp.h 11*0e209d39SAndroid Build Coastguard Worker * encoding: UTF-8 12*0e209d39SAndroid Build Coastguard Worker * tab size: 8 (not used) 13*0e209d39SAndroid Build Coastguard Worker * indentation:4 14*0e209d39SAndroid Build Coastguard Worker * 15*0e209d39SAndroid Build Coastguard Worker * created on: 2003aug06 16*0e209d39SAndroid Build Coastguard Worker * created by: Markus W. Scherer 17*0e209d39SAndroid Build Coastguard Worker * 18*0e209d39SAndroid Build Coastguard Worker * Internal header for ICU tracing/logging. 19*0e209d39SAndroid Build Coastguard Worker * 20*0e209d39SAndroid Build Coastguard Worker * 21*0e209d39SAndroid Build Coastguard Worker * Various notes: 22*0e209d39SAndroid Build Coastguard Worker * - using a trace level variable to only call trace functions 23*0e209d39SAndroid Build Coastguard Worker * when the level is sufficient 24*0e209d39SAndroid Build Coastguard Worker * - using the same variable for tracing on/off to never make a function 25*0e209d39SAndroid Build Coastguard Worker * call when off 26*0e209d39SAndroid Build Coastguard Worker * - the function number is put into a local variable by the entry macro 27*0e209d39SAndroid Build Coastguard Worker * and used implicitly to avoid copy&paste/typing mistakes by the developer 28*0e209d39SAndroid Build Coastguard Worker * - the application must call utrace_setFunctions() and pass in 29*0e209d39SAndroid Build Coastguard Worker * implementations for the trace functions 30*0e209d39SAndroid Build Coastguard Worker * - ICU trace macros call ICU functions that route through the function 31*0e209d39SAndroid Build Coastguard Worker * pointers if they have been set; 32*0e209d39SAndroid Build Coastguard Worker * this avoids an indirection at the call site 33*0e209d39SAndroid Build Coastguard Worker * (which would cost more code for another check and for the indirection) 34*0e209d39SAndroid Build Coastguard Worker * 35*0e209d39SAndroid Build Coastguard Worker * ### TODO Issues: 36*0e209d39SAndroid Build Coastguard Worker * - Verify that va_list is portable among compilers for the same platform. 37*0e209d39SAndroid Build Coastguard Worker * va_list should be portable because printf() would fail otherwise! 38*0e209d39SAndroid Build Coastguard Worker * - Should enum values like UTraceLevel be passed into int32_t-type arguments, 39*0e209d39SAndroid Build Coastguard Worker * or should enum types be used? 40*0e209d39SAndroid Build Coastguard Worker */ 41*0e209d39SAndroid Build Coastguard Worker 42*0e209d39SAndroid Build Coastguard Worker #ifndef __UTRACIMP_H__ 43*0e209d39SAndroid Build Coastguard Worker #define __UTRACIMP_H__ 44*0e209d39SAndroid Build Coastguard Worker 45*0e209d39SAndroid Build Coastguard Worker #include "unicode/utrace.h" 46*0e209d39SAndroid Build Coastguard Worker #include <stdarg.h> 47*0e209d39SAndroid Build Coastguard Worker 48*0e209d39SAndroid Build Coastguard Worker U_CDECL_BEGIN 49*0e209d39SAndroid Build Coastguard Worker 50*0e209d39SAndroid Build Coastguard Worker /** 51*0e209d39SAndroid Build Coastguard Worker * Traced Function Exit return types. 52*0e209d39SAndroid Build Coastguard Worker * Flags indicating the number and types of varargs included in a call 53*0e209d39SAndroid Build Coastguard Worker * to a UTraceExit function. 54*0e209d39SAndroid Build Coastguard Worker * Bits 0-3: The function return type. First variable param. 55*0e209d39SAndroid Build Coastguard Worker * Bit 4: Flag for presence of U_ErrorCode status param. 56*0e209d39SAndroid Build Coastguard Worker * @internal 57*0e209d39SAndroid Build Coastguard Worker */ 58*0e209d39SAndroid Build Coastguard Worker typedef enum UTraceExitVal { 59*0e209d39SAndroid Build Coastguard Worker /** The traced function returns no value @internal */ 60*0e209d39SAndroid Build Coastguard Worker UTRACE_EXITV_NONE = 0, 61*0e209d39SAndroid Build Coastguard Worker /** The traced function returns an int32_t, or compatible, type. @internal */ 62*0e209d39SAndroid Build Coastguard Worker UTRACE_EXITV_I32 = 1, 63*0e209d39SAndroid Build Coastguard Worker /** The traced function returns a pointer @internal */ 64*0e209d39SAndroid Build Coastguard Worker UTRACE_EXITV_PTR = 2, 65*0e209d39SAndroid Build Coastguard Worker /** The traced function returns a UBool @internal */ 66*0e209d39SAndroid Build Coastguard Worker UTRACE_EXITV_BOOL = 3, 67*0e209d39SAndroid Build Coastguard Worker /** Mask to extract the return type values from a UTraceExitVal @internal */ 68*0e209d39SAndroid Build Coastguard Worker UTRACE_EXITV_MASK = 0xf, 69*0e209d39SAndroid Build Coastguard Worker /** Bit indicating that the traced function includes a UErrorCode parameter @internal */ 70*0e209d39SAndroid Build Coastguard Worker UTRACE_EXITV_STATUS = 0x10 71*0e209d39SAndroid Build Coastguard Worker } UTraceExitVal; 72*0e209d39SAndroid Build Coastguard Worker 73*0e209d39SAndroid Build Coastguard Worker /** 74*0e209d39SAndroid Build Coastguard Worker * Trace function for the entry point of a function. 75*0e209d39SAndroid Build Coastguard Worker * Do not use directly, use UTRACE_ENTRY instead. 76*0e209d39SAndroid Build Coastguard Worker * @param fnNumber The UTraceFunctionNumber for the current function. 77*0e209d39SAndroid Build Coastguard Worker * @internal 78*0e209d39SAndroid Build Coastguard Worker */ 79*0e209d39SAndroid Build Coastguard Worker U_CAPI void U_EXPORT2 80*0e209d39SAndroid Build Coastguard Worker utrace_entry(int32_t fnNumber); 81*0e209d39SAndroid Build Coastguard Worker 82*0e209d39SAndroid Build Coastguard Worker /** 83*0e209d39SAndroid Build Coastguard Worker * Trace function for each exit point of a function. 84*0e209d39SAndroid Build Coastguard Worker * Do not use directly, use UTRACE_EXIT* instead. 85*0e209d39SAndroid Build Coastguard Worker * @param fnNumber The UTraceFunctionNumber for the current function. 86*0e209d39SAndroid Build Coastguard Worker * @param returnType The type of the value returned by the function. 87*0e209d39SAndroid Build Coastguard Worker * @param errorCode The UErrorCode value at function exit. See UTRACE_EXIT. 88*0e209d39SAndroid Build Coastguard Worker * @internal 89*0e209d39SAndroid Build Coastguard Worker */ 90*0e209d39SAndroid Build Coastguard Worker U_CAPI void U_EXPORT2 91*0e209d39SAndroid Build Coastguard Worker utrace_exit(int32_t fnNumber, int32_t returnType, ...); 92*0e209d39SAndroid Build Coastguard Worker 93*0e209d39SAndroid Build Coastguard Worker 94*0e209d39SAndroid Build Coastguard Worker /** 95*0e209d39SAndroid Build Coastguard Worker * Trace function used inside functions that have a UTRACE_ENTRY() statement. 96*0e209d39SAndroid Build Coastguard Worker * Do not use directly, use UTRACE_DATAX() macros instead. 97*0e209d39SAndroid Build Coastguard Worker * 98*0e209d39SAndroid Build Coastguard Worker * @param utraceFnNumber The number of the current function, from the local 99*0e209d39SAndroid Build Coastguard Worker * variable of the same name. 100*0e209d39SAndroid Build Coastguard Worker * @param level The trace level for this message. 101*0e209d39SAndroid Build Coastguard Worker * @param fmt The trace format string. 102*0e209d39SAndroid Build Coastguard Worker * 103*0e209d39SAndroid Build Coastguard Worker * @internal 104*0e209d39SAndroid Build Coastguard Worker */ 105*0e209d39SAndroid Build Coastguard Worker U_CAPI void U_EXPORT2 106*0e209d39SAndroid Build Coastguard Worker utrace_data(int32_t utraceFnNumber, int32_t level, const char *fmt, ...); 107*0e209d39SAndroid Build Coastguard Worker 108*0e209d39SAndroid Build Coastguard Worker U_CDECL_END 109*0e209d39SAndroid Build Coastguard Worker 110*0e209d39SAndroid Build Coastguard Worker #if U_ENABLE_TRACING 111*0e209d39SAndroid Build Coastguard Worker 112*0e209d39SAndroid Build Coastguard Worker /** 113*0e209d39SAndroid Build Coastguard Worker * Boolean expression to see if ICU tracing is turned on 114*0e209d39SAndroid Build Coastguard Worker * to at least the specified level. 115*0e209d39SAndroid Build Coastguard Worker * @internal 116*0e209d39SAndroid Build Coastguard Worker */ 117*0e209d39SAndroid Build Coastguard Worker #define UTRACE_LEVEL(level) (utrace_getLevel()>=(level)) 118*0e209d39SAndroid Build Coastguard Worker 119*0e209d39SAndroid Build Coastguard Worker /** 120*0e209d39SAndroid Build Coastguard Worker * Flag bit in utraceFnNumber, the local variable added to each function 121*0e209d39SAndroid Build Coastguard Worker * with tracing code to contains the function number. 122*0e209d39SAndroid Build Coastguard Worker * 123*0e209d39SAndroid Build Coastguard Worker * Set the flag if the function's entry is traced, which will cause the 124*0e209d39SAndroid Build Coastguard Worker * function's exit to also be traced. utraceFnNumber is uncoditionally 125*0e209d39SAndroid Build Coastguard Worker * set at entry, whether or not the entry is traced, so that it will 126*0e209d39SAndroid Build Coastguard Worker * always be available for error trace output. 127*0e209d39SAndroid Build Coastguard Worker * @internal 128*0e209d39SAndroid Build Coastguard Worker */ 129*0e209d39SAndroid Build Coastguard Worker #define UTRACE_TRACED_ENTRY 0x80000000 130*0e209d39SAndroid Build Coastguard Worker 131*0e209d39SAndroid Build Coastguard Worker /** 132*0e209d39SAndroid Build Coastguard Worker * Trace statement for the entry point of a function. 133*0e209d39SAndroid Build Coastguard Worker * Stores the function number in a local variable. 134*0e209d39SAndroid Build Coastguard Worker * In C code, must be placed immediately after the last variable declaration. 135*0e209d39SAndroid Build Coastguard Worker * Must be matched with UTRACE_EXIT() at all function exit points. 136*0e209d39SAndroid Build Coastguard Worker * 137*0e209d39SAndroid Build Coastguard Worker * Tracing should start with UTRACE_ENTRY after checking for 138*0e209d39SAndroid Build Coastguard Worker * U_FAILURE at function entry, so that if a function returns immediately 139*0e209d39SAndroid Build Coastguard Worker * because of a pre-existing error condition, it does not show up in the trace, 140*0e209d39SAndroid Build Coastguard Worker * consistent with ICU's error handling model. 141*0e209d39SAndroid Build Coastguard Worker * 142*0e209d39SAndroid Build Coastguard Worker * @param fnNumber The UTraceFunctionNumber for the current function. 143*0e209d39SAndroid Build Coastguard Worker * @internal 144*0e209d39SAndroid Build Coastguard Worker */ 145*0e209d39SAndroid Build Coastguard Worker #define UTRACE_ENTRY(fnNumber) \ 146*0e209d39SAndroid Build Coastguard Worker int32_t utraceFnNumber=(fnNumber); \ 147*0e209d39SAndroid Build Coastguard Worker UPRV_BLOCK_MACRO_BEGIN { \ 148*0e209d39SAndroid Build Coastguard Worker if(utrace_getLevel()>=UTRACE_INFO) { \ 149*0e209d39SAndroid Build Coastguard Worker utrace_entry(fnNumber); \ 150*0e209d39SAndroid Build Coastguard Worker utraceFnNumber |= UTRACE_TRACED_ENTRY; \ 151*0e209d39SAndroid Build Coastguard Worker } \ 152*0e209d39SAndroid Build Coastguard Worker } UPRV_BLOCK_MACRO_END 153*0e209d39SAndroid Build Coastguard Worker 154*0e209d39SAndroid Build Coastguard Worker 155*0e209d39SAndroid Build Coastguard Worker /** 156*0e209d39SAndroid Build Coastguard Worker * Trace statement for the entry point of open and close functions. 157*0e209d39SAndroid Build Coastguard Worker * Produces trace output at a less verbose setting than plain UTRACE_ENTRY 158*0e209d39SAndroid Build Coastguard Worker * Stores the function number in a local variable. 159*0e209d39SAndroid Build Coastguard Worker * In C code, must be placed immediately after the last variable declaration. 160*0e209d39SAndroid Build Coastguard Worker * Must be matched with UTRACE_EXIT() at all function exit points. 161*0e209d39SAndroid Build Coastguard Worker * 162*0e209d39SAndroid Build Coastguard Worker * @param fnNumber The UTraceFunctionNumber for the current function. 163*0e209d39SAndroid Build Coastguard Worker * @internal 164*0e209d39SAndroid Build Coastguard Worker */ 165*0e209d39SAndroid Build Coastguard Worker #define UTRACE_ENTRY_OC(fnNumber) \ 166*0e209d39SAndroid Build Coastguard Worker int32_t utraceFnNumber=(fnNumber); \ 167*0e209d39SAndroid Build Coastguard Worker UPRV_BLOCK_MACRO_BEGIN { \ 168*0e209d39SAndroid Build Coastguard Worker if(utrace_getLevel()>=UTRACE_OPEN_CLOSE) { \ 169*0e209d39SAndroid Build Coastguard Worker utrace_entry(fnNumber); \ 170*0e209d39SAndroid Build Coastguard Worker utraceFnNumber |= UTRACE_TRACED_ENTRY; \ 171*0e209d39SAndroid Build Coastguard Worker } \ 172*0e209d39SAndroid Build Coastguard Worker } UPRV_BLOCK_MACRO_END 173*0e209d39SAndroid Build Coastguard Worker 174*0e209d39SAndroid Build Coastguard Worker /** 175*0e209d39SAndroid Build Coastguard Worker * Trace statement for each exit point of a function that has a UTRACE_ENTRY() 176*0e209d39SAndroid Build Coastguard Worker * statement. 177*0e209d39SAndroid Build Coastguard Worker * 178*0e209d39SAndroid Build Coastguard Worker * @param errorCode The function's ICU UErrorCode value at function exit, 179*0e209d39SAndroid Build Coastguard Worker * or U_ZERO_ERROR if the function does not use a UErrorCode. 180*0e209d39SAndroid Build Coastguard Worker * 0==U_ZERO_ERROR indicates success, 181*0e209d39SAndroid Build Coastguard Worker * positive values an error (see u_errorName()), 182*0e209d39SAndroid Build Coastguard Worker * negative values an informational status. 183*0e209d39SAndroid Build Coastguard Worker * 184*0e209d39SAndroid Build Coastguard Worker * @internal 185*0e209d39SAndroid Build Coastguard Worker */ 186*0e209d39SAndroid Build Coastguard Worker #define UTRACE_EXIT() UPRV_BLOCK_MACRO_BEGIN { \ 187*0e209d39SAndroid Build Coastguard Worker if(utraceFnNumber & UTRACE_TRACED_ENTRY) { \ 188*0e209d39SAndroid Build Coastguard Worker utrace_exit(utraceFnNumber & ~UTRACE_TRACED_ENTRY, UTRACE_EXITV_NONE); \ 189*0e209d39SAndroid Build Coastguard Worker } \ 190*0e209d39SAndroid Build Coastguard Worker } UPRV_BLOCK_MACRO_END 191*0e209d39SAndroid Build Coastguard Worker 192*0e209d39SAndroid Build Coastguard Worker /** 193*0e209d39SAndroid Build Coastguard Worker * Trace statement for each exit point of a function that has a UTRACE_ENTRY() 194*0e209d39SAndroid Build Coastguard Worker * statement, and that returns a value. 195*0e209d39SAndroid Build Coastguard Worker * 196*0e209d39SAndroid Build Coastguard Worker * @param val The function's return value, int32_t or compatible type. 197*0e209d39SAndroid Build Coastguard Worker * 198*0e209d39SAndroid Build Coastguard Worker * @internal 199*0e209d39SAndroid Build Coastguard Worker */ 200*0e209d39SAndroid Build Coastguard Worker #define UTRACE_EXIT_VALUE(val) UPRV_BLOCK_MACRO_BEGIN { \ 201*0e209d39SAndroid Build Coastguard Worker if(utraceFnNumber & UTRACE_TRACED_ENTRY) { \ 202*0e209d39SAndroid Build Coastguard Worker utrace_exit(utraceFnNumber & ~UTRACE_TRACED_ENTRY, UTRACE_EXITV_I32, val); \ 203*0e209d39SAndroid Build Coastguard Worker } \ 204*0e209d39SAndroid Build Coastguard Worker } UPRV_BLOCK_MACRO_END 205*0e209d39SAndroid Build Coastguard Worker 206*0e209d39SAndroid Build Coastguard Worker #define UTRACE_EXIT_STATUS(status) UPRV_BLOCK_MACRO_BEGIN { \ 207*0e209d39SAndroid Build Coastguard Worker if(utraceFnNumber & UTRACE_TRACED_ENTRY) { \ 208*0e209d39SAndroid Build Coastguard Worker utrace_exit(utraceFnNumber & ~UTRACE_TRACED_ENTRY, UTRACE_EXITV_STATUS, status); \ 209*0e209d39SAndroid Build Coastguard Worker } \ 210*0e209d39SAndroid Build Coastguard Worker } UPRV_BLOCK_MACRO_END 211*0e209d39SAndroid Build Coastguard Worker 212*0e209d39SAndroid Build Coastguard Worker #define UTRACE_EXIT_VALUE_STATUS(val, status) UPRV_BLOCK_MACRO_BEGIN { \ 213*0e209d39SAndroid Build Coastguard Worker if(utraceFnNumber & UTRACE_TRACED_ENTRY) { \ 214*0e209d39SAndroid Build Coastguard Worker utrace_exit(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (UTRACE_EXITV_I32 | UTRACE_EXITV_STATUS), val, status); \ 215*0e209d39SAndroid Build Coastguard Worker } \ 216*0e209d39SAndroid Build Coastguard Worker } UPRV_BLOCK_MACRO_END 217*0e209d39SAndroid Build Coastguard Worker 218*0e209d39SAndroid Build Coastguard Worker #define UTRACE_EXIT_PTR_STATUS(ptr, status) UPRV_BLOCK_MACRO_BEGIN { \ 219*0e209d39SAndroid Build Coastguard Worker if(utraceFnNumber & UTRACE_TRACED_ENTRY) { \ 220*0e209d39SAndroid Build Coastguard Worker utrace_exit(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (UTRACE_EXITV_PTR | UTRACE_EXITV_STATUS), ptr, status); \ 221*0e209d39SAndroid Build Coastguard Worker } \ 222*0e209d39SAndroid Build Coastguard Worker } UPRV_BLOCK_MACRO_END 223*0e209d39SAndroid Build Coastguard Worker 224*0e209d39SAndroid Build Coastguard Worker /** 225*0e209d39SAndroid Build Coastguard Worker * Trace statement used inside functions that have a UTRACE_ENTRY() statement. 226*0e209d39SAndroid Build Coastguard Worker * Takes no data arguments. 227*0e209d39SAndroid Build Coastguard Worker * The number of arguments for this macro must match the number of inserts 228*0e209d39SAndroid Build Coastguard Worker * in the format string. Vector inserts count as two arguments. 229*0e209d39SAndroid Build Coastguard Worker * Calls utrace_data() if the level is high enough. 230*0e209d39SAndroid Build Coastguard Worker * @internal 231*0e209d39SAndroid Build Coastguard Worker */ 232*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA0(level, fmt) UPRV_BLOCK_MACRO_BEGIN { \ 233*0e209d39SAndroid Build Coastguard Worker if(UTRACE_LEVEL(level)) { \ 234*0e209d39SAndroid Build Coastguard Worker utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (level), (fmt)); \ 235*0e209d39SAndroid Build Coastguard Worker } \ 236*0e209d39SAndroid Build Coastguard Worker } UPRV_BLOCK_MACRO_END 237*0e209d39SAndroid Build Coastguard Worker 238*0e209d39SAndroid Build Coastguard Worker /** 239*0e209d39SAndroid Build Coastguard Worker * Trace statement used inside functions that have a UTRACE_ENTRY() statement. 240*0e209d39SAndroid Build Coastguard Worker * Takes one data argument. 241*0e209d39SAndroid Build Coastguard Worker * The number of arguments for this macro must match the number of inserts 242*0e209d39SAndroid Build Coastguard Worker * in the format string. Vector inserts count as two arguments. 243*0e209d39SAndroid Build Coastguard Worker * Calls utrace_data() if the level is high enough. 244*0e209d39SAndroid Build Coastguard Worker * @internal 245*0e209d39SAndroid Build Coastguard Worker */ 246*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA1(level, fmt, a) UPRV_BLOCK_MACRO_BEGIN { \ 247*0e209d39SAndroid Build Coastguard Worker if(UTRACE_LEVEL(level)) { \ 248*0e209d39SAndroid Build Coastguard Worker utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY , (level), (fmt), (a)); \ 249*0e209d39SAndroid Build Coastguard Worker } \ 250*0e209d39SAndroid Build Coastguard Worker } UPRV_BLOCK_MACRO_END 251*0e209d39SAndroid Build Coastguard Worker 252*0e209d39SAndroid Build Coastguard Worker /** 253*0e209d39SAndroid Build Coastguard Worker * Trace statement used inside functions that have a UTRACE_ENTRY() statement. 254*0e209d39SAndroid Build Coastguard Worker * Takes two data arguments. 255*0e209d39SAndroid Build Coastguard Worker * The number of arguments for this macro must match the number of inserts 256*0e209d39SAndroid Build Coastguard Worker * in the format string. Vector inserts count as two arguments. 257*0e209d39SAndroid Build Coastguard Worker * Calls utrace_data() if the level is high enough. 258*0e209d39SAndroid Build Coastguard Worker * @internal 259*0e209d39SAndroid Build Coastguard Worker */ 260*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA2(level, fmt, a, b) UPRV_BLOCK_MACRO_BEGIN { \ 261*0e209d39SAndroid Build Coastguard Worker if(UTRACE_LEVEL(level)) { \ 262*0e209d39SAndroid Build Coastguard Worker utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY , (level), (fmt), (a), (b)); \ 263*0e209d39SAndroid Build Coastguard Worker } \ 264*0e209d39SAndroid Build Coastguard Worker } UPRV_BLOCK_MACRO_END 265*0e209d39SAndroid Build Coastguard Worker 266*0e209d39SAndroid Build Coastguard Worker /** 267*0e209d39SAndroid Build Coastguard Worker * Trace statement used inside functions that have a UTRACE_ENTRY() statement. 268*0e209d39SAndroid Build Coastguard Worker * Takes three data arguments. 269*0e209d39SAndroid Build Coastguard Worker * The number of arguments for this macro must match the number of inserts 270*0e209d39SAndroid Build Coastguard Worker * in the format string. Vector inserts count as two arguments. 271*0e209d39SAndroid Build Coastguard Worker * Calls utrace_data() if the level is high enough. 272*0e209d39SAndroid Build Coastguard Worker * @internal 273*0e209d39SAndroid Build Coastguard Worker */ 274*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA3(level, fmt, a, b, c) UPRV_BLOCK_MACRO_BEGIN { \ 275*0e209d39SAndroid Build Coastguard Worker if(UTRACE_LEVEL(level)) { \ 276*0e209d39SAndroid Build Coastguard Worker utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (level), (fmt), (a), (b), (c)); \ 277*0e209d39SAndroid Build Coastguard Worker } \ 278*0e209d39SAndroid Build Coastguard Worker } UPRV_BLOCK_MACRO_END 279*0e209d39SAndroid Build Coastguard Worker 280*0e209d39SAndroid Build Coastguard Worker /** 281*0e209d39SAndroid Build Coastguard Worker * Trace statement used inside functions that have a UTRACE_ENTRY() statement. 282*0e209d39SAndroid Build Coastguard Worker * Takes four data arguments. 283*0e209d39SAndroid Build Coastguard Worker * The number of arguments for this macro must match the number of inserts 284*0e209d39SAndroid Build Coastguard Worker * in the format string. Vector inserts count as two arguments. 285*0e209d39SAndroid Build Coastguard Worker * Calls utrace_data() if the level is high enough. 286*0e209d39SAndroid Build Coastguard Worker * @internal 287*0e209d39SAndroid Build Coastguard Worker */ 288*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA4(level, fmt, a, b, c, d) UPRV_BLOCK_MACRO_BEGIN { \ 289*0e209d39SAndroid Build Coastguard Worker if(UTRACE_LEVEL(level)) { \ 290*0e209d39SAndroid Build Coastguard Worker utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (level), (fmt), (a), (b), (c), (d)); \ 291*0e209d39SAndroid Build Coastguard Worker } \ 292*0e209d39SAndroid Build Coastguard Worker } UPRV_BLOCK_MACRO_END 293*0e209d39SAndroid Build Coastguard Worker 294*0e209d39SAndroid Build Coastguard Worker /** 295*0e209d39SAndroid Build Coastguard Worker * Trace statement used inside functions that have a UTRACE_ENTRY() statement. 296*0e209d39SAndroid Build Coastguard Worker * Takes five data arguments. 297*0e209d39SAndroid Build Coastguard Worker * The number of arguments for this macro must match the number of inserts 298*0e209d39SAndroid Build Coastguard Worker * in the format string. Vector inserts count as two arguments. 299*0e209d39SAndroid Build Coastguard Worker * Calls utrace_data() if the level is high enough. 300*0e209d39SAndroid Build Coastguard Worker * @internal 301*0e209d39SAndroid Build Coastguard Worker */ 302*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA5(level, fmt, a, b, c, d, e) UPRV_BLOCK_MACRO_BEGIN { \ 303*0e209d39SAndroid Build Coastguard Worker if(UTRACE_LEVEL(level)) { \ 304*0e209d39SAndroid Build Coastguard Worker utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (level), (fmt), (a), (b), (c), (d), (e)); \ 305*0e209d39SAndroid Build Coastguard Worker } \ 306*0e209d39SAndroid Build Coastguard Worker } UPRV_BLOCK_MACRO_END 307*0e209d39SAndroid Build Coastguard Worker 308*0e209d39SAndroid Build Coastguard Worker /** 309*0e209d39SAndroid Build Coastguard Worker * Trace statement used inside functions that have a UTRACE_ENTRY() statement. 310*0e209d39SAndroid Build Coastguard Worker * Takes six data arguments. 311*0e209d39SAndroid Build Coastguard Worker * The number of arguments for this macro must match the number of inserts 312*0e209d39SAndroid Build Coastguard Worker * in the format string. Vector inserts count as two arguments. 313*0e209d39SAndroid Build Coastguard Worker * Calls utrace_data() if the level is high enough. 314*0e209d39SAndroid Build Coastguard Worker * @internal 315*0e209d39SAndroid Build Coastguard Worker */ 316*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA6(level, fmt, a, b, c, d, e, f) UPRV_BLOCK_MACRO_BEGIN { \ 317*0e209d39SAndroid Build Coastguard Worker if(UTRACE_LEVEL(level)) { \ 318*0e209d39SAndroid Build Coastguard Worker utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (level), (fmt), (a), (b), (c), (d), (e), (f)); \ 319*0e209d39SAndroid Build Coastguard Worker } \ 320*0e209d39SAndroid Build Coastguard Worker } UPRV_BLOCK_MACRO_END 321*0e209d39SAndroid Build Coastguard Worker 322*0e209d39SAndroid Build Coastguard Worker /** 323*0e209d39SAndroid Build Coastguard Worker * Trace statement used inside functions that have a UTRACE_ENTRY() statement. 324*0e209d39SAndroid Build Coastguard Worker * Takes seven data arguments. 325*0e209d39SAndroid Build Coastguard Worker * The number of arguments for this macro must match the number of inserts 326*0e209d39SAndroid Build Coastguard Worker * in the format string. Vector inserts count as two arguments. 327*0e209d39SAndroid Build Coastguard Worker * Calls utrace_data() if the level is high enough. 328*0e209d39SAndroid Build Coastguard Worker * @internal 329*0e209d39SAndroid Build Coastguard Worker */ 330*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA7(level, fmt, a, b, c, d, e, f, g) UPRV_BLOCK_MACRO_BEGIN { \ 331*0e209d39SAndroid Build Coastguard Worker if(UTRACE_LEVEL(level)) { \ 332*0e209d39SAndroid Build Coastguard Worker utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (level), (fmt), (a), (b), (c), (d), (e), (f), (g)); \ 333*0e209d39SAndroid Build Coastguard Worker } \ 334*0e209d39SAndroid Build Coastguard Worker } UPRV_BLOCK_MACRO_END 335*0e209d39SAndroid Build Coastguard Worker 336*0e209d39SAndroid Build Coastguard Worker /** 337*0e209d39SAndroid Build Coastguard Worker * Trace statement used inside functions that have a UTRACE_ENTRY() statement. 338*0e209d39SAndroid Build Coastguard Worker * Takes eight data arguments. 339*0e209d39SAndroid Build Coastguard Worker * The number of arguments for this macro must match the number of inserts 340*0e209d39SAndroid Build Coastguard Worker * in the format string. Vector inserts count as two arguments. 341*0e209d39SAndroid Build Coastguard Worker * Calls utrace_data() if the level is high enough. 342*0e209d39SAndroid Build Coastguard Worker * @internal 343*0e209d39SAndroid Build Coastguard Worker */ 344*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA8(level, fmt, a, b, c, d, e, f, g, h) UPRV_BLOCK_MACRO_BEGIN { \ 345*0e209d39SAndroid Build Coastguard Worker if(UTRACE_LEVEL(level)) { \ 346*0e209d39SAndroid Build Coastguard Worker utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (level), (fmt), (a), (b), (c), (d), (e), (f), (g), (h)); \ 347*0e209d39SAndroid Build Coastguard Worker } \ 348*0e209d39SAndroid Build Coastguard Worker } UPRV_BLOCK_MACRO_END 349*0e209d39SAndroid Build Coastguard Worker 350*0e209d39SAndroid Build Coastguard Worker /** 351*0e209d39SAndroid Build Coastguard Worker * Trace statement used inside functions that have a UTRACE_ENTRY() statement. 352*0e209d39SAndroid Build Coastguard Worker * Takes nine data arguments. 353*0e209d39SAndroid Build Coastguard Worker * The number of arguments for this macro must match the number of inserts 354*0e209d39SAndroid Build Coastguard Worker * in the format string. Vector inserts count as two arguments. 355*0e209d39SAndroid Build Coastguard Worker * Calls utrace_data() if the level is high enough. 356*0e209d39SAndroid Build Coastguard Worker * @internal 357*0e209d39SAndroid Build Coastguard Worker */ 358*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA9(level, fmt, a, b, c, d, e, f, g, h, i) UPRV_BLOCK_MACRO_BEGIN { \ 359*0e209d39SAndroid Build Coastguard Worker if(UTRACE_LEVEL(level)) { \ 360*0e209d39SAndroid Build Coastguard Worker utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (level), (fmt), (a), (b), (c), (d), (e), (f), (g), (h), (i)); \ 361*0e209d39SAndroid Build Coastguard Worker } \ 362*0e209d39SAndroid Build Coastguard Worker } UPRV_BLOCK_MACRO_END 363*0e209d39SAndroid Build Coastguard Worker 364*0e209d39SAndroid Build Coastguard Worker #else 365*0e209d39SAndroid Build Coastguard Worker 366*0e209d39SAndroid Build Coastguard Worker /* 367*0e209d39SAndroid Build Coastguard Worker * When tracing is disabled, the following macros become empty 368*0e209d39SAndroid Build Coastguard Worker */ 369*0e209d39SAndroid Build Coastguard Worker 370*0e209d39SAndroid Build Coastguard Worker #define UTRACE_LEVEL(level) 0 371*0e209d39SAndroid Build Coastguard Worker #define UTRACE_ENTRY(fnNumber) 372*0e209d39SAndroid Build Coastguard Worker #define UTRACE_ENTRY_OC(fnNumber) 373*0e209d39SAndroid Build Coastguard Worker #define UTRACE_EXIT() 374*0e209d39SAndroid Build Coastguard Worker #define UTRACE_EXIT_VALUE(val) 375*0e209d39SAndroid Build Coastguard Worker #define UTRACE_EXIT_STATUS(status) 376*0e209d39SAndroid Build Coastguard Worker #define UTRACE_EXIT_VALUE_STATUS(val, status) 377*0e209d39SAndroid Build Coastguard Worker #define UTRACE_EXIT_PTR_STATUS(ptr, status) 378*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA0(level, fmt) 379*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA1(level, fmt, a) 380*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA2(level, fmt, a, b) 381*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA3(level, fmt, a, b, c) 382*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA4(level, fmt, a, b, c, d) 383*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA5(level, fmt, a, b, c, d, e) 384*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA6(level, fmt, a, b, c, d, e, f) 385*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA7(level, fmt, a, b, c, d, e, f, g) 386*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA8(level, fmt, a, b, c, d, e, f, g, h) 387*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA9(level, fmt, a, b, c, d, e, f, g, h, i) 388*0e209d39SAndroid Build Coastguard Worker 389*0e209d39SAndroid Build Coastguard Worker #endif 390*0e209d39SAndroid Build Coastguard Worker 391*0e209d39SAndroid Build Coastguard Worker #endif 392