|
|
/*++
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 */
|