(file) Return to Tracer.h CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Common

Diff for /pegasus/src/Pegasus/Common/Tracer.h between version 1.25 and 1.38

version 1.25, 2006/06/20 16:51:31 version 1.38, 2008/08/28 17:24:36
Line 29 
Line 29 
 // //
 //============================================================================== //==============================================================================
 // //
 // Author: Sushma Fernandes, Hewlett-Packard Company (sushma_fernandes@hp.com)  
 //  
 // Modified By: Jenny Yu, Hewlett-Packard Company (jenny_yu@hp.com)  
 //              Amit K Arora, IBM (amita@in.ibm.com) for PEP#101  
 //              Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com)  
 //              David Dillard, Symantec Corp. (david_dillard@symantec.com)  
 //  
 //%///////////////////////////////////////////////////////////////////////////// //%/////////////////////////////////////////////////////////////////////////////
  
 #ifndef Pegasus_Tracer_h #ifndef Pegasus_Tracer_h
 #define Pegasus_Tracer_h #define Pegasus_Tracer_h
  
 #include <stdarg.h>  #include <cstdarg>
 #include <Pegasus/Common/String.h> #include <Pegasus/Common/String.h>
 #include <Pegasus/Common/System.h> #include <Pegasus/Common/System.h>
 #include <Pegasus/Common/Logger.h> #include <Pegasus/Common/Logger.h>
 #include <Pegasus/Common/InternalException.h> #include <Pegasus/Common/InternalException.h>
 #include <Pegasus/Common/TraceComponents.h> #include <Pegasus/Common/TraceComponents.h>
 #include <Pegasus/Common/TraceFileHandler.h>  #include <Pegasus/Common/TraceHandler.h>
 #include <Pegasus/Common/Linkage.h> #include <Pegasus/Common/Linkage.h>
 #include <Pegasus/Common/AutoPtr.h>  #include <Pegasus/Common/SharedPtr.h>
  
 PEGASUS_NAMESPACE_BEGIN PEGASUS_NAMESPACE_BEGIN
  
