userlibandfileserver/fileserver/ftrace/f32trace.h
changeset 9 96e5fb8b040d
child 43 c1f20ce4abcf
equal deleted inserted replaced
-1:000000000000 9:96e5fb8b040d
       
     1 // Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of the License "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 //
       
    15 
       
    16 /**
       
    17  @file
       
    18  @internalTechnology
       
    19  @prototype
       
    20 */
       
    21 
       
    22 #if !defined(__FTRACE_H__)
       
    23 #define __FTRACE_H__
       
    24 
       
    25 #include <e32cmn.h>
       
    26 #include <e32btrace.h>
       
    27 
       
    28 
       
    29 #ifndef __KERNEL_MODE__
       
    30 	#include <e32std.h>
       
    31 #endif
       
    32 
       
    33 #include "f32tracedef.h"
       
    34 
       
    35 #if defined(__EABI__)
       
    36 #pragma diag_suppress 1446		// non-POD class type passed through ellipsis
       
    37 #endif
       
    38 
       
    39 /**
       
    40 @internalComponent
       
    41 @prototype
       
    42 */
       
    43 
       
    44 #if ((defined (_DEBUG) && defined (SYMBIAN_FTRACE_ENABLE_UDEB)) ||		\
       
    45 	(!defined(_DEBUG) && defined (SYMBIAN_FTRACE_ENABLE_UREL)))
       
    46 	#define SYMBIAN_FTRACE_ENABLE
       
    47 #endif
       
    48 
       
    49 
       
    50 
       
    51 inline TBool Trace1(TClassification aClassification, TFormatId aFormatId, TModuleUid aUid, TUint a1)
       
    52 	{
       
    53 	return BTraceFilteredContext12(
       
    54 		aClassification,					// Category
       
    55 		0,								// Sub-category
       
    56 		aUid,		// UID
       
    57 		aFormatId,
       
    58 		a1);							
       
    59 	}
       
    60 
       
    61 inline TBool TraceN(TClassification aClassification, TFormatId aFormatId,  TModuleUid aUid, TInt aArgCount, TUint a1, ...)
       
    62 	{
       
    63 	const TInt KMaxArgs = 8;
       
    64 	if (aArgCount > KMaxArgs)
       
    65 		return EFalse;
       
    66 	TUint args[KMaxArgs];
       
    67 	TInt argLen = aArgCount << 2;
       
    68 	memcpy(args, &a1, argLen);
       
    69 	
       
    70 	return BTraceFilteredContextN(
       
    71 		aClassification,					// Category
       
    72 		0,									// Sub-category
       
    73 		aUid,		// UID
       
    74 		aFormatId,
       
    75 		args,
       
    76 		argLen);								
       
    77 	}
       
    78 
       
    79 
       
    80 inline TBool TraceStr(TClassification aClassification, TFormatId aFormatId,  TModuleUid aUid, const TAny* aData, TInt aDataSize)
       
    81 	{
       
    82 	// NB This will truncate the data (!!!) - 
       
    83 	// we can't use BTraceFilteredContextBig for this as it doesn't have room for the format Id
       
    84 	return BTraceFilteredContextN(		
       
    85 		aClassification,					// Category
       
    86 		0,								// Sub-category
       
    87 		aUid,		// UID
       
    88 		aFormatId,
       
    89 		aData, 
       
    90 		aDataSize);							
       
    91 	}
       
    92 
       
    93 
       
    94 
       
    95 
       
    96 
       
    97 
       
    98 
       
    99 class RFTrace : public RBusLogicalChannel
       
   100 	{
       
   101 public:
       
   102 	enum {EMajorVersionNumber=1,EMinorVersionNumber=0,EBuildVersionNumber=1};
       
   103 	enum TControl
       
   104         {
       
   105 		ETraceMultiple,
       
   106 		};
       
   107 
       
   108 #ifndef __KERNEL_MODE__
       
   109 
       
   110 public:
       
   111 	inline TInt Open(TOwnerType aType)
       
   112 		{return DoCreate(_L("FTrace"),TVersion(),0,NULL,NULL,aType);}
       
   113 
       
   114 	inline 	TBool TraceMultiple(TClassification aClassification, TFormatId aFormatId, TUint32 aUid, TInt aDescriptorCount, TUint64 aParam1, ...)
       
   115 		{
       
   116 		if (Handle() == NULL)
       
   117 			return EFalse;
       
   118 		// ARM passes first 4 parameters in registers, so....
       
   119 		// parcel-up the first four parameters in an array and pass a pointer to the array to the LDD; 
       
   120 		// the next parameter(s) should be on the stack, so we can just pass a pointer to the first element 
       
   121 		TUint args[4] = {aClassification, aFormatId, aUid, aDescriptorCount};
       
   122 		TUint64* pArg1 = &aParam1;
       
   123 		TInt r = DoControl(ETraceMultiple, (TAny*) args, pArg1);
       
   124 		if (r |= KErrNone)
       
   125 			User::Panic(_L("FSCLIENT Trace panic"), 0);
       
   126 		return ETrue;
       
   127 		}
       
   128 
       
   129 	static inline TUint64 PkgData(const TDesC16& aDes)	{return MAKE_TUINT64( ((TUint) aDes.Ptr()), (aDes.Length()<<1) | (EPtrC<<KShiftDesType));}
       
   130 	static inline TUint64 PkgData(const TDesC8& aDes)	{return MAKE_TUINT64( ((TUint) aDes.Ptr()), aDes.Length() | (EPtrC<<KShiftDesType));}
       
   131 
       
   132 	static inline TUint64 PkgData(TChar aVal)			{return MAKE_TUINT64(aVal, sizeof(aVal));}
       
   133 	static inline TUint64 PkgData(TUint8 aVal)			{return MAKE_TUINT64(aVal, sizeof(aVal));}
       
   134 	static inline TUint64 PkgData(TInt8 aVal)			{return MAKE_TUINT64(aVal, sizeof(aVal));}
       
   135 	static inline TUint64 PkgData(TUint16 aVal)			{return MAKE_TUINT64(aVal, sizeof(aVal));}
       
   136 	static inline TUint64 PkgData(TInt16 aVal)			{return MAKE_TUINT64(aVal, sizeof(aVal));}
       
   137 	static inline TUint64 PkgData(TUint32 aVal)			{return MAKE_TUINT64(aVal, sizeof(aVal));}
       
   138 	static inline TUint64 PkgData(TInt32 aVal)			{return MAKE_TUINT64(aVal, sizeof(aVal));}
       
   139 	static inline TUint64 PkgData(TUint aVal)			{return MAKE_TUINT64(aVal, sizeof(aVal));}
       
   140 	static inline TUint64 PkgData(TInt aVal)			{return MAKE_TUINT64(aVal, sizeof(aVal));}
       
   141 	
       
   142 #endif	// __KERNEL_MODE__
       
   143 
       
   144 private:
       
   145 
       
   146 	};
       
   147 
       
   148 // This class is used to reconstruct an RMessage2 object from a message handle so that we can 
       
   149 // call RMessagePtr2::Client() and then RThread::Id() to retrieve the client's thread Id.
       
   150 // This is useful for matching client requests to calls to the proxydrive
       
   151 class RDummyMessage : public RMessage2
       
   152 	{
       
   153 public:
       
   154 	inline RDummyMessage(TInt aHandle) {iHandle = aHandle; iFunction=-1;}
       
   155 	};
       
   156 
       
   157 
       
   158 
       
   159 #ifdef SYMBIAN_FTRACE_ENABLE
       
   160 
       
   161 	// Use these macros for tracing 1-8 TUints...
       
   162 	#define TRACE0(aClassification, aFormatId, aUid)								Trace1(aClassification, aFormatId, aUid, 0)
       
   163 	#define TRACE1(aClassification, aFormatId, aUid, a1)							Trace1(aClassification, aFormatId, aUid, (TUint) a1)
       
   164 	#define TRACE2(aClassification, aFormatId, aUid, a1, a2)						TraceN(aClassification, aFormatId, aUid, 2, (TUint) a1, (TUint) a2)
       
   165 	#define TRACE3(aClassification, aFormatId, aUid, a1, a2, a3)					TraceN(aClassification, aFormatId, aUid, 3, (TUint) a1, (TUint) a2, (TUint) a3)
       
   166 	#define TRACE4(aClassification, aFormatId, aUid, a1, a2, a3, a4)				TraceN(aClassification, aFormatId, aUid, 4, (TUint) a1, (TUint) a2, (TUint) a3, (TUint) a4)
       
   167 	#define TRACE5(aClassification, aFormatId, aUid, a1, a2, a3, a4, a5)			TraceN(aClassification, aFormatId, aUid, 5, (TUint) a1, (TUint) a2, (TUint) a3, (TUint) a4, (TUint) a5)
       
   168 	#define TRACE6(aClassification, aFormatId, aUid, a1, a2, a3, a4, a5, a6)		TraceN(aClassification, aFormatId, aUid, 6, (TUint) a1, (TUint) a2, (TUint) a3, (TUint) a4, (TUint) a5, (TUint) a6)
       
   169 	#define TRACE7(aClassification, aFormatId, aUid, a1, a2, a3, a4, a5, a6, a7)	TraceN(aClassification, aFormatId, aUid, 7, (TUint) a1, (TUint) a2, (TUint) a3, (TUint) a4, (TUint) a5, (TUint) a6, (TUint) a7)
       
   170 	#define TRACE8(aClassification, aFormatId, aUid, a1, a2, a3, a4, a5, a6, a7, a8)TraceN(aClassification, aFormatId, aUid, 8, (TUint) a1, (TUint) a2, (TUint) a3, (TUint) a4, (TUint) a5, (TUint) a6, (TUint) a7, (TUint) a8)
       
   171 
       
   172 	#define TRACESTR(aClassification, aFormatId, aUid, aData, aDataSize)			TraceStr(aClassification, aFormatId, aUid, aData, aDataSize)
       
   173 
       
   174 	#define RFTRACE_LOAD							\
       
   175 		User::LoadLogicalDevice(_L("D_FTRACE"));	
       
   176 
       
   177 	// macros for opening and closing the trace LDD, which is used for tracing arbitrary data types....
       
   178 #if defined(__DLL__)
       
   179 	#define RFTRACE_OPEN							\
       
   180 		RFTrace TheFtrace;							\
       
   181 		TheFtrace.SetHandle((TInt) Dll::Tls());		\
       
   182 		if (TheFtrace.Handle() == NULL)				\
       
   183 			{										\
       
   184 			TheFtrace.Open(EOwnerThread);			\
       
   185 			Dll::SetTls((TAny*) TheFtrace.Handle());\
       
   186 			}
       
   187 
       
   188 	#define RFTRACE_CLOSE							\
       
   189 		{											\
       
   190 		RFTrace ftrace;								\
       
   191 		TInt handle = (TInt) Dll::Tls();			\
       
   192 		ftrace.SetHandle(handle);					\
       
   193 		ftrace.Close();								\
       
   194 		Dll::SetTls(NULL);							\
       
   195 		}		
       
   196 #else
       
   197 	extern RFTrace TheFtrace;
       
   198 	#define RFTRACE_OPEN
       
   199 	#define RFTRACE_CLOSE 
       
   200 #endif
       
   201 	
       
   202 	// Use these macros for tracing 1-8 arbitrary data types....
       
   203 	#define TRACEMULT1(aClassification, aFormatId, aUid, a1)						\
       
   204 		if (BTrace::CheckFilter2(aClassification, aUid))								\
       
   205 			{																			\
       
   206 			RFTRACE_OPEN																\
       
   207 			TheFtrace.TraceMultiple(aClassification,aFormatId,aUid,1,RFTrace::PkgData(a1));	\
       
   208 			}
       
   209 
       
   210 	#define TRACEMULT2(aClassification, aFormatId, aUid, a1, a2)					\
       
   211 		if (BTrace::CheckFilter2(aClassification, aUid))								\
       
   212 			{																			\
       
   213 			RFTRACE_OPEN																\
       
   214 			TheFtrace.TraceMultiple(aClassification,aFormatId,aUid,2,RFTrace::PkgData(a1),RFTrace::PkgData(a2));	\
       
   215 			}
       
   216 
       
   217 	#define TRACEMULT3(aClassification, aFormatId, aUid, a1, a2, a3)				\
       
   218 		if (BTrace::CheckFilter2(aClassification, aUid))								\
       
   219 			{																			\
       
   220 			RFTRACE_OPEN																\
       
   221 			TheFtrace.TraceMultiple(aClassification,aFormatId,aUid,3,RFTrace::PkgData(a1),RFTrace::PkgData(a2),RFTrace::PkgData(a3)); \
       
   222 			}
       
   223 
       
   224 	#define TRACEMULT4(aClassification, aFormatId, aUid, a1, a2, a3, a4)			\
       
   225 		if (BTrace::CheckFilter2(aClassification, aUid))								\
       
   226 			{																			\
       
   227 			RFTRACE_OPEN																\
       
   228 			TheFtrace.TraceMultiple(aClassification,aFormatId,aUid,4,RFTrace::PkgData(a1),RFTrace::PkgData(a2),RFTrace::PkgData(a3),RFTrace::PkgData(a4)); \
       
   229 			}
       
   230 
       
   231 	#define TRACEMULT5(aClassification, aFormatId, aUid, a1, a2, a3, a4, a5)		\
       
   232 		if (BTrace::CheckFilter2(aClassification, aUid))								\
       
   233 			{																			\
       
   234 			RFTRACE_OPEN																\
       
   235 			TheFtrace.TraceMultiple(aClassification,aFormatId,aUid,5,RFTrace::PkgData(a1),RFTrace::PkgData(a2),RFTrace::PkgData(a3),RFTrace::PkgData(a4),RFTrace::PkgData(a5)); \
       
   236 			}
       
   237 
       
   238 	#define TRACEMULT6(aClassification, aFormatId, aUid, a1, a2, a3, a4, a5, a6)	\
       
   239 		if (BTrace::CheckFilter2(aClassification, aUid))								\
       
   240 			{																			\
       
   241 			RFTRACE_OPEN																\
       
   242 			TheFtrace.TraceMultiple(aClassification,aFormatId,aUid,6,RFTrace::PkgData(a1),RFTrace::PkgData(a2),RFTrace::PkgData(a3),RFTrace::PkgData(a4),RFTrace::PkgData(a5),RFTrace::PkgData(a6)); \
       
   243 			}
       
   244 
       
   245 	#define TRACEMULT7(aClassification, aFormatId, aUid, a1, a2, a3, a4, a5, a6, a7)\
       
   246 		if (BTrace::CheckFilter2(aClassification, aUid))								\
       
   247 			{																			\
       
   248 			RFTRACE_OPEN																\
       
   249 			TheFtrace.TraceMultiple(aClassification,aFormatId,aUid,7,RFTrace::PkgData(a1),RFTrace::PkgData(a2),RFTrace::PkgData(a3),RFTrace::PkgData(a4),RFTrace::PkgData(a5),RFTrace::PkgData(a6),RFTrace::PkgData(a7)); \
       
   250 			}
       
   251 
       
   252 	#define TRACEMULT8(aClassification, aFormatId, aUid, a1, a2, a3, a4, a5, a6, a7, a8)\
       
   253 		if (BTrace::CheckFilter2(aClassification, aUid))								\
       
   254 			{																			\
       
   255 			RFTRACE_OPEN																\
       
   256 			TheFtrace.TraceMultiple(aClassification,aFormatId,aUid,8,RFTrace::PkgData(a1),RFTrace::PkgData(a2),RFTrace::PkgData(a3),RFTrace::PkgData(a4),RFTrace::PkgData(a5),RFTrace::PkgData(a6),RFTrace::PkgData(a7),RFTrace::PkgData(a8)); \
       
   257 			}
       
   258 
       
   259 
       
   260 	// This macro retrieves the client thread ID from a message, which is useful for 
       
   261 	// associating server-side requests with client threads
       
   262 	#define TRACETHREADID(aMsg)												\
       
   263 		RThread clientThread;												\
       
   264 		TInt64 threadId = KLocalMessageHandle;								\
       
   265 		if (aMsg.Handle()!=KLocalMessageHandle)								\
       
   266 			{																\
       
   267 			if (aMsg.Client(clientThread) == KErrNone)						\
       
   268 				{															\
       
   269 				threadId = clientThread.Id();								\
       
   270 				clientThread.Close();										\
       
   271 				}															\
       
   272 			}																
       
   273 
       
   274 	// This macro retrieves the client thread ID from a message handle
       
   275 	#define TRACETHREADIDH(aMsgHandle)			\
       
   276 		RDummyMessage msg(aMsgHandle);			\
       
   277 		TRACETHREADID(msg);		
       
   278 
       
   279 
       
   280 	// Use these macros for tracing a return code followed by 1-7 TUints...
       
   281 	// If the return code is negative the UTF::EError classification is used IF ENABLED  - otherwise the passed classification is used
       
   282 	#define TRACERET1(aClassification, aFormatId, aUid, r)								TRACE1( (TClassification) ((r < 0 && BTrace::CheckFilter2(UTF::EError, aUid)) ? UTF::EError : aClassification), aFormatId, aUid, r);
       
   283 	#define TRACERET2(aClassification, aFormatId, aUid, r, a2)							TRACE2( (TClassification) ((r < 0 && BTrace::CheckFilter2(UTF::EError, aUid)) ? UTF::EError : aClassification), aFormatId, aUid, r, a2)
       
   284 	#define TRACERET3(aClassification, aFormatId, aUid, r, a2, a3)						TRACE3( (TClassification) ((r < 0 && BTrace::CheckFilter2(UTF::EError, aUid)) ? UTF::EError : aClassification), aFormatId, aUid, r, a2, a3)
       
   285 	#define TRACERET4(aClassification, aFormatId, aUid, r, a2, a3, a4)					TRACE4( (TClassification) ((r < 0 && BTrace::CheckFilter2(UTF::EError, aUid)) ? UTF::EError : aClassification), aFormatId, aUid, r, a2, a3, a4)
       
   286 	#define TRACERET5(aClassification, aFormatId, aUid, r, a2, a3, a4, a5)				TRACE5( (TClassification) ((r < 0 && BTrace::CheckFilter2(UTF::EError, aUid)) ? UTF::EError : aClassification), aFormatId, aUid, r, a2, a3, a4, a5)
       
   287 	#define TRACERET6(aClassification, aFormatId, aUid, r, a2, a3, a4, a5, a6)			TRACE6( (TClassification) ((r < 0 && BTrace::CheckFilter2(UTF::EError, aUid)) ? UTF::EError : aClassification), aFormatId, aUid, r, a2, a3, a4, a5, a6)
       
   288 	#define TRACERET7(aClassification, aFormatId, aUid, r, a2, a3, a4, a5, a6, a7)		TRACE7( (TClassification) ((r < 0 && BTrace::CheckFilter2(UTF::EError, aUid)) ? UTF::EError : aClassification), aFormatId, aUid, r, a2, a3, a4, a5, a6, a7)
       
   289 	#define TRACERET8(aClassification, aFormatId, aUid, r, a2, a3, a4, a5, a6, a7, a8)	TRACE8( (TClassification) ((r < 0 && BTrace::CheckFilter2(UTF::EError, aUid)) ? UTF::EError : aClassification), aFormatId, aUid, r, a2, a3, a4, a5, a6, a7, a8)
       
   290 
       
   291 	// Use these macros for tracing a return code followed by 1-7 arbitrary data types....
       
   292 	// If the return code is negative the UTF::EError classification is used IF ENABLED  - otherwise the passed classification is used
       
   293 	#define TRACERETMULT1(aClassification, aFormatId, aUid, r)								TRACEMULT1( (TClassification) ((r < 0 && BTrace::CheckFilter2(UTF::EError, aUid)) ? UTF::EError : aClassification), aFormatId, aUid, r);
       
   294 	#define TRACERETMULT2(aClassification, aFormatId, aUid, r, a2)							TRACEMULT2( (TClassification) ((r < 0 && BTrace::CheckFilter2(UTF::EError, aUid)) ? UTF::EError : aClassification), aFormatId, aUid, r, a2)
       
   295 	#define TRACERETMULT3(aClassification, aFormatId, aUid, r, a2, a3)						TRACEMULT3( (TClassification) ((r < 0 && BTrace::CheckFilter2(UTF::EError, aUid)) ? UTF::EError : aClassification), aFormatId, aUid, r, a2, a3)
       
   296 	#define TRACERETMULT4(aClassification, aFormatId, aUid, r, a2, a3, a4)					TRACEMULT4( (TClassification) ((r < 0 && BTrace::CheckFilter2(UTF::EError, aUid)) ? UTF::EError : aClassification), aFormatId, aUid, r, a2, a3, a4)
       
   297 	#define TRACERETMULT5(aClassification, aFormatId, aUid, r, a2, a3, a4, a5)				TRACEMULT5( (TClassification) ((r < 0 && BTrace::CheckFilter2(UTF::EError, aUid)) ? UTF::EError : aClassification), aFormatId, aUid, r, a2, a3, a4, a5)
       
   298 	#define TRACERETMULT6(aClassification, aFormatId, aUid, r, a2, a3, a4, a5, a6)			TRACEMULT6( (TClassification) ((r < 0 && BTrace::CheckFilter2(UTF::EError, aUid)) ? UTF::EError : aClassification), aFormatId, aUid, r, a2, a3, a4, a5, a6)
       
   299 	#define TRACERETMULT7(aClassification, aFormatId, aUid, r, a2, a3, a4, a5, a6, a7)		TRACEMULT7( (TClassification) ((r < 0 && BTrace::CheckFilter2(UTF::EError, aUid)) ? UTF::EError : aClassification), aFormatId, aUid, r, a2, a3, a4, a5, a6, a7)
       
   300 	#define TRACERETMULT8(aClassification, aFormatId, aUid, r, a2, a3, a4, a5, a6, a7, a8)	TRACEMULT8( (TClassification) ((r < 0 && BTrace::CheckFilter2(UTF::EError, aUid)) ? UTF::EError : aClassification), aFormatId, aUid, r, a2, a3, a4, a5, a6, a7, a8)
       
   301 
       
   302 
       
   303 #else		// #ifdef SYMBIAN_FTRACE_ENABLE
       
   304 	#define TRACE0(aClassification, aFormatId, aUid)
       
   305 	#define TRACE1(aClassification, aFormatId, aUid, a1)
       
   306 	#define TRACE2(aClassification, aFormatId, aUid, a1, a2)
       
   307 	#define TRACE3(aClassification, aFormatId, aUid, a1, a2, a3)
       
   308 	#define TRACE4(aClassification, aFormatId, aUid, a1, a2, a3, a4)
       
   309 	#define TRACE5(aClassification, aFormatId, aUid, a1, a2, a3, a4, a5)
       
   310 	#define TRACE6(aClassification, aFormatId, aUid, a1, a2, a3, a4, a5, a6)
       
   311 	#define TRACE7(aClassification, aFormatId, aUid, a1, a2, a3, a4, a5, a6, a7)
       
   312 	#define TRACE8(aClassification, aFormatId, aUid, a1, a2, a3, a4, a5, a6, a7, a8)
       
   313 	#define TRACESTR(aClassification, aFormatId, aUid, aData, aDataSize)
       
   314 
       
   315 	#define RFTRACE_LOAD
       
   316 	#define RFTRACE_OPEN
       
   317 	#define RFTRACE_CLOSE
       
   318 
       
   319 	#define TRACEMULT1(aClassification, aFormatId, aUid, a1)
       
   320 	#define TRACEMULT2(aClassification, aFormatId, aUid, a1, a2)
       
   321 	#define TRACEMULT3(aClassification, aFormatId, aUid, a1, a2, a3)
       
   322 	#define TRACEMULT4(aClassification, aFormatId, aUid, a1, a2, a3, a4)
       
   323 	#define TRACEMULT5(aClassification, aFormatId, aUid, a1, a2, a3, a4, a5)
       
   324 	#define TRACEMULT6(aClassification, aFormatId, aUid, a1, a2, a3, a4, a5, a6)
       
   325 	#define TRACEMULT7(aClassification, aFormatId, aUid, a1, a2, a3, a4, a5, a6, a7)
       
   326 	#define TRACEMULT8(aClassification, aFormatId, aUid, a1, a2, a3, a4, a5, a6, a7, a8)
       
   327 	#define TRACETHREADID(aMsg)
       
   328 	#define TRACETHREADIDH(aMsgHandle)
       
   329 
       
   330 	#define TRACERET1(aClassification, aFormatId, aUid, r)
       
   331 	#define TRACERET2(aClassification, aFormatId, aUid, r, a2)
       
   332 	#define TRACERET3(aClassification, aFormatId, aUid, r, a2, a3)
       
   333 	#define TRACERET4(aClassification, aFormatId, aUid, r, a2, a3, a4)
       
   334 	#define TRACERET5(aClassification, aFormatId, aUid, r, a2, a3, a4, a5)
       
   335 	#define TRACERET6(aClassification, aFormatId, aUid, r, a2, a3, a4, a5, a6)
       
   336 	#define TRACERET7(aClassification, aFormatId, aUid, r, a2, a3, a4, a5, a6, a7)
       
   337 	#define TRACERET8(aClassification, aFormatId, aUid, r, a2, a3, a4, a5, a6, a7, a8)
       
   338 
       
   339 	#define TRACERETMULT1(aClassification, aFormatId, aUid, r)
       
   340 	#define TRACERETMULT2(aClassification, aFormatId, aUid, r, a2)
       
   341 	#define TRACERETMULT3(aClassification, aFormatId, aUid, r, a2, a3)
       
   342 	#define TRACERETMULT4(aClassification, aFormatId, aUid, r, a2, a3, a4)
       
   343 	#define TRACERETMULT5(aClassification, aFormatId, aUid, r, a2, a3, a4, a5)
       
   344 	#define TRACERETMULT6(aClassification, aFormatId, aUid, r, a2, a3, a4, a5, a6)
       
   345 	#define TRACERETMULT7(aClassification, aFormatId, aUid, r, a2, a3, a4, a5, a6, a7)
       
   346 	#define TRACERETMULT8(aClassification, aFormatId, aUid, r, a2, a3, a4, a5, a6, a7, a8)
       
   347 #endif
       
   348 
       
   349 
       
   350 
       
   351 
       
   352 #endif
       
   353