840 lines
49 KiB
C
840 lines
49 KiB
C
|
/**INC+**********************************************************************/
|
||
|
/* Header: atrcapi.h */
|
||
|
/* */
|
||
|
/* Purpose: tracing API header */
|
||
|
/* */
|
||
|
/* Copyright(C) Microsoft Corporation 1997 */
|
||
|
/* */
|
||
|
/****************************************************************************/
|
||
|
/** Changes:
|
||
|
* $Log: Y:/logs/h/dcl/atrcapi.h_v $
|
||
|
*
|
||
|
* Rev 1.12 05 Sep 1997 10:36:56 SJ
|
||
|
* SFR1334: Zippy enhancements
|
||
|
*
|
||
|
* Rev 1.11 01 Sep 1997 19:44:04 SJ
|
||
|
* SFR1333: win16 trace DLL fails to set its default trace options
|
||
|
*
|
||
|
* Rev 1.10 28 Aug 1997 14:46:08 SJ
|
||
|
* SFR1004: Use new trace groups - modify zippy accordingly
|
||
|
*
|
||
|
* Rev 1.9 22 Aug 1997 15:10:20 SJ
|
||
|
* SFR1291: Win16 Trace DLL doesn't write integers to ini file properly
|
||
|
*
|
||
|
* Rev 1.8 19 Aug 1997 10:58:26 SJ
|
||
|
* SFR1219: UT_Malloc and UT_Free tracing is confusing
|
||
|
*
|
||
|
* Rev 1.7 31 Jul 1997 19:40:38 SJ
|
||
|
* SFR1041: Port zippy to Win16
|
||
|
*
|
||
|
* Rev 1.6 14 Jul 1997 12:47:36 SJ
|
||
|
* SFR1004: Use new trace groups
|
||
|
*
|
||
|
* Rev 1.5 09 Jul 1997 17:05:00 AK
|
||
|
* SFR1016: Initial changes to support Unicode
|
||
|
**/
|
||
|
/**INC-**********************************************************************/
|
||
|
#ifndef _H_ATRCAPI
|
||
|
#define _H_ATRCAPI
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif /* __cplusplus */
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* */
|
||
|
/* CONSTANTS */
|
||
|
/* */
|
||
|
/****************************************************************************/
|
||
|
/****************************************************************************/
|
||
|
/* Define the trace level. */
|
||
|
/* */
|
||
|
/* TRC_LEVEL_DBG : All tracing is enabled */
|
||
|
/* TRC_LEVEL_NRM : Debug level tracing is disabled */
|
||
|
/* TRC_LEVEL_ALT : Normal and debug level tracing is disabled */
|
||
|
/* TRC_LEVEL_ERR : Alert, normal and debug level tracing is */
|
||
|
/* disabled */
|
||
|
/* TRC_LEVEL_ASSERT : Error, alert, normal and debug level tracing */
|
||
|
/* is disabled */
|
||
|
/* TRC_LEVEL_DIS : All tracing is disabled. */
|
||
|
/****************************************************************************/
|
||
|
#define TRC_LEVEL_DBG 0
|
||
|
#define TRC_LEVEL_NRM 1
|
||
|
#define TRC_LEVEL_ALT 2
|
||
|
#define TRC_LEVEL_ERR 3
|
||
|
#define TRC_LEVEL_ASSERT 4
|
||
|
#define TRC_LEVEL_DIS 5
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* Trace type for profile tracing (function entry / exit) */
|
||
|
/****************************************************************************/
|
||
|
#define TRC_PROFILE_TRACE 8
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* Tracing can be switched off at compile time to allow for 'debug' and */
|
||
|
/* 'retail' versions of the product. The following macros disable specific */
|
||
|
/* trace processing. */
|
||
|
/* */
|
||
|
/* TRC_ENABLE_DBG - Enable debug tracing */
|
||
|
/* TRC_ENABLE_NRM - Enable normal tracing */
|
||
|
/* TRC_ENABLE_ALT - Enable alert tracing */
|
||
|
/* TRC_ENABLE_ERR - Enable error tracing */
|
||
|
/* TRC_ENABLE_ASSERT - Enable assert tracing */
|
||
|
/* TRC_ENABLE_PRF - Enable function profile tracing */
|
||
|
/****************************************************************************/
|
||
|
#if (TRC_CL == TRC_LEVEL_DBG)
|
||
|
#define TRC_ENABLE_DBG
|
||
|
#define TRC_ENABLE_NRM
|
||
|
#define TRC_ENABLE_ALT
|
||
|
#define TRC_ENABLE_ERR
|
||
|
#define TRC_ENABLE_ASSERT
|
||
|
#endif
|
||
|
|
||
|
#if (TRC_CL == TRC_LEVEL_NRM)
|
||
|
#define TRC_ENABLE_NRM
|
||
|
#define TRC_ENABLE_ALT
|
||
|
#define TRC_ENABLE_ERR
|
||
|
#define TRC_ENABLE_ASSERT
|
||
|
#endif
|
||
|
|
||
|
#if (TRC_CL == TRC_LEVEL_ALT)
|
||
|
#define TRC_ENABLE_ALT
|
||
|
#define TRC_ENABLE_ERR
|
||
|
#define TRC_ENABLE_ASSERT
|
||
|
#endif
|
||
|
|
||
|
#if (TRC_CL == TRC_LEVEL_ERR)
|
||
|
#define TRC_ENABLE_ERR
|
||
|
#define TRC_ENABLE_ASSERT
|
||
|
#endif
|
||
|
|
||
|
#if (TRC_CL == TRC_LEVEL_ASSERT)
|
||
|
#define TRC_ENABLE_ASSERT
|
||
|
#endif
|
||
|
|
||
|
#ifdef TRC_CP
|
||
|
#define TRC_ENABLE_PRF
|
||
|
#endif
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* Component groups. These are as follows: */
|
||
|
/* */
|
||
|
/* Client side: */
|
||
|
/* TRC_GROUP_NETWORK : Network layer */
|
||
|
/* TRC_GROUP_SECURITY : Security layer */
|
||
|
/* TRC_GROUP_CORE : The core */
|
||
|
/* TRC_GROUP_UI : User Interface */
|
||
|
/* TRC_GROUP_UTILITIES : Utilities */
|
||
|
/* TRC_GROUP_UNUSEDx : UNUSED */
|
||
|
/* TRC_GROUP_TRACE */
|
||
|
/* */
|
||
|
/****************************************************************************/
|
||
|
#define TRC_GROUP_NETWORK DCFLAGN(0)
|
||
|
#define TRC_GROUP_SECURITY DCFLAGN(1)
|
||
|
#define TRC_GROUP_CORE DCFLAGN(2)
|
||
|
#define TRC_GROUP_UI DCFLAGN(3)
|
||
|
#define TRC_GROUP_UTILITIES DCFLAGN(4)
|
||
|
#define TRC_GROUP_UNUSED1 DCFLAGN(5)
|
||
|
#define TRC_GROUP_UNUSED2 DCFLAGN(6)
|
||
|
#define TRC_GROUP_UNUSED3 DCFLAGN(7)
|
||
|
#define TRC_GROUP_UNUSED4 DCFLAGN(8)
|
||
|
#define TRC_GROUP_UNUSED5 DCFLAGN(9)
|
||
|
#define TRC_GROUP_TRACE DCFLAGN(10)
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* TRC_GROUP must be defined - if it is not defined then display an error. */
|
||
|
/****************************************************************************/
|
||
|
#ifndef TRC_GROUP
|
||
|
#error TRC_GROUP must be defined
|
||
|
#endif /* ifndef TRC_GROUP */
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* Trace option flags. These set various tracing options as follows: */
|
||
|
/* */
|
||
|
/* TRC_OPT_BREAK_ON_ERROR : Break to the debugger on an error. */
|
||
|
/* TRC_OPT_BEEP_ON_ERROR : Beep on an error. */
|
||
|
/* TRC_OPT_FILE_OUTPUT : Direct trace output to a disk file. */
|
||
|
/* TRC_OPT_DEBUGGER_OUTPUT : Direct trace output to the debugger. */
|
||
|
/* TRC_OPT_FLUSH_ON_TRACE : Flush each trace line to the disk file. */
|
||
|
/* TRC_OPT_PROFILE_TRACING : Enable profile tracing. */
|
||
|
/* TRC_OPT_STACK_TRACING : Enable stack tracing. */
|
||
|
/* TRC_OPT_PROCESS_ID : Display the process ID on every trace line.*/
|
||
|
/* TRC_OPT_THREAD_ID : Display the thread (Win32 only) on every */
|
||
|
/* trace line. */
|
||
|
/* TRC_OPT_TIME_STAMP : Display the time stamp on every line. */
|
||
|
/* TRC_OPT_RELATIVE_TIME_STAMP : (Reserved) Display the relative time. */
|
||
|
/* TRC_OPT_BREAK_ON_ASSERT : Break to the debugger on ASSERTS */
|
||
|
/****************************************************************************/
|
||
|
#define TRC_OPT_BREAK_ON_ERROR DCFLAG32(0)
|
||
|
#define TRC_OPT_BEEP_ON_ERROR DCFLAG32(1)
|
||
|
#define TRC_OPT_FILE_OUTPUT DCFLAG32(2)
|
||
|
#define TRC_OPT_DEBUGGER_OUTPUT DCFLAG32(3)
|
||
|
#define TRC_OPT_FLUSH_ON_TRACE DCFLAG32(4)
|
||
|
#define TRC_OPT_PROFILE_TRACING DCFLAG32(5)
|
||
|
#define TRC_OPT_STACK_TRACING DCFLAG32(6)
|
||
|
#define TRC_OPT_PROCESS_ID DCFLAG32(7)
|
||
|
#define TRC_OPT_THREAD_ID DCFLAG32(8)
|
||
|
#define TRC_OPT_TIME_STAMP DCFLAG32(9)
|
||
|
#define TRC_OPT_RELATIVE_TIME_STAMP DCFLAG32(10)
|
||
|
#define TRC_OPT_BREAK_ON_ASSERT DCFLAG32(11)
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* Character versions of the maximum and minimum trace levels. */
|
||
|
/****************************************************************************/
|
||
|
#define TRC_LEVEL_MIN_CHAR '0'
|
||
|
#define TRC_LEVEL_MAX_CHAR '5'
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* Character for function entry / exit tracing. */
|
||
|
/****************************************************************************/
|
||
|
#define TRC_LEVEL_PRF_CHAR 'P'
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* The TRC_TEST macro can be compiled in or out. When compiled in, it is */
|
||
|
/* equivalent to TRC_DBG. It is normally compiled out. To compile it in, */
|
||
|
/* define TRC_ENABLE_TST. */
|
||
|
/****************************************************************************/
|
||
|
#ifdef TRC_ENABLE_TST
|
||
|
#define TRC_TST TRC_DBG
|
||
|
#else
|
||
|
#define TRC_TST(x)
|
||
|
#endif /* TRC_ENABLE_TST */
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* The trace function naming macro. */
|
||
|
/****************************************************************************/
|
||
|
#if (TRC_CL < TRC_LEVEL_DIS)
|
||
|
#define TRC_FN(A) static const DCTCHAR __fnname[] = _T(A); \
|
||
|
PDCTCHAR trc_fn = (PDCTCHAR)__fnname; \
|
||
|
PDCTCHAR trc_file = _file_name_;
|
||
|
#else
|
||
|
#define TRC_FN(A)
|
||
|
#endif
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* Entry and exit trace macros. */
|
||
|
/****************************************************************************/
|
||
|
#define TRC_ENTRY TRC_PRF((TB, TEXT("Enter {")));
|
||
|
#define TRC_EXIT TRC_PRF((TB, TEXT("Exit }")));
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* Trace buffer definition. */
|
||
|
/* see TRCX below */
|
||
|
/* the second parameter is the length of the output buffer in characters */
|
||
|
/* (TRC_LINE_BUFFER_SIZE) */
|
||
|
/****************************************************************************/
|
||
|
#define TB TRC_GetBuffer(), 255
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* Internal buffer sizes. */
|
||
|
/* */
|
||
|
/* TRC_PREFIX_LIST_SIZE : the length of the prefix string */
|
||
|
/* TRC_LINE_BUFFER_SIZE : the length of the raw trace string as output by */
|
||
|
/* an application */
|
||
|
/* TRC_FRMT_BUFFER_SIZE : the length of the formatted trace string */
|
||
|
/* buffer - this includes the time, process ID, */
|
||
|
/* thread ID and function name - It must be longer */
|
||
|
/* than TRC_LINE_BUFFER_SIZE */
|
||
|
/* TRC_FILE_NAME_SIZE : the maximum length of the fully qualified */
|
||
|
/* trace output file name. */
|
||
|
/****************************************************************************/
|
||
|
#define TRC_PREFIX_LIST_SIZE 100
|
||
|
#define TRC_LINE_BUFFER_SIZE 256
|
||
|
#define TRC_FRMT_BUFFER_SIZE 400
|
||
|
#define TRC_FILE_NAME_SIZE DC_MAX_PATH
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* The number of trace files. This must be set to 2 - any other number is */
|
||
|
/* not supported. */
|
||
|
/****************************************************************************/
|
||
|
#define TRC_NUM_FILES 2
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* The minimum and maximum file sizes. */
|
||
|
/* In Win32, the trace DLL will fail to initialize if the file size is set */
|
||
|
/* to zero or to too high a value. */
|
||
|
/* Go for 1 Kb to 32 Meg. */
|
||
|
/****************************************************************************/
|
||
|
#define TRC_MIN_TRC_FILE_SIZE (0x400)
|
||
|
#define TRC_MAX_TRC_FILE_SIZE (0x2000000)
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* Defaults */
|
||
|
/****************************************************************************/
|
||
|
/****************************************************************************/
|
||
|
/* This is a copy of the comment in TRCSetDefaults, which should be updated */
|
||
|
/* whenever these defaults change. */
|
||
|
/* */
|
||
|
/* We set the following things: */
|
||
|
/* */
|
||
|
/* - trace level to Alert. */
|
||
|
/* - enable all component groups. */
|
||
|
/* - remove all prefixes. */
|
||
|
/* - set the maximum trace file size to the default value. */
|
||
|
/* - set the data truncation size to the default value. */
|
||
|
/* - set the function name size to the default value. */
|
||
|
/* - enable the beep and file flags. */
|
||
|
/* - set the first trace file name to TRC1.TXT */
|
||
|
/* - set the second trace file name to TRC2.TXT */
|
||
|
/* In Win32, additionally */
|
||
|
/* - set time stamp */
|
||
|
/* - set process ID */
|
||
|
/* - set thread ID */
|
||
|
/* */
|
||
|
/****************************************************************************/
|
||
|
#define TRC_DEFAULT_MAX_FILE_SIZE (100000)
|
||
|
#define TRC_DEFAULT_FUNC_NAME_LENGTH (12)
|
||
|
#define TRC_DEFAULT_DATA_TRUNC_SIZE (64)
|
||
|
#define TRC_DEFAULT_PREFIX_LIST (0)
|
||
|
#define TRC_DEFAULT_COMPONENTS (0xFFFFFFFF)
|
||
|
#ifdef OS_WIN32
|
||
|
#ifdef OS_WINCE
|
||
|
#define TRC_DEFAULT_FLAGS (TRC_OPT_BEEP_ON_ERROR | \
|
||
|
TRC_OPT_DEBUGGER_OUTPUT | \
|
||
|
TRC_OPT_THREAD_ID | \
|
||
|
TRC_OPT_TIME_STAMP )
|
||
|
#else // OS_WINCE
|
||
|
#define TRC_DEFAULT_FLAGS (TRC_OPT_BEEP_ON_ERROR | \
|
||
|
TRC_OPT_DEBUGGER_OUTPUT | \
|
||
|
TRC_OPT_FILE_OUTPUT | \
|
||
|
TRC_OPT_PROCESS_ID | \
|
||
|
TRC_OPT_THREAD_ID | \
|
||
|
TRC_OPT_TIME_STAMP )
|
||
|
#endif // OS_WINCE
|
||
|
#else ifdef OS_WIN16
|
||
|
#define TRC_DEFAULT_FLAGS (TRC_OPT_BEEP_ON_ERROR | \
|
||
|
TRC_OPT_DEBUGGER_OUTPUT | \
|
||
|
TRC_OPT_FILE_OUTPUT )
|
||
|
#endif
|
||
|
|
||
|
#define TRC_DEFAULT_TRACE_LEVEL (TRC_LEVEL_ALT)
|
||
|
#define TRC_DEFAULT_FILE_NAME0 (_T("TRC1.TXT"))
|
||
|
#define TRC_DEFAULT_FILE_NAME1 (_T("TRC2.TXT"))
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* */
|
||
|
/* TYPEDEFS */
|
||
|
/* */
|
||
|
/****************************************************************************/
|
||
|
/****************************************************************************/
|
||
|
/* TRC_CONFIG */
|
||
|
/* ========== */
|
||
|
/* This structure stores information about the current trace configuration. */
|
||
|
/* */
|
||
|
/* traceLevel : the current trace level. */
|
||
|
/* components : currently enabled component groups. */
|
||
|
/* maxFileSize : the maximum trace file size. */
|
||
|
/* dataTruncSize : the amount of data that can be traced at a time. */
|
||
|
/* flags : trace flags. */
|
||
|
/* funcNameLength : number of characters of the function name traced to */
|
||
|
/* the output file. */
|
||
|
/* prefixList : a list of prefixes. */
|
||
|
/* fileNames : the name of the trace files. */
|
||
|
/* */
|
||
|
/****************************************************************************/
|
||
|
typedef struct tagTRC_CONFIG
|
||
|
{
|
||
|
DCUINT32 traceLevel;
|
||
|
DCUINT32 dataTruncSize;
|
||
|
DCUINT32 funcNameLength;
|
||
|
DCUINT32 components;
|
||
|
DCUINT32 maxFileSize;
|
||
|
DCUINT32 flags;
|
||
|
DCTCHAR prefixList[TRC_PREFIX_LIST_SIZE];
|
||
|
DCTCHAR fileNames[TRC_NUM_FILES][TRC_FILE_NAME_SIZE];
|
||
|
} TRC_CONFIG;
|
||
|
|
||
|
typedef TRC_CONFIG DCPTR PTRC_CONFIG;
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* */
|
||
|
/* MACROS */
|
||
|
/* */
|
||
|
/****************************************************************************/
|
||
|
/****************************************************************************/
|
||
|
/* STANDARD TRACING AND ASSERTION MACROS */
|
||
|
/* */
|
||
|
/* TRC_ASSERT is for internal assertions and traces an error before popping */
|
||
|
/* up a message box and then terminating. It is not NLS enabled and should */
|
||
|
/* only be used for calls from one DC component to another. External APIs */
|
||
|
/* must not use TRC_ASSERT. */
|
||
|
/* */
|
||
|
/* TRC_ABORT is used on logically unreachable paths (for example */
|
||
|
/* the default brach of a switch which should cover all cases already). */
|
||
|
/* */
|
||
|
/* A typical trace statement will have the form: */
|
||
|
/* */
|
||
|
/* TRC_NRM((TB, _T("Hello world: %hu"), worldNumber)); */
|
||
|
/* */
|
||
|
/* The following macros either expand this to: */
|
||
|
/* */
|
||
|
/* TRCX(TRC_LEVEL_NRM, (TB, _T("Hello world: %hu"), worldNumber)); */
|
||
|
/* */
|
||
|
/* if normal level tracing is enabled or ignore it if normal level tracing */
|
||
|
/* is disabled. */
|
||
|
/* */
|
||
|
/****************************************************************************/
|
||
|
#ifdef TRC_ENABLE_DBG
|
||
|
#define TRC_DBG(string) TRCX(TRC_LEVEL_DBG, string)
|
||
|
#else
|
||
|
#define TRC_DBG(string)
|
||
|
#endif
|
||
|
|
||
|
#ifdef TRC_ENABLE_NRM
|
||
|
#define TRC_NRM(string) TRCX(TRC_LEVEL_NRM, string)
|
||
|
#else
|
||
|
#define TRC_NRM(string)
|
||
|
#endif
|
||
|
|
||
|
#ifdef TRC_ENABLE_ALT
|
||
|
#define TRC_ALT(string) TRCX(TRC_LEVEL_ALT, string)
|
||
|
#else
|
||
|
#define TRC_ALT(string)
|
||
|
#endif
|
||
|
|
||
|
#ifdef TRC_ENABLE_ERR
|
||
|
#define TRC_ERR(string) TRCX(TRC_LEVEL_ERR, string)
|
||
|
#else
|
||
|
#define TRC_ERR(string)
|
||
|
#endif
|
||
|
|
||
|
#ifdef TRC_ENABLE_ASSERT
|
||
|
#define TRC_ASSERT(condition, string) \
|
||
|
if (!(condition)) TRCX(TRC_LEVEL_ASSERT, string)
|
||
|
#define TRC_ABORT(string) TRCX(TRC_LEVEL_ASSERT, string)
|
||
|
#else
|
||
|
#define TRC_ASSERT(condition, string)
|
||
|
#define TRC_ABORT(string)
|
||
|
#endif
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* Function profile (entry/exit) tracing. */
|
||
|
/****************************************************************************/
|
||
|
#ifdef TRC_ENABLE_PRF
|
||
|
#define TRC_PRF(string) TRCP(string)
|
||
|
#else
|
||
|
#define TRC_PRF(string)
|
||
|
#endif
|
||
|
|
||
|
VOID TRCSaferSprintf(PDCTCHAR outBuf, UINT cchLen, const PDCTCHAR format,...);
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* Now define the actual tracing macro, TRCX. This macro compares the */
|
||
|
/* tracer's level against the global trace level. If the tracer's level is */
|
||
|
/* the same or higher than the global trace level then we: */
|
||
|
/* */
|
||
|
/* - print the 'string' which is in the form: */
|
||
|
/* (TB, _T("Hello world %hu"), worldNumber) which expands to */
|
||
|
/* (TRC_BufferGet(), "Hello world %hu", worldNumber) */
|
||
|
/* - call TRC_BufferTrace to actually trace the line out. */
|
||
|
/* */
|
||
|
/* Note that TRC_BufferGet() also grabs the mutex to prevent other threads */
|
||
|
/* from pre-empting us while we are tracing and that TRC_BufferTrace() will */
|
||
|
/* free the mutex for us once the trace line has been written. */
|
||
|
/****************************************************************************/
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* Use the comma operator to make sure that TRCX macros to an Lvalue. */
|
||
|
/* The innermost trc_fn is simply there to ensure that the whole expression */
|
||
|
/* is assignable. It can be replaced by any other variable, if need be. */
|
||
|
/****************************************************************************/
|
||
|
#if !defined(TRC_CONVERTOANSI)
|
||
|
#define TRCX(level, string) \
|
||
|
( \
|
||
|
(level >= TRC_GetTraceLevel()) ? \
|
||
|
( \
|
||
|
(TRCSaferSprintf string, \
|
||
|
TRC_TraceBuffer(level, TRC_GROUP, (DCUINT)__LINE__, trc_fn, trc_file),\
|
||
|
trc_fn) \
|
||
|
) \
|
||
|
: \
|
||
|
0 \
|
||
|
)
|
||
|
|
||
|
#define TRCP(string) \
|
||
|
{ \
|
||
|
if (TRC_ProfileTraceEnabled()) \
|
||
|
{ \
|
||
|
TRCSaferSprintf string, \
|
||
|
TRC_TraceBuffer(TRC_PROFILE_TRACE, \
|
||
|
TRC_GROUP, \
|
||
|
(DCUINT)__LINE__, \
|
||
|
trc_fn, \
|
||
|
trc_file); \
|
||
|
} \
|
||
|
}
|
||
|
#else
|
||
|
#define TRCX(level, string) \
|
||
|
( \
|
||
|
(level >= TRC_GetTraceLevel()) ? \
|
||
|
( \
|
||
|
( \
|
||
|
TRC_ConvertAndSprintf string, \
|
||
|
TRC_TraceBuffer(level, TRC_GROUP, (DCUINT)__LINE__, trc_fn, trc_file),\
|
||
|
trc_fn) \
|
||
|
) \
|
||
|
: \
|
||
|
0 \
|
||
|
)
|
||
|
|
||
|
#define TRCP(string) \
|
||
|
{ \
|
||
|
if (TRC_ProfileTraceEnabled()) \
|
||
|
{ \
|
||
|
TRC_ConvertAndSprintf string; \
|
||
|
TRC_TraceBuffer(TRC_PROFILE_TRACE, \
|
||
|
TRC_GROUP, \
|
||
|
(DCUINT)__LINE__, \
|
||
|
trc_fn, \
|
||
|
trc_file); \
|
||
|
} \
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* TRACE DATA MACROS */
|
||
|
/* */
|
||
|
/* These are very similar to the standard tracing macros defined above */
|
||
|
/* except that they do not accept a variable number of parameters. */
|
||
|
/* */
|
||
|
/* A typical ObMan data trace line will have the form: */
|
||
|
/* */
|
||
|
/* TRC_DATA_NRM("Some data", pData, sizeof(SOME_DATA)); */
|
||
|
/* */
|
||
|
/* If the appropriate level of tracing is enabled (normal in this case) */
|
||
|
/* then this line will be expanded by the following macros to: */
|
||
|
/* */
|
||
|
/* TRCX_DATA(TRC_GROUP_OBMAN, TRC_LEVEL_NRM, "Some data", pData, size); */
|
||
|
/* */
|
||
|
/****************************************************************************/
|
||
|
#ifdef TRC_ENABLE_DBG
|
||
|
#define TRC_DATA_DBG(string, buffer, length) \
|
||
|
TRCX_DATA(TRC_GROUP, TRC_LEVEL_DBG, _T(string), buffer, length)
|
||
|
#else
|
||
|
#define TRC_DATA_DBG(string, buffer, length)
|
||
|
#endif
|
||
|
|
||
|
#ifdef TRC_ENABLE_NRM
|
||
|
#define TRC_DATA_NRM(string, buffer, length) \
|
||
|
TRCX_DATA(TRC_GROUP, TRC_LEVEL_NRM, _T(string), buffer, length)
|
||
|
#else
|
||
|
#define TRC_DATA_NRM(string, buffer, length)
|
||
|
#endif
|
||
|
|
||
|
#ifdef TRC_ENABLE_ALT
|
||
|
#define TRC_DATA_ALT(string, buffer, length) \
|
||
|
TRCX_DATA(TRC_GROUP, TRC_LEVEL_ALT, _T(string), buffer, length)
|
||
|
#else
|
||
|
#define TRC_DATA_ALT(string, buffer, length)
|
||
|
#endif
|
||
|
|
||
|
#ifdef TRC_ENABLE_ERR
|
||
|
#define TRC_DATA_ERR(string, buffer, length) \
|
||
|
TRCX_DATA(TRC_GROUP, TRC_LEVEL_ERR, _T(string), buffer, length)
|
||
|
#else
|
||
|
#define TRC_DATA_ERR(string, buffer, length)
|
||
|
#endif
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* Network, TDD and Obman trace data macros - these are just normal level */
|
||
|
/* data tracing. */
|
||
|
/****************************************************************************/
|
||
|
#ifdef TRC_ENABLE_NRM
|
||
|
#define TRC_DATA_NET(string, buffer, length) \
|
||
|
TRCX_DATA(TRC_GROUP_NETDATA, TRC_LEVEL_NRM, string, buffer, length)
|
||
|
#define TRC_DATA_TDD(string, buffer, length) \
|
||
|
TRCX_DATA(TRC_GROUP_TDDDATA, TRC_LEVEL_NRM, string, buffer, length)
|
||
|
#define TRC_DATA_OBMAN(string, buffer, length) \
|
||
|
TRCX_DATA(TRC_GROUP_OBMANDATA, TRC_LEVEL_NRM, string, buffer, length)
|
||
|
#else
|
||
|
#define TRC_DATA_NET(string, buffer, length)
|
||
|
#define TRC_DATA_TDD(string, buffer, length)
|
||
|
#define TRC_DATA_OBMAN(string, buffer, length)
|
||
|
#endif
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* Define the trace data macro. This is used for tracing data blocks. */
|
||
|
/****************************************************************************/
|
||
|
#define TRCX_DATA(group, level, string, buffer, length) \
|
||
|
{ \
|
||
|
if (level >= TRC_GetTraceLevel()) \
|
||
|
{ \
|
||
|
TRCSaferSprintf(TB, string); \
|
||
|
TRC_TraceData(level, \
|
||
|
group, \
|
||
|
(DCINT)__LINE__, \
|
||
|
trc_fn, \
|
||
|
trc_file, \
|
||
|
(PDCUINT8)buffer, \
|
||
|
length); \
|
||
|
} \
|
||
|
}
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* */
|
||
|
/* FUNCTION PROTOTYPES */
|
||
|
/* */
|
||
|
/****************************************************************************/
|
||
|
/* */
|
||
|
/* TRC_Initialize */
|
||
|
/* TRC_Terminate */
|
||
|
/* TRC_GetBuffer */
|
||
|
/* TRC_TraceBuffer */
|
||
|
/* TRC_GetConfig */
|
||
|
/* TRC_SetConfig */
|
||
|
/* TRC_TraceData */
|
||
|
/* TRC_GetTraceLevel */
|
||
|
/* TRC_ProfileTraceEnabled */
|
||
|
/* */
|
||
|
/****************************************************************************/
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* API FUNCTION: TRC_Initialize(...) */
|
||
|
/* */
|
||
|
/* DESCRIPTION: */
|
||
|
/* ============ */
|
||
|
/* This function initializes the tracing for this component. */
|
||
|
/* */
|
||
|
/* PARAMETERS: */
|
||
|
/* =========== */
|
||
|
/* initShared : Boolean indicating whether we should attempt to create */
|
||
|
/* the trace config shared memory or not. */
|
||
|
/* */
|
||
|
/* RETURNS: */
|
||
|
/* ======== */
|
||
|
/* 0 : success. */
|
||
|
/* TRC_RC_XXX : failure. */
|
||
|
/* */
|
||
|
/****************************************************************************/
|
||
|
DCUINT32 DCAPI TRC_Initialize(DCBOOL initShared);
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* API FUNCTION: TRC_Terminate(...) */
|
||
|
/* */
|
||
|
/* DESCRIPTION: */
|
||
|
/* ============ */
|
||
|
/* This function terminates tracing for this component. */
|
||
|
/* */
|
||
|
/* PARAMETERS: */
|
||
|
/* =========== */
|
||
|
/* termShared : Boolean indicating if shared memory should be released */
|
||
|
/* or not. */
|
||
|
/* */
|
||
|
/* RETURNS: */
|
||
|
/* ======== */
|
||
|
/* Nothing. */
|
||
|
/* */
|
||
|
/****************************************************************************/
|
||
|
DCVOID DCAPI TRC_Terminate(DCBOOL termShared);
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* API FUNCTION: TRC_GetBuffer(...) */
|
||
|
/* */
|
||
|
/* DESCRIPTION: */
|
||
|
/* ============ */
|
||
|
/* This function grabs the mutex and returns a pointer to the trace */
|
||
|
/* buffer. */
|
||
|
/* */
|
||
|
/* PARAMETERS: */
|
||
|
/* =========== */
|
||
|
/* None. */
|
||
|
/* */
|
||
|
/* RETURNS: */
|
||
|
/* ======== */
|
||
|
/* A pointer to the trace buffer. */
|
||
|
/* */
|
||
|
/****************************************************************************/
|
||
|
PDCTCHAR DCAPI TRC_GetBuffer(DCVOID);
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* API FUNCTION: TRC_TraceBuffer(...) */
|
||
|
/* */
|
||
|
/* DESCRIPTION: */
|
||
|
/* ============ */
|
||
|
/* This function copies the trace line that is currently in the trace */
|
||
|
/* buffer into the trace file and / or to the debugger. It assumes that the */
|
||
|
/* mutex has already been acquired before it is called and releases the */
|
||
|
/* mutex before returning. */
|
||
|
/* */
|
||
|
/* PARAMETERS: */
|
||
|
/* =========== */
|
||
|
/* traceLevel : the requested trace level. */
|
||
|
/* traceComponent : the component group that the source file is in. */
|
||
|
/* lineNumber : the line number of the source file traced from. */
|
||
|
/* funcName : the function name traced from. */
|
||
|
/* fileName : the file name of the module requesting trace. */
|
||
|
/* */
|
||
|
/* RETURNS: */
|
||
|
/* ======== */
|
||
|
/* Nothing. */
|
||
|
/* */
|
||
|
/****************************************************************************/
|
||
|
DCVOID DCAPI TRC_TraceBuffer(DCUINT traceLevel,
|
||
|
DCUINT traceComponent,
|
||
|
DCUINT lineNumber,
|
||
|
PDCTCHAR funcName,
|
||
|
PDCTCHAR fileName);
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* API FUNCTION: TRC_GetConfig(...) */
|
||
|
/* */
|
||
|
/* DESCRIPTION: */
|
||
|
/* ============ */
|
||
|
/* This function copies the current trace settings into the buffer pointed */
|
||
|
/* to by pTraceConfig. */
|
||
|
/* */
|
||
|
/* PARAMETERS: */
|
||
|
/* =========== */
|
||
|
/* pTraceConfig : a pointer to a TRC_CONFIG structure. */
|
||
|
/* length : the length of the buffer. */
|
||
|
/* */
|
||
|
/* RETURNS: */
|
||
|
/* ======== */
|
||
|
/* TRUE : success. */
|
||
|
/* FALSE : failure. */
|
||
|
/* */
|
||
|
/****************************************************************************/
|
||
|
DCBOOL DCAPI TRC_GetConfig(PTRC_CONFIG pTraceConfig,
|
||
|
DCUINT length);
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* API FUNCTION: TRC_SetConfig(...) */
|
||
|
/* */
|
||
|
/* DESCRIPTION: */
|
||
|
/* ============ */
|
||
|
/* This function sets the trace configuration to that specified in the */
|
||
|
/* passed TRC_CONFIG structure. */
|
||
|
/* */
|
||
|
/* PARAMETERS: */
|
||
|
/* =========== */
|
||
|
/* pTraceConfig : a pointer to a TRC_CONFIG structure. */
|
||
|
/* length : the length of the buffer. */
|
||
|
/* */
|
||
|
/* RETURNS: */
|
||
|
/* ======== */
|
||
|
/* TRUE : success. */
|
||
|
/* FALSE : failure. */
|
||
|
/* */
|
||
|
/****************************************************************************/
|
||
|
DCBOOL DCAPI TRC_SetConfig(PTRC_CONFIG pTraceConfig,
|
||
|
DCUINT length);
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* API FUNCTION: TRC_TraceData(...) */
|
||
|
/* */
|
||
|
/* DESCRIPTION: */
|
||
|
/* ============ */
|
||
|
/* */
|
||
|
/* PARAMETERS: */
|
||
|
/* =========== */
|
||
|
/* traceLevel : the requested trace level. */
|
||
|
/* traceComponent : the component group that the source file is in. */
|
||
|
/* lineNumber : the line number of the source file traced from. */
|
||
|
/* funcName : the function name traced from. */
|
||
|
/* fileName : the file name of the module requesting trace. */
|
||
|
/* buffer : the actual data to be traced. */
|
||
|
/* bufLength : the length of the data. */
|
||
|
/* */
|
||
|
/* RETURNS: */
|
||
|
/* ======== */
|
||
|
/* Nothing. */
|
||
|
/* */
|
||
|
/****************************************************************************/
|
||
|
DCVOID DCAPI TRC_TraceData(DCUINT traceLevel,
|
||
|
DCUINT traceComponent,
|
||
|
DCUINT lineNumber,
|
||
|
PDCTCHAR funcName,
|
||
|
PDCTCHAR fileName,
|
||
|
PDCUINT8 buffer,
|
||
|
DCUINT bufLength);
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* API FUNCTION: TRC_GetTraceLevel(...) */
|
||
|
/* */
|
||
|
/* DESCRIPTION: */
|
||
|
/* ============ */
|
||
|
/* This function returns the current trace level. */
|
||
|
/* */
|
||
|
/* PARAMETERS: */
|
||
|
/* =========== */
|
||
|
/* None. */
|
||
|
/* */
|
||
|
/* RETURNS: */
|
||
|
/* ======== */
|
||
|
/* The current trace level. */
|
||
|
/* */
|
||
|
/****************************************************************************/
|
||
|
DCUINT DCAPI TRC_GetTraceLevel(DCVOID);
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* API FUNCTION: TRC_ProfileTraceEnabled(...) */
|
||
|
/* */
|
||
|
/* DESCRIPTION: */
|
||
|
/* ============ */
|
||
|
/* This function returns the function entry/exit trace setting. */
|
||
|
/* */
|
||
|
/* PARAMETERS: */
|
||
|
/* =========== */
|
||
|
/* None. */
|
||
|
/* */
|
||
|
/* RETURNS: */
|
||
|
/* ======== */
|
||
|
/* TRUE / FALSE - is the profile tracing enabled. */
|
||
|
/* */
|
||
|
/****************************************************************************/
|
||
|
DCBOOL DCAPI TRC_ProfileTraceEnabled(DCVOID);
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* API FUNCTION: TRC_ResetTraceFiles(...) */
|
||
|
/* */
|
||
|
/* DESCRIPTION: */
|
||
|
/* ============ */
|
||
|
/* This function resets the trace files. After checking that trace is */
|
||
|
/* initialized it calls the OS specific internal function. */
|
||
|
/* */
|
||
|
/* PARAMETERS: */
|
||
|
/* =========== */
|
||
|
/* None. */
|
||
|
/* */
|
||
|
/* RETURNS: */
|
||
|
/* ======== */
|
||
|
/* TRUE / FALSE - is the profile tracing enabled. */
|
||
|
/* */
|
||
|
/****************************************************************************/
|
||
|
DCBOOL DCAPI TRC_ResetTraceFiles(DCVOID);
|
||
|
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* Before including this file the TRC_FILE macro should be defined. This */
|
||
|
/* is much more efficient than relying on __FILE__ to give the correct */
|
||
|
/* filename since it includes unnecessary path info (and extension info). */
|
||
|
/* In addition each use of __FILE__ causes a new constant string to be */
|
||
|
/* placed in the data segment. */
|
||
|
/****************************************************************************/
|
||
|
#if (TRC_CL < TRC_LEVEL_DIS)
|
||
|
|
||
|
/************************************************************************/
|
||
|
/* Define another layer for _T() to work around preprocessor problems */
|
||
|
/************************************************************************/
|
||
|
#define TRC_T(x) _T(x)
|
||
|
|
||
|
#ifdef TRC_FILE
|
||
|
#define _file_name_ (PDCTCHAR)__filename
|
||
|
static const DCTCHAR __filename[] = TRC_T(TRC_FILE);
|
||
|
#endif /* TRC_FILE */
|
||
|
|
||
|
#endif
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* */
|
||
|
/* OPERATING SYSTEM SPECIFIC INCLUDES */
|
||
|
/* */
|
||
|
/****************************************************************************/
|
||
|
#include <wtrcapi.h>
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif /* __cplusplus */
|
||
|
|
||
|
#endif /* _H_ATRCAPI */
|