Line 67 
Line 60 
 { {
 public: public:
  
   
       /** Trace facilities
           File - tracing occurs to the trace file
           Log  - tracing occurs through the Pegasus Logger class
           Keep the TRACE_FACILITY_LIST in sync with the TRACE_FACILITY_INDEX,
           so that the index matches the according string in the list.
        */
       static char const* TRACE_FACILITY_LIST[];
   
       enum TRACE_FACILITY_INDEX
       {
           TRACE_FACILITY_FILE = 0,
           TRACE_FACILITY_LOG  = 1
       };
   
   
     /** Levels of trace     /** Levels of trace
         Trace messages are written to the trace file only if they are at or         Trace messages are written to the trace file only if they are at or
         above a given trace level         above a given trace level
         LEVEL1 - Function Entry/Exit          LEVEL1 - Severe and log messages
         LEVEL2 - Basic flow trace messages, low data detail         LEVEL2 - Basic flow trace messages, low data detail
         LEVEL3 - Inter-function logic flow, medium data detail         LEVEL3 - Inter-function logic flow, medium data detail
         LEVEL4 - High data detail         LEVEL4 - High data detail
Line 80 
Line 89 
     static const Uint32 LEVEL3;     static const Uint32 LEVEL3;
     static const Uint32 LEVEL4;     static const Uint32 LEVEL4;
  
     /** Traces the specified number of bytes in a given buffer      /** Traces the given character string.
         @param    traceComponent  component being traced          Overloaded to include the filename
         @param    level      trace level of the trace message  
         @param    data            buffer to be traced  
         @param    size            number of bytes to be traced  
      */  
     static void traceBuffer(  
         const Uint32 traceComponent,  
         const Uint32 level,  
         const char*  data,  
         const Uint32 size);  
   
     /** Traces the specified number of bytes in a given buffer  
         Overloaded to include the filename and the line number  
         of trace origin.  
         @param    fileName        filename of the trace originator  
         @param    lineNum         line number of the trace originator  
         @param    traceComponent  component being traced  
         @param    level      trace level of the trace message  
         @param    data            buffer to be traced  
         @param    size            size of the buffer  
      */  
     static void traceBuffer(  
         const char*  fileName,  
         const Uint32 lineNum,  
         const Uint32 traceComponent,  
         const Uint32 level,  
         const char*  data,  
         const Uint32 size);  
   
     /** Traces the given message  
         @param    traceComponent  component being traced  
         @param    level      trace level of the trace message  
         @param    *fmt            printf style format string  
         @param    ...             variable argument list  
      */  
     static void trace(  
         const Uint32 traceComponent,  
         const Uint32 level,  
         const char *fmt,  
         ...);  
   
     /** Traces the given message. Overloaded to include the filename and  
         the line number of trace origin.  
         @param    fileName        filename of the trace originator  
         @param    lineNum         line number of the trace originator  
         @param    traceComponent  component being traced  
         @param    level      trace level of the trace message  
         @param    *fmt            printf style format string  
         @param    ...             variable argument list  
      */  
     static void trace(  
         const char* fileName,  
         const Uint32 lineNum,  
         const Uint32 traceComponent,  
         const Uint32 level,  
         const char* fmt,  
         ...);  
   
     /** Traces the given string.  Overloaded to include the filename  
         and line number of trace origin.         and line number of trace origin.
         @param    fileName        filename of the trace originator         @param    fileName        filename of the trace originator
         @param    lineNum         line number of the trace originator         @param    lineNum         line number of the trace originator
         @param    traceComponent  component being traced         @param    traceComponent  component being traced
         @param    level      trace level of the trace message          @param cstring         the character string to be traced
         @param    string     the string to be traced  
      */      */
     static void trace(      static void traceCString(
         const char*   fileName,         const char*   fileName,
         const Uint32  lineNum,         const Uint32  lineNum,
         const Uint32  traceComponent,         const Uint32  traceComponent,
         const Uint32  level,          const char* cstring);
         const String& string);  
   
     /** Traces the given string.  
         @param    fileName        filename of the trace originator  
         @param    lineNum         line number of the trace originator  
         @param    traceComponent  component being traced  
         @param    level      trace level of the trace message  
         @param    string     the string to be traced  
      */  
     static void trace(  
         const Uint32  traceComponent,  
         const Uint32  level,  
         const String& string);  
  
     /** Traces the message in the given CIMException object.  The message     /** Traces the message in the given CIMException object.  The message
         written to the trace file will include the source filename and         written to the trace file will include the source filename and
         line number of the CIMException originator.         line number of the CIMException originator.
         @param    traceComponent  component being traced         @param    traceComponent  component being traced
         @param    level      trace level of the trace message         @param    level      trace level of the trace message
         @param    CIMException    the CIMException to be traced.          @param cimException    the CIMException to be traced.
      */      */
     static void traceCIMException(     static void traceCIMException(
         const Uint32  traceComponent,         const Uint32  traceComponent,
         const Uint32  level,         const Uint32  level,
         CIMException  cimException);          const CIMException& cimException);
   
       /** Gets an HTTP request message.
   
           Given an HTTP request message, this method checks if the
           message contains a "Basic" authorization header.
   
           If true, the username/passwd is suppressed and returned.
           Otherwise the request message is returned without any changes.
   
           @param requestMessage  requestMessage to be checked
   
           @return request message
   
       */
       static SharedArrayPtr<char> getHTTPRequestMessage(
           const Buffer& requestMessage);
  
     /** Set the trace file to the given file     /** Set the trace file to the given file
         @param    traceFile       full path of the trace file         @param    traceFile       full path of the trace file
Line 201 
Line 154 
     static void setTraceComponents(     static void setTraceComponents(
        const String& traceComponents);        const String& traceComponents);
  
     /** Traces method entry.      /** Set trace facility to be used
         @param    token           TracerToken          @param traceFacility facility to be used for tracing,
         @param    traceComponent  component being traced                 for example Log or File.
         @param    methodName      method being traced          @return 0      if trace facility is valid
      */                  1      if trace facility is invalid
     static void traceEnter(      */
         TracerToken& token,      static Uint32 setTraceFacility(const String& traceFacility);
         Uint32 component,  
         const char* method);      /** Get trace facility currently in use
           @return TRACE_FACILITY_FILE - if trace facility is file
     /** Traces method exit.                  TRACE_FACILITY_LOG - if trace facility is the log
         @param    token           TracerToken containing component and method  
     */     */
     static void traceExit(      static Uint32 getTraceFacility();
         TracerToken& token);  
  
     /** Traces method entry.     /** Traces method entry.
         @param    token           TracerToken         @param    token           TracerToken
Line 265 
Line 216 
         const String& traceComponents,         const String& traceComponents,
         String& invalidComponents);         String& invalidComponents);
  
       /** Validates the trace facility string value
           @param  traceFacility   The trace facility as string
           @return 1        if the trace facility is valid
                   0        if the trace facility is invalid
        */
       static Boolean isValidTraceFacility( const String& traceFacility );
   
     /** Specify the name of the module being traced.  If non-empty, this     /** Specify the name of the module being traced.  If non-empty, this
         value is used as an extension to the name of the trace file.         value is used as an extension to the name of the trace file.
         @param    moduleName   Name of the module being traced.         @param    moduleName   Name of the module being traced.
Line 275 
Line 233 
     */     */
     static Boolean isTraceOn() { return _traceOn; }     static Boolean isTraceOn() { return _traceOn; }
  
       // Checks if trace is enabled for the given component and trace level
       // @param    traceComponent  component being traced
       // @param    level      level of the trace message
       // @return   0               if the component and level are not enabled
       //           1               if the component and level are enabled
       static Boolean isTraceEnabled(
           const Uint32 traceComponent,
           const Uint32 level);
   
 private: private:
  
     /** A static single indicator if tracing is turned on allowing to     /** A static single indicator if tracing is turned on allowing to
Line 284 
Line 251 
      */      */
     static Boolean _traceOn;     static Boolean _traceOn;
  
       /** Internal only Levels of trace
           These cannot be used in any of the trace calls directly, but are set
           by methods of the Tracer class for specific purposes, such as trace
           Enter and traceExit.
           LEVEL0 - Trace is switched off
           LEVEL5 - used for method enter & exit
        */
       static const Uint32 LEVEL0;
       static const Uint32 LEVEL5;
   
     static const char   _COMPONENT_SEPARATOR;     static const char   _COMPONENT_SEPARATOR;
     static const Uint32 _NUM_COMPONENTS;     static const Uint32 _NUM_COMPONENTS;
     static const Uint32 _STRLEN_MAX_UNSIGNED_INT;     static const Uint32 _STRLEN_MAX_UNSIGNED_INT;
     static const Uint32 _STRLEN_MAX_PID_TID;     static const Uint32 _STRLEN_MAX_PID_TID;
     static const Boolean _SUCCESS;  
     static const Boolean _FAILURE;  
     AutoArrayPtr<Boolean> _traceComponentMask;     AutoArrayPtr<Boolean> _traceComponentMask;
       Uint32                _traceFacility;
       //Is true if any components are set at the component mask
       Boolean               _componentsAreSet;
     Uint32              _traceLevelMask;     Uint32              _traceLevelMask;
     AutoPtr<TraceFileHandler> _traceHandler;      AutoPtr<TraceHandler> _traceHandler;
     String              _moduleName;     String              _moduleName;
     static Tracer*      _tracerInstance;     static Tracer*      _tracerInstance;
  
Line 300 
Line 278 
     static const char _METHOD_ENTER_MSG[];     static const char _METHOD_ENTER_MSG[];
     static const char _METHOD_EXIT_MSG[];     static const char _METHOD_EXIT_MSG[];
  
     // Message Strings for Logger      // Factory function to create an instance of the matching trace handler
     static const char _LOG_MSG[];      // for the given type of traceFacility.
       // @param    traceFacility  type of trace handler to create
     // Checks if trace is enabled for the given component and trace level      // @return   an instance of a trace handler class. For invalid trace
     // @param    traceComponent  component being traced      //           facilities always creates a traceFileHandler.
     // @param    level      level of the trace message      TraceHandler* getTraceHandler( Uint32 traceFacility );
     // @return   0               if the component and level are not enabled  
     //           1               if the component and level are enabled  
     static Boolean _isTraceEnabled(  
         const Uint32 traceComponent,  
         const Uint32 level);  
   
     // Traces the given message  
     //  @param    traceComponent  component being traced  
     //  @param    level      level of the trace message  
     //  @param    *fmt            printf style format string  
     //  @param    argList         variable argument list  
     static void _trace(  
         const Uint32 traceComponent,  
         const Uint32 level,  
         const char* fmt,  
         va_list argList);  
  
     // Traces the given message. Overloaded to include the file name and the     // Traces the given message. Overloaded to include the file name and the
     // line number as one of the parameters.     // line number as one of the parameters.
     // @param    traceComponent  component being traced     // @param    traceComponent  component being traced
     // @param    level      level of the trace message  
     // @param    message         message header (file name:line number)     // @param    message         message header (file name:line number)
     // @param    *fmt            printf style format string     // @param    *fmt            printf style format string
     // @param    argList         variable argument list     // @param    argList         variable argument list
Line 334 
Line 295 
         const char* fileName,         const char* fileName,
         const Uint32 lineNum,         const Uint32 lineNum,
         const Uint32 traceComponent,         const Uint32 traceComponent,
         const Uint32 level,  
         const char* fmt,         const char* fmt,
         va_list argList);         va_list argList);
  
     //  Traces the specified number of bytes in a given buffer  
     //  @param    traceComponent  component being traced  
     //  @param    level      trace level of the trace message  
     //  @param    data            buffer to be traced  
     //  @param    size            number of bytes to be traced  
     static void _traceBuffer(  
         const Uint32 traceComponent,  
         const Uint32 level,  
         const char*  data,  
         const Uint32 size);  
   
     //  Traces the specified number of bytes in a given buffer  
     //  Overloaded to include the filename and the line number  
     //  of trace origin.  
     //  @param    fileName        filename of the trace originator  
     //  @param    lineNum         line number of the trace originator  
     //  @param    traceComponent  component being traced  
     //  @param    level      trace level of the trace message  
     //  @param    data            buffer to be traced  
     //  @param    size            size of the buffer  
     static void _traceBuffer(  
         const char*  fileName,  
         const Uint32 lineNum,  
         const Uint32 traceComponent,  
         const Uint32 level,  
         const char*  data,  
         const Uint32 size);  
   
     //  Traces the given string.  
     //  @param    traceComponent  component being traced  
     //  @param    level      trace level of the trace message  
     //  @param    string     the string to be traced  
     //  
     static void _traceString(  
         const Uint32  traceComponent,  
         const Uint32  level,  
         const String& string);  
   
     //  Traces a given string.  Overloaded to include the filename  
     //  and line number of trace origin.  
     //  @param    fileName        filename of the trace originator  
     //  @param    lineNum         line number of the trace originator  
     //  @param    traceComponent  component being traced  
     //  @param    level      trace level of the trace message  
     //  @param    string     the string to be traced  
     //  
     static void _traceString(  
         const char*   fileName,  
         const Uint32  lineNum,  
         const Uint32  traceComponent,  
         const Uint32  level,  
         const String& string);  
   
     //  Traces the message in the given CIMException object.  The message     //  Traces the message in the given CIMException object.  The message
     //  to be written to the trace file will include the source filename and     //  to be written to the trace file will include the source filename and
     //  line number of the CIMException originator.     //  line number of the CIMException originator.
     //  @param    traceComponent  component being traced     //  @param    traceComponent  component being traced
     //  @param    level      trace level of the trace message  
     //  @param    CIMException    the CIMException to be traced.     //  @param    CIMException    the CIMException to be traced.
     //     //
     static void _traceCIMException(     static void _traceCIMException(
         const Uint32  traceComponent,         const Uint32  traceComponent,
         const Uint32  level,          const CIMException& cimException);
         CIMException  cimException);  
  
     // Called by all the trace interfaces to log message to the      // Called by all the trace interfaces to log message
     // trace file      // consisting of a single character string to the trace file
     // @param    fileName        filename of the trace originator      // @param    traceComponent  component being traced
     // @param    lineNum         line number of the trace originator      // @param    cstring         the string to be traced
       static void _traceCString(
           const Uint32 traceComponent,
           const char* message,
           const char* cstring);
   
       // Called by all the trace interfaces to log message
       // with variable number of arguments to the trace file
     // @param    traceComponent  component being traced     // @param    traceComponent  component being traced
     // @param    *fmt            printf style format string     // @param    *fmt            printf style format string
     // @param    argList         variable argument list     // @param    argList         variable argument list
