Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

271 lines
5.4 KiB

/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
trace.h
Abstract:
SIS Groveler debugging trace include file
Authors:
John Douceur, 1998
Environment:
User Mode
Revision History:
--*/
#ifndef _INC_TRACE
#define _INC_TRACE
// The following lines are a temporary hack to allow the DPRINTF() and
// TPRINTF() macros in the database.cpp, extract.cpp, groveler.cpp, and
// scan.cpp files to continue to operate. Each instance of the DPRINTF()
// or TPRINTF() macro should be replaced by an instance of the TRACE_PRINTF()
// macro, with an appropriate component parameter (TC_database, TC_extract,
// TC_groveler, or TC_scan) and an appropriate detail parameter. Then, this
// comment block and all lines of code up to the next comment block should
// be deleted.
#define DPRINTF(args) TRACE_PRINTF(TC_groveler, 1, args)
#define TPRINTF(args) TRACE_PRINTF(TC_groveler, 2, args)
#if defined(TRACELEVEL) && DBG
#if TRACELEVEL == 3
#define TRACE_TYPE 2 // immediate printout
#define TRACE_IOSTREAM 2 // print to stderr
#define TRACE_GROVELER 1 // print DPRINTF() but not TPRINTF()
#define TRACE_DATABASE 1
#define TRACE_EXTRACT 1
#define TRACE_SCAN 1
#define TRACE_SISDRIVE 2
#endif // TRACELEVEL == 3
#endif /* TRACELEVEL */
/*
* Define TRACE_TYPE, TRACE_FILENAME, and TRACE_IOSTREAM in sources file.
* These settings take effect at compile time and cannot be changed thereafter.
*
* TRACE_TYPE:
* If not defined, none
* 0 == none
* 1 == delayed
* 2 == immediate
*
* TRACE_FILENAME
* Name of destination file for output of trace prints.
* If not defined, then no output to file.
*
* TRACE_IOSTREAM
* If not defined, no output to stream
* 0 == no output to stream
* 1 == stdout
* 2 == stderr
*
* Define trace contextual detail indicators in sources file if desired.
* These settings provide initial values for variables that may be changed by
* a debugger during run time. Each contextual detail indicator indicates
* the level of trace detail that should be printed for that component.
* Greater numbers indicate greater levels of detail. If an indicator is
* zero or not defined, then no trace information is printed for this
* component (unless the component has a TRACE_PRINTF() macro that specifies
* a detail level of zero, indicating that it should always be displayed in
* a trace). The contextual detail indicators currently supported are:
* TRACE_MAIN
* TRACE_CENTCTRL
* TRACE_CONFEST
* TRACE_DATABASE
* TRACE_DECAYACC
* TRACE_DISKINFO
* TRACE_ETIMER
* TRACE_EVENT
* TRACE_EVENTLOG
* TRACE_EXTRACT
* TRACE_FILTER
* TRACE_GROVELER
* TRACE_MEANCOMP
* TRACE_MUTEX
* TRACE_PARAMS
* TRACE_PARTCTRL
* TRACE_PATHLIST
* TRACE_PEAKFIND
* TRACE_REGISTRY
* TRACE_SCAN
* TRACE_SERVICE
* TRACE_SHARE
* TRACE_SISDRIVE
* TRACE_UTILITY
*
* To add a new component to the trace facility, follow these steps:
* 1) add its name to the comment above
* 2) add an entry to the TraceComponent enumeration below
* 3) add an #ifndef-#define-#endif tuple to the list in trace.cpp
* 4) add an initializer to the trace_components array in trace.cpp
*
* To change the trace detail level for a given component during run time,
* set the element in the trace_detail[] array indexed by the TraceComponent
* enumeration for the desired component to the desired detail level.
*
*/
#ifndef TRACE_TYPE
#define TRACE_TYPE 0
#endif /* TRACE_TYPE */
#ifndef TRACE_IOSTREAM
#define TRACE_IOSTREAM 0
#endif /* TRACE_IOSTREAM */
#if TRACE_TYPE > 0
enum TraceComponent
{
TC_main,
TC_centctrl,
TC_confest,
TC_database,
TC_decayacc,
TC_diskinfo,
TC_etimer,
TC_event,
TC_eventlog,
TC_extract,
TC_filter,
TC_groveler,
TC_meancomp,
TC_mutex,
TC_params,
TC_partctrl,
TC_pathlist,
TC_peakfind,
TC_registry,
TC_scan,
TC_service,
TC_share,
TC_sisdrive,
TC_utility,
num_trace_components
};
class Tracer
{
public:
static void trace_printf(
_TCHAR *format,
...);
#if TRACE_TYPE == 1
static void print_trace_log();
#endif // TRACE_TYPE == 1
#ifdef TRACE_FILENAME
static void open_trace_file();
static void close_trace_file();
#endif /* TRACE_FILENAME */
private:
Tracer() {}
~Tracer() {}
#if TRACE_TYPE == 1
enum
{
trace_buffer_size = 4000,
trace_entry_limit = 256
};
struct TraceBuffer;
friend struct TraceBuffer;
struct TraceBuffer
{
TraceBuffer *next;
_TCHAR buffer[trace_buffer_size];
};
static int position;
static TraceBuffer *trace_log;
static TraceBuffer *current_buffer;
static TraceBuffer *free_list;
#endif // TRACE_TYPE == 1
#ifdef TRACE_FILENAME
static FILE *file_stream;
#endif /* TRACE_FILENAME */
#if TRACE_IOSTREAM != 0
static FILE *io_stream;
#endif // TRACE_IOSTREAM
};
extern int trace_detail[num_trace_components];
#define TRACE_PRINTF(component, detail, args) \
{ \
if (detail <= trace_detail[component]) \
{ \
Tracer::trace_printf ## args ; \
} \
}
#if TRACE_TYPE == 1
#define PRINT_TRACE_LOG() Tracer::print_trace_log()
#else // TRACE_TYPE == 1
#define PRINT_TRACE_LOG()
#endif // TRACE_TYPE == 1
#ifdef TRACE_FILENAME
#define OPEN_TRACE_FILE() Tracer::open_trace_file()
#define CLOSE_TRACE_FILE() Tracer::close_trace_file()
#else /* TRACE_FILENAME */
#define OPEN_TRACE_FILE()
#define CLOSE_TRACE_FILE()
#endif /* TRACE_FILENAME */
#else // TRACE_TYPE > 0
#define TRACE_PRINTF(component, detail, args)
#define PRINT_TRACE_LOG()
#define OPEN_TRACE_FILE()
#define CLOSE_TRACE_FILE()
#endif // TRACE_TYPE > 0
#endif /* _INC_TRACE */