version 1.23, 2004/06/22 22:06:23
|
version 1.41, 2007/01/11 16:21:54
|
|
|
//%2003//////////////////////////////////////////////////////////////////////// |
//%2006//////////////////////////////////////////////////////////////////////// |
// | // |
// Copyright (c) 2000, 2001, 2002 BMC Software, Hewlett-Packard Development |
// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development |
// Company, L. P., IBM Corp., The Open Group, Tivoli Systems. |
// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems. |
// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L. P.; | // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L. P.; |
// IBM Corp.; EMC Corporation, The Open Group. | // IBM Corp.; EMC Corporation, The Open Group. |
|
// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.; |
|
// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group. |
|
// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.; |
|
// EMC Corporation; VERITAS Software Corporation; The Open Group. |
|
// Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.; |
|
// EMC Corporation; Symantec Corporation; The Open Group. |
// | // |
// Permission is hereby granted, free of charge, to any person obtaining a copy | // Permission is hereby granted, free of charge, to any person obtaining a copy |
// of this software and associated documentation files (the "Software"), to | // of this software and associated documentation files (the "Software"), to |
|
|
// | // |
//============================================================================== | //============================================================================== |
// | // |
// 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) |
|
// |
|
//%///////////////////////////////////////////////////////////////////////////// | //%///////////////////////////////////////////////////////////////////////////// |
| |
#include <Pegasus/Common/Config.h> | #include <Pegasus/Common/Config.h> |
#include <Pegasus/Common/Tracer.h> | #include <Pegasus/Common/Tracer.h> |
#include <Pegasus/Common/Thread.h> | #include <Pegasus/Common/Thread.h> |
#include <Pegasus/Common/IPC.h> |
|
#include <Pegasus/Common/System.h> | #include <Pegasus/Common/System.h> |
| |
PEGASUS_USING_STD; | PEGASUS_USING_STD; |
|
|
const char Tracer::_METHOD_EXIT_MSG[] = "Exiting method"; | const char Tracer::_METHOD_EXIT_MSG[] = "Exiting method"; |
| |
// Set Log messages | // Set Log messages |
const char Tracer::_LOG_MSG[] = "LEVEL1 may only be used with trace macros PEG_METHOD_ENTER/PEG_METHOD_EXIT."; |
const char Tracer::_LOG_MSG[] = |
|
"LEVEL1 may only be used with trace macros " |
|
"PEG_METHOD_ENTER/PEG_METHOD_EXIT."; |
| |
// Initialize singleton instance of Tracer | // Initialize singleton instance of Tracer |
Tracer* Tracer::_tracerInstance = 0; | Tracer* Tracer::_tracerInstance = 0; |
|
|
const Uint32 Tracer::_STRLEN_MAX_UNSIGNED_INT = 21; | const Uint32 Tracer::_STRLEN_MAX_UNSIGNED_INT = 21; |
| |
// Set the max PID and Thread ID Length | // Set the max PID and Thread ID Length |
const Uint32 Tracer::_STRLEN_MAX_PID_TID = 20; |
const Uint32 Tracer::_STRLEN_MAX_PID_TID = 21; |
|
|
|
// Initialize public indicator of trace state |
|
Boolean Tracer::_traceOn = false; |
| |
//////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////// |
// Tracer constructor | // Tracer constructor |
|
|
// Single Instance of Tracer is maintained for each process. | // Single Instance of Tracer is maintained for each process. |
//////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////// |
Tracer::Tracer() | Tracer::Tracer() |
|
: _traceComponentMask(new Boolean[_NUM_COMPONENTS]), |
|
_traceLevelMask(0), |
|
_traceHandler(new TraceFileHandler()) |
{ | { |
// Initialize Trace File Handler |
|
_traceHandler.reset(new TraceFileHandler()); |
|
_traceLevelMask=0; |
|
_traceComponentMask.reset(new Boolean[_NUM_COMPONENTS]); |
|
|
|
// Initialize ComponentMask array to false | // Initialize ComponentMask array to false |
for (Uint32 index=0;index < _NUM_COMPONENTS; | for (Uint32 index=0;index < _NUM_COMPONENTS; |
(_traceComponentMask.get())[index++]=false); | (_traceComponentMask.get())[index++]=false); |
|
|
_STRLEN_MAX_UNSIGNED_INT + (_STRLEN_MAX_PID_TID * 2) + 8 ]; | _STRLEN_MAX_UNSIGNED_INT + (_STRLEN_MAX_PID_TID * 2) + 8 ]; |
sprintf( | sprintf( |
message, | message, |
"[%d:%u:%s:%u]: ", |
"[%d:%s:%s:%u]: ", |
System::getPID(), | System::getPID(), |
Uint32(pegasus_thread_self()), |
Threads::id().buffer, |
fileName, | fileName, |
lineNum); | lineNum); |
| |
|
|
void Tracer::_traceCIMException( | void Tracer::_traceCIMException( |
const Uint32 traceComponent, | const Uint32 traceComponent, |
const Uint32 traceLevel, | const Uint32 traceLevel, |
CIMException cimException) |
const CIMException& cimException) |
{ | { |
if ( traceLevel == LEVEL1 ) | if ( traceLevel == LEVEL1 ) |
{ | { |
|
|
| |
sprintf( | sprintf( |
message, | message, |
"[%d:%u:%s:%u]: ", |
"[%d:%s:%s:%u]: ", |
System::getPID(), | System::getPID(), |
Uint32(pegasus_thread_self()), |
Threads::id().buffer, |
fileName, | fileName, |
lineNum); | lineNum); |
|
|
_trace(traceComponent,message,fmt,argList); | _trace(traceComponent,message,fmt,argList); |
| |
va_end(argList); | va_end(argList); |
|
|
| |
sprintf( | sprintf( |
message, | message, |
"[%d:%u:%s:%u]: ", |
"[%d:%s:%s:%u]: ", |
System::getPID(), | System::getPID(), |
Uint32(pegasus_thread_self()), |
Threads::id().buffer, |
fileName, | fileName, |
lineNum); | lineNum); |
|
|
_trace(traceComponent,message,fmt,argList); | _trace(traceComponent,message,fmt,argList); |
va_end(argList); | va_end(argList); |
| |
|
|
//////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////// |
//Checks if trace is enabled for the given component and level | //Checks if trace is enabled for the given component and level |
//////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////// |
Boolean Tracer::_isTraceEnabled(const Uint32 traceComponent, |
Boolean Tracer::_isTraceEnabled( |
|
const Uint32 traceComponent, |
const Uint32 traceLevel) | const Uint32 traceLevel) |
{ | { |
Tracer* instance = _getInstance(); | Tracer* instance = _getInstance(); |
|
|
// Construct the message header | // Construct the message header |
// The message header is in the following format | // The message header is in the following format |
// timestamp: <component name> [file name:line number] | // timestamp: <component name> [file name:line number] |
if (strcmp(message,"") != 0) |
if (*message != '\0') |
{ | { |
// << Wed Jul 16 10:58:40 2003 mdd >> _STRLEN_MAX_PID_TID is not used in this format string |
// << Wed Jul 16 10:58:40 2003 mdd >> _STRLEN_MAX_PID_TID is not used |
msgHeader = new char [strlen(message) |
// in this format string |
+ strlen(TRACE_COMPONENT_LIST[traceComponent]) |
msgHeader = new char [strlen(message) + |
+ strlen(timeStamp) + _STRLEN_MAX_PID_TID + 5]; |
strlen(TRACE_COMPONENT_LIST[traceComponent]) + |
|
strlen(timeStamp) + _STRLEN_MAX_PID_TID + 5]; |
| |
sprintf(msgHeader,"%s: %s %s",(const char*)timeStamp, | sprintf(msgHeader,"%s: %s %s",(const char*)timeStamp, |
TRACE_COMPONENT_LIST[traceComponent] ,message); | TRACE_COMPONENT_LIST[traceComponent] ,message); |
//delete [] msgHeader; |
|
} | } |
else | else |
{ | { |
|
|
// Allocate messageHeader. | // Allocate messageHeader. |
// Needs to be updated if additional info is added | // Needs to be updated if additional info is added |
// | // |
tmpBuffer = new char[_STRLEN_MAX_PID_TID + 6]; |
tmpBuffer = new char[2 * _STRLEN_MAX_PID_TID + 6]; |
sprintf(tmpBuffer, "[%u:%u]: ", System::getPID(), |
sprintf(tmpBuffer, "[%u:%s]: ", |
Uint32(pegasus_thread_self())); |
System::getPID(), Threads::id().buffer); |
msgHeader = new char [ strlen(timeStamp) + strlen(TRACE_COMPONENT_LIST[traceComponent]) + |
msgHeader = new char[strlen(timeStamp) + |
|
strlen(TRACE_COMPONENT_LIST[traceComponent]) + |
strlen(tmpBuffer) + 1 + 5 ]; | strlen(tmpBuffer) + 1 + 5 ]; |
| |
sprintf(msgHeader,"%s: %s %s ",(const char*)timeStamp, | sprintf(msgHeader,"%s: %s %s ",(const char*)timeStamp, |
TRACE_COMPONENT_LIST[traceComponent] ,tmpBuffer ); | TRACE_COMPONENT_LIST[traceComponent] ,tmpBuffer ); |
delete []tmpBuffer; | delete []tmpBuffer; |
//delete [] msgHeader; |
|
|
|
} | } |
| |
// Call trace file handler to write message | // Call trace file handler to write message |
|
|
String moduleName = _getInstance()->_moduleName; | String moduleName = _getInstance()->_moduleName; |
if (moduleName == String::EMPTY) | if (moduleName == String::EMPTY) |
{ | { |
return (_getInstance()->_traceHandler->isValidFilePath(filePath)); |
return _getInstance()->_traceHandler->isValidFilePath(filePath); |
} | } |
else | else |
{ | { |
String extendedFilePath = String(filePath) + "." + moduleName; | String extendedFilePath = String(filePath) + "." + moduleName; |
return (_getInstance()->_traceHandler->isValidFilePath( |
return _getInstance()->_traceHandler->isValidFilePath( |
extendedFilePath.getCString())); |
extendedFilePath.getCString()); |
} | } |
} | } |
| |
|
|
} | } |
| |
Boolean Tracer::isValidComponents( | Boolean Tracer::isValidComponents( |
const String& traceComponents, String& invalidComponents) |
const String& traceComponents, |
|
String& invalidComponents) |
{ | { |
// Validate the trace components and modify the traceComponents argument | // Validate the trace components and modify the traceComponents argument |
// to reflect the invalid components | // to reflect the invalid components |
|
|
// trace components is empty, it is a valid value so return true | // trace components is empty, it is a valid value so return true |
return _SUCCESS; | return _SUCCESS; |
} | } |
|
|
if ( invalidComponents != String::EMPTY ) | if ( invalidComponents != String::EMPTY ) |
{ | { |
retCode = false; | retCode = false; |
|
|
} | } |
| |
// PEGASUS_REMOVE_TRACE defines the compile time inclusion of the Trace | // PEGASUS_REMOVE_TRACE defines the compile time inclusion of the Trace |
// interfaces. If defined the interfaces map to empty functions |
// interfaces. This section defines the trace functions IF the remove |
|
// trace flag is NOT set. If it is set, they are defined as empty functions |
|
// in the header file. |
| |
#ifndef PEGASUS_REMOVE_TRACE | #ifndef PEGASUS_REMOVE_TRACE |
| |
|
|
//////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////// |
Uint32 Tracer::setTraceFile(const char* traceFile) | Uint32 Tracer::setTraceFile(const char* traceFile) |
{ | { |
|
if (*traceFile == 0) |
|
{ |
|
return 1; |
|
} |
|
|
String moduleName = _getInstance()->_moduleName; | String moduleName = _getInstance()->_moduleName; |
if (moduleName == String::EMPTY) | if (moduleName == String::EMPTY) |
{ | { |
return (_getInstance()->_traceHandler->setFileName(traceFile)); |
return _getInstance()->_traceHandler->setFileName(traceFile); |
} | } |
else | else |
{ | { |
String extendedTraceFile = String(traceFile) + "." + moduleName; | String extendedTraceFile = String(traceFile) + "." + moduleName; |
return (_getInstance()->_traceHandler->setFileName( |
return _getInstance()->_traceHandler->setFileName( |
extendedTraceFile.getCString())); |
extendedTraceFile.getCString()); |
} | } |
} | } |
| |
|
|
// Check if ALL is specified | // Check if ALL is specified |
if (String::equalNoCase(componentStr,"ALL")) | if (String::equalNoCase(componentStr,"ALL")) |
{ | { |
for (index=0; index < _NUM_COMPONENTS; |
for (index = 0; index < _NUM_COMPONENTS; index++) |
(_getInstance()->_traceComponentMask.get())[index++] = true); |
{ |
|
(_getInstance()->_traceComponentMask.get())[index] = true; |
|
} |
|
_traceOn = true; |
return ; | return ; |
} | } |
| |
// initialise ComponentMask array to False |
// initialize ComponentMask array to False |
for (index = 0;index < _NUM_COMPONENTS; |
for (index = 0; index < _NUM_COMPONENTS; index++) |
(_getInstance()->_traceComponentMask.get())[index++] = false); |
{ |
|
(_getInstance()->_traceComponentMask.get())[index] = false; |
|
} |
|
_traceOn = false; |
| |
// Append _COMPONENT_SEPARATOR to the end of the traceComponents | // Append _COMPONENT_SEPARATOR to the end of the traceComponents |
componentStr.append(_COMPONENT_SEPARATOR); | componentStr.append(_COMPONENT_SEPARATOR); |
|
|
componentName,TRACE_COMPONENT_LIST[index])) | componentName,TRACE_COMPONENT_LIST[index])) |
{ | { |
(_getInstance()->_traceComponentMask.get())[index]=true; | (_getInstance()->_traceComponentMask.get())[index]=true; |
|
_traceOn = true; |
| |
// Found component, break from the loop | // Found component, break from the loop |
break; | break; |
|
|
else | else |
{ | { |
// initialise ComponentMask array to False | // initialise ComponentMask array to False |
for (Uint32 index = 0;index < _NUM_COMPONENTS; |
for (Uint32 index = 0;index < _NUM_COMPONENTS; index++) |
(_getInstance()->_traceComponentMask.get())[index++] = false); |
{ |
|
(_getInstance()->_traceComponentMask.get())[index] = false; |
|
} |
|
_traceOn = 0; |
} | } |
return ; | return ; |
} | } |
| |
#endif |
void Tracer::traceEnter( |
|
TracerToken& token, |
|
Uint32 traceComponent, |
|
const char* method) |
|
{ |
|
if (_traceOn) |
|
{ |
|
token.component = traceComponent; |
|
token.method = method; |
|
|
|
_traceEnter( |
|
"unknown", 0, traceComponent, "%s %s", _METHOD_ENTER_MSG, method); |
|
} |
|
} |
|
|
|
void Tracer::traceExit(TracerToken& token) |
|
{ |
|
if (_traceOn) |
|
_traceExit( |
|
"unknown",0, token.component, "%s %s", |
|
_METHOD_EXIT_MSG, token.method); |
|
} |
|
|
|
void Tracer::traceEnter( |
|
TracerToken& token, |
|
const char* file, |
|
size_t line, |
|
Uint32 traceComponent, |
|
const char* method) |
|
{ |
|
if (_traceOn) |
|
{ |
|
token.component = traceComponent; |
|
token.method = method; |
|
|
|
_traceEnter( |
|
file, (Uint32)line, traceComponent, "%s %s", |
|
_METHOD_ENTER_MSG, method); |
|
} |
|
} |
|
|
|
void Tracer::traceExit( |
|
TracerToken& token, |
|
const char* file, |
|
size_t line) |
|
{ |
|
if (_traceOn) |
|
_traceExit( |
|
file, (Uint32)line, token.component, "%s %s", |
|
_METHOD_EXIT_MSG, token.method); |
|
} |
|
|
|
void Tracer::traceBuffer( |
|
const Uint32 traceComponent, |
|
const Uint32 traceLevel, |
|
const char* data, |
|
const Uint32 size) |
|
{ |
|
if (_traceOn) |
|
_traceBuffer(traceComponent, traceLevel, data, size); |
|
} |
|
|
|
void Tracer::traceBuffer( |
|
const char* fileName, |
|
const Uint32 lineNum, |
|
const Uint32 traceComponent, |
|
const Uint32 traceLevel, |
|
const char* data, |
|
const Uint32 size) |
|
{ |
|
if (_traceOn) |
|
{ |
|
_traceBuffer( |
|
fileName, lineNum, traceComponent, traceLevel, data, size); |
|
} |
|
} |
|
|
|
void Tracer::trace( |
|
const Uint32 traceComponent, |
|
const Uint32 traceLevel, |
|
const char *fmt, |
|
...) |
|
{ |
|
if (_traceOn) |
|
{ |
|
va_list argList; |
|
|
|
va_start(argList,fmt); |
|
_trace(traceComponent,traceLevel,fmt,argList); |
|
va_end(argList); |
|
} |
|
} |
|
|
|
void Tracer::trace( |
|
const char* fileName, |
|
const Uint32 lineNum, |
|
const Uint32 traceComponent, |
|
const Uint32 traceLevel, |
|
const char* fmt, |
|
...) |
|
{ |
|
if (_traceOn) |
|
{ |
|
va_list argList; |
|
|
|
va_start(argList,fmt); |
|
_trace(fileName,lineNum,traceComponent,traceLevel,fmt,argList); |
|
va_end(argList); |
|
} |
|
} |
|
|
|
void Tracer::trace( |
|
const char* fileName, |
|
const Uint32 lineNum, |
|
const Uint32 traceComponent, |
|
const Uint32 traceLevel, |
|
const String& traceString) |
|
{ |
|
if (_traceOn) |
|
{ |
|
_traceString( |
|
fileName, lineNum, traceComponent, traceLevel, traceString); |
|
} |
|
} |
|
|
|
void Tracer::traceCIMException( |
|
const Uint32 traceComponent, |
|
const Uint32 traceLevel, |
|
const CIMException& cimException) |
|
{ |
|
if (_traceOn) |
|
{ |
|
_traceCIMException(traceComponent, traceLevel, cimException); |
|
} |
|
} |
|
|
|
void Tracer::trace( |
|
const Uint32 traceComponent, |
|
const Uint32 level, |
|
const String& string) |
|
{ |
|
trace("unknown", 0, traceComponent, level, string); |
|
} |
|
|
|
#endif /* !PEGASUS_REMOVE_TRACE */ |
| |
PEGASUS_NAMESPACE_END | PEGASUS_NAMESPACE_END |