Line 416 
Line 328 
         const char* fmt,         const char* fmt,
         va_list argList);         va_list argList);
  
     // Traces method enter      // Traces method enter/exit
     // @param    fileName        filename of the trace originator     // @param    fileName        filename of the trace originator
     // @param    lineNum         line number of the trace originator     // @param    lineNum         line number of the trace originator
     // @param    traceComponent  component being traced     // @param    traceComponent  component being traced
     // @param    *fmt            printf style format string      // @param    method          name of the method
     // @param    ...             variable argument list      static void _traceMethod(
     static void _traceEnter(  
         const char* fileName,  
         const Uint32 lineNum,  
         const Uint32 traceComponent,  
         const char* fmt,  
         ...);  
   
     // Traces method exit  
     // @param    fileName        filename of the trace originator  
     // @param    traceComponent  component being traced  
     // @param    *fmt            printf style format string  
     // @param    ...             variable argument list  
     static void _traceExit(  
         const char* fileName,         const char* fileName,
         const Uint32 lineNum,         const Uint32 lineNum,
         const Uint32 traceComponent,         const Uint32 traceComponent,
         const char* fmt,          const char* methodEntryExit,
         ...);          const char* method);
  
     // Tracer constructor     // Tracer constructor
     // Constructor is private to prevent construction of Tracer objects     // Constructor is private to prevent construction of Tracer objects
