diff -r fb3763350a08 -r 4d54b72983ae taskswitcher/contextengine/trace/tslogutils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/taskswitcher/contextengine/trace/tslogutils.h Tue Jan 26 11:48:23 2010 +0200 @@ -0,0 +1,211 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Logging behavior +* +*/ + + +#ifndef TSLOGUTILS_H +#define TSLOGUTILS_H + +/** + * NOTE: This file contains the logic related to logging. Change only if you + * know what you're doing. + */ + + + + + + + + + + +#ifdef _DEBUG + +#include +#include + +static const TUint TSLOGERR = 2; /**< Used to create an error message */ + +// These macros are real macros, that should be used. For temporary purposes, these +// are left out and the logging is done by simple entry logging +#define _TSLOG_UNCONTROLLED_INPUT_MSG L"%s%d[%x:%x:%x]>%s UNCONTROLLED ENTRY!" +#define _TSLOG_MULTIPLE_ENTRY_MSG L"%s%d[%x:%x:%x]%s ADDITIONAL ENTRY!" +#define _TSLOG_UNCONTROLLER_EXIT_MSG L"%s%d[%x:%x:%x]<%s UNCONTROLLED EXIT!" +#define _TSLOG_MULTIPLE_EXIT_MSG L"%s%d[%x:%x:%x]%s ADDITIONAL EXIT!" +#define _TSLOG_TRAP_HARNESS_ENTRY L"_D%d[%x:%x:%x]TraceFramework: Entering trap harness" +#define _TSLOG_TRAP_HARNESS_EXIT L"_D%d[%x:%x:%x]TraceFramework: Exiting trap harness" +#define _TSLOG_TRAP_HARNESS_LEAVE L"_D%d[%x:%x:%x]TraceFramework: ---------- LEAVE OCCURRED !!! ---------- " +#define _TSLOG_API_PREFIX L"_A" +#define _TSLOG_LOCAL_PREFIX L"_L" + +/** +* @file +* trace_utils.h contains definitions needed for advanced tracing features. +* Tracing can be customized using the following compile time flags: +* - _DEBUG +* - With this flag undefined, all traces are disabled +* - __KERNEL_MODE__ +* - if kernel mode flag is defined, kernel macro variants are used (no unicode or shared heap related stuff, faster) +* - DISABLE_SYNTAX_CHECK +* - If this flag is defined, runtime syntax checking features are disabled from traces +*/ +#ifndef DISABLE_SYNTAX_CHECK + #define _MARK_ENTRY() _dc.inOk=ETrue + #define _DOINCHK() _dc.DoInChk() + #define _CHK_MULTIIN() _dc.ChkMultiIn() + #define _CHK_MULTIOUT() _dc.ChkMultiOut() + #define _MARK_EXIT() _dc.outOk=ETrue +#else + #define _MARK_ENTRY() + #define _DOINCHK() + #define _CHK_MULTIIN() + #define _CHK_MULTIOUT() + #define _MARK_EXIT() +#endif // DISABLE_SYNTAX_CHECK + +/** For tracing */ +#ifdef _TSLOG_RDEBUG + #define _IT(a) (TPtrC((const TText *)(a))) + #define _TSLOGPRINTER RDebug::Print + +/** For filedebug */ +#else // _TSLOG_RDEBUG + + /** Includes */ + #include + #include + #include + #include + +// both of headers defines KLogBufferSize +#ifndef __COMMSDEBUGUTILITY_H__ + #include +#endif + + #define _IT(a) KTsLogPath, KTsLogFile, EFileLoggingModeAppend, (TPtrC((const TText *)(a))) + #define _TSLOGPRINTER RFileLogger::WriteFormat +#endif // _TSLOG_RDEBUG + +class _TTsLogContext + { + public: + _TTsLogContext( + const TText* _fn, + const TUint _id, + const TUint _vis, + const TUint _addr, + const TUint _thdId, + const TUint _category=0 ) + : + iFn(_fn), + iId(_id), + iApi((TBool)_vis), + iAddr(_addr), + iThdId(_thdId), + iVis((_vis == 0 ? (TText*)_TSLOG_API_PREFIX : (TText*)_TSLOG_LOCAL_PREFIX)), + iCategory(_category) + #ifndef DISABLE_SYNTAX_CHECK + ,outOk(EFalse), inOk(EFalse) + #endif + { + } + ~_TTsLogContext() + { + #ifndef DISABLE_SYNTAX_CHECK + do + { + DoInChk(); + if (!outOk) + { + _TSLOGPRINTER(_IT(_TSLOG_UNCONTROLLER_EXIT_MSG), iVis, iCategory, iId, iThdId, iAddr, iFn); + } + } while (0); + #endif // DISABLE_SYNTAX_CHECK + } + + const TText* iFn; + const TUint iId; + const TText* iVis; + const TUint iAddr; + const TInt iThdId; + const TBool iApi; + const TUint iCategory; + + #ifndef DISABLE_SYNTAX_CHECK + inline void DoInChk() + { + if (!inOk) + { + _TSLOGPRINTER(_IT(_TSLOG_UNCONTROLLED_INPUT_MSG), iVis, iCategory, iId, iThdId, iAddr, iFn); + inOk = ETrue; + } + } + + inline void ChkMultiIn() + { + if (inOk) + { + _TSLOGPRINTER(_IT(_TSLOG_MULTIPLE_ENTRY_MSG), iVis, iCategory, iId, iThdId, iAddr, iFn); + } + } + + inline void ChkMultiOut() + { + if (outOk) + { + _TSLOGPRINTER(_IT(_TSLOG_MULTIPLE_EXIT_MSG), iVis, iCategory, iId, iThdId, iAddr, iFn); + } + } + + TBool inOk; + TBool outOk; + #endif // DISABLE_SYNTAX_CHECK + }; + +class _TTsLogTrapHandler: public TTrapHandler + { + public: + + _TTsLogTrapHandler(_TTsLogContext& _context) : _dc( _context ) + { + RThread me; + iThdId = (TInt)me.Id(); + } + void Trap() + { + _TSLOGPRINTER(_IT(_TSLOG_TRAP_HARNESS_ENTRY), 0, TSLOGERR, iThdId, this); + oldHandler->Trap(); + } + void UnTrap() + { + _TSLOGPRINTER(_IT(_TSLOG_TRAP_HARNESS_EXIT), 0, TSLOGERR, iThdId, this); + oldHandler->UnTrap(); + } + void Leave(TInt aValue) + { + _TSLOGPRINTER(_IT(_TSLOG_TRAP_HARNESS_LEAVE), 0, TSLOGERR, iThdId, this); + oldHandler->Leave(aValue); + } + TTrapHandler* oldHandler; + private: + _TTsLogContext& _dc; + TInt iThdId; + }; + +#endif // _DEBUG + +#endif // TSLOGUTILS_H