Line 452 
Line 351 
     // Returns the Singleton instance of the Tracer     // Returns the Singleton instance of the Tracer
     // @return   Tracer*  Instance of Tracer     // @return   Tracer*  Instance of Tracer
     static Tracer* _getInstance();     static Tracer* _getInstance();
   
       friend class TraceCallFrame;
       friend class TracePropertyOwner;
 }; };
  
 //============================================================================== //==============================================================================
Line 463 
Line 365 
  
 #ifdef PEGASUS_REMOVE_TRACE #ifdef PEGASUS_REMOVE_TRACE
  
 inline void Tracer::traceBuffer(  inline void Tracer::traceCString(
     const char*  fileName,     const char*  fileName,
     const Uint32 lineNum,     const Uint32 lineNum,
     const Uint32 traceComponent,     const Uint32 traceComponent,
     const Uint32 level,      const char* cstring)
     const char*  data,  
     const Uint32 size)  
 { {
     // empty function     // empty function
 } }
  
 inline void Tracer::traceBuffer(  inline void Tracer::traceCIMException(
     const Uint32 traceComponent,     const Uint32 traceComponent,
     const Uint32 level,     const Uint32 level,
     const char* data,      const CIMException& cimException)
     const Uint32 size)  
 { {
     // empty function     // empty function
 } }
  
 inline void Tracer::trace(  static SharedArrayPtr<char> getHTTPRequestMessage(
     const Uint32 traceComponent,          const Buffer& requestMessage)
     const Uint32 level,  
     const char *fmt,  
     ...)  
 { {
     // empty function     // empty function
       return SharedArrayPtr<char>();
 } }
  
 inline void Tracer::trace(  inline Uint32 Tracer::setTraceFile(const char* traceFile)
     const char*  fileName,  
     const Uint32 lineNum,  
     const Uint32 traceComponent,  
     const Uint32 level,  
     const char* fmt,  
     ...)  
 { {
     // empty function     // empty function
       return 0;
 } }
  
 inline void Tracer::trace(  inline Uint32 Tracer::setTraceLevel(const Uint32 level)
     const char*   fileName,  
     const Uint32  lineNum,  
     const Uint32  traceComponent,  
     const Uint32  level,  
     const String& string)  
 { {
     // empty function     // empty function
       return 0;
 } }
  
 inline void Tracer::trace(  inline void Tracer::setTraceComponents(const String& traceComponents)
     const Uint32  traceComponent,  
     const Uint32  level,  
     const String& string)  
 { {
     // empty function     // empty function
 } }
  
 inline void Tracer::traceCIMException(  inline Uint32 Tracer::setTraceFacility(const String& traceComponents)
     const Uint32  traceComponent,  
     const Uint32  level,  
     CIMException  cimException)  
 { {
     // empty function     // empty function
       return 0;
 } }
  
 inline Uint32 Tracer::setTraceFile(const char* traceFile)  inline Uint32 Tracer::getTraceFacility()
 { {
     // empty function     // empty function
     return 0;     return 0;
Line 557 
Line 440 
  
 # define PEG_METHOD_ENTER(comp,meth) # define PEG_METHOD_ENTER(comp,meth)
 # define PEG_METHOD_EXIT() # define PEG_METHOD_EXIT()
 # define PEG_TRACE_STRING(comp,level,string)  
 # define PEG_TRACE(VAR_ARGS) # define PEG_TRACE(VAR_ARGS)
   # define PEG_TRACE_CSTRING(comp,level,chars)
  
 #else /* PEGASUS_REMOVE_TRACE */ #else /* PEGASUS_REMOVE_TRACE */
  
   // remover trace code for method enter/exit
   # ifdef  PEGASUS_REMOVE_METHODTRACE
   #  define PEG_METHOD_ENTER(comp,meth)
   #  define PEG_METHOD_EXIT()
   # else
 # define PEG_METHOD_ENTER(comp, meth) \ # define PEG_METHOD_ENTER(comp, meth) \
     TracerToken __tracerToken; \     TracerToken __tracerToken; \
     Tracer::traceEnter(__tracerToken PEGASUS_COMMA_FILE_LINE, comp, meth);      __tracerToken.method = 0; \
       do \
       { \
           if (Tracer::isTraceOn()) \
               Tracer::traceEnter( \
                   __tracerToken PEGASUS_COMMA_FILE_LINE, comp, meth); \
       } \
       while (0)
  
 #  define PEG_METHOD_EXIT() \ #  define PEG_METHOD_EXIT() \
     Tracer::traceExit(__tracerToken PEGASUS_COMMA_FILE_LINE)      do \
       { \
           if (Tracer::isTraceOn()) \
               Tracer::traceExit(__tracerToken PEGASUS_COMMA_FILE_LINE); \
       } \
       while (0)
   # endif
  
 // Macro for Trace String.  the do construct allows this to appear  // Macro to trace character lists.  the do construct allows this to appear
 // as a single statement. // as a single statement.
 # define PEG_TRACE_STRING(comp, level, string) \  # define PEG_TRACE_CSTRING(comp, level, chars) \
     do \     do \
     { \     { \
             Tracer::trace(PEGASUS_FILE_LINE_COMMA comp, level, string); \          if (Tracer::isTraceOn()) \
           { \
               if (Tracer::isTraceEnabled(comp, level)) \
               { \
                   Tracer::traceCString(PEGASUS_FILE_LINE_COMMA comp, chars); \
               } \
           } \
     } \     } \
     while (0)     while (0)
  
 // Macro for Trace variable number of arguments with format string. The trace test  //
 // is included becase of the possible cost of preparing the variable  // This class is constructed with the same arguments passed to PEG_TRACE().
 // number of arguments on each call.  The d construct allows this to be  // The constructor saves all the fixed arguments and calls va_start() on
 // treated as a single statement.  // the varying arguments (wherein the va_list argument is the ap member of
   // this class). The PEG_TRACE() macro eventually calls invoke() with the
   // file and line macros in order to write the trace entry. For more details,
   // see the comments below on the PEG_TRACE() macro.
   //
   class TraceCallFrame
   {
   public:
   
       const char* file;
       Uint32 line;
   
       TraceCallFrame(const char* file_, Uint32 line_) : file(file_), line(line_)
       {
       }
   
       PEGASUS_FORMAT(4, 5)
       inline void invoke(
           const Uint32 component,
           const Uint32 level,
           const char* format,
           ...)
       {
           if (Tracer::isTraceEnabled(component, level))
           {
               va_list ap;
               va_start(ap, format);
               Tracer::_trace(file, line, component, format, ap);
               va_end(ap);
           }
       }
   
       ~TraceCallFrame()
       {
       }
   };
   //
   // This macro is a wrapper for calling the printf-style form of the
   // Tracer::trace() function. Since macros cannot have a varying number of
   // arguments, PEG_TRACE() must be invoked with double parentheses. For
   // example:
   //
   //     PEG_TRACE((TRC_HTTP, Tracer::LEVEL1, "Oops: %d", 999));
   //
   // This macro offers two advantages over the calling trace() directly.
   //
   //     1. It eliminates the call to trace() if isTraceOn() returns false.
   //        This has proven to reduce the expense of servicing a request
   //        (when tracing is off) by as much as 3%.
   //
   //     2. It implicitly injects the __FILE__ and __LINE__ macros, relieving
   //        the caller of this burden.
   //
 # define PEG_TRACE(VAR_ARGS) \ # define PEG_TRACE(VAR_ARGS) \
     do \     do \
     { \     { \
         if (Tracer::isTraceOn()) \         if (Tracer::isTraceOn()) \
             Tracer::trace VAR_ARGS; \          { \
                   TraceCallFrame frame(__FILE__, __LINE__); \
                   frame.invoke VAR_ARGS; \
           } \
     } \     } \
     while (0)     while (0)
  


Legend:
Removed from v.1.25  
changed lines
  Added in v.1.38

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2