kerneltest/e32test/bench/d_kernbm.h
changeset 0 a41df078684a
equal deleted inserted replaced
-1:000000000000 0:a41df078684a
       
     1 // Copyright (c) 2005-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 // e32test\bench\d_kernbm.h
       
    15 // Kernel side header containg internal definitions for d_kernasmbm ldd
       
    16 // 
       
    17 //
       
    18 
       
    19 #ifndef __D_KERNBM_H__
       
    20 #define __D_KERNBM_H__
       
    21 
       
    22 #include "d_kernasmbm.h"
       
    23 
       
    24 /// Base class for kernel benchmarks
       
    25 class TKernelBenchmark
       
    26 	{
       
    27 public:
       
    28 	const TBmInfo& Info() const;
       
    29 	virtual TInt Run(const TBmParams& aParams, TInt& aResult);
       
    30 protected:
       
    31 	TKernelBenchmark(const TDesC8& aName);
       
    32 	TKernelBenchmark(const TDesC8& aName, TInt aAlignStep);
       
    33 private:
       
    34 	virtual void DoRun(const TBmParams& aParams) = 0;
       
    35 private:
       
    36 	TBmInfo iInfo;
       
    37 	};
       
    38 
       
    39 #define CALL_10_TIMES(x) x; x; x; x; x; x; x; x; x; x
       
    40 
       
    41 /// Macro to define a benchmark
       
    42 #define DEFINE_BENCHMARK(name, pre, test, post)                  \
       
    43 _LIT(KName_##name, #name);                                       \
       
    44 class TGeneralBenchmark_##name : public TKernelBenchmark         \
       
    45 	{                                                            \
       
    46 	public:                                                      \
       
    47 	TGeneralBenchmark_##name():TKernelBenchmark(KName_##name){}  \
       
    48 	virtual void DoRun(const TBmParams& aParams)                 \
       
    49 		{                                                        \
       
    50 		TInt its = aParams.iIts;                                 \
       
    51 		pre;                                                     \
       
    52 		for (TInt j = 0 ; j < its ; ++j)                         \
       
    53 			{                                                    \
       
    54 			CALL_10_TIMES(test);                                 \
       
    55 			}                                                    \
       
    56 		post;                                                    \
       
    57 		}                                                        \
       
    58 	} Instance_##name
       
    59 
       
    60 /// Macro to define a memory benchmark
       
    61 #define DEFINE_MEMORY_BENCHMARK(name, step, srcBase, destBase, pre, test, post) \
       
    62 _LIT(KName_##name, #name);                                       \
       
    63 class TMemoryBenchmark_##name : public TKernelBenchmark          \
       
    64 	{                                                            \
       
    65 public:                                                          \
       
    66 	TMemoryBenchmark_##name():                                   \
       
    67 		TKernelBenchmark(KName_##name, step){}                   \
       
    68 	virtual void DoRun(const TBmParams& aParams)                 \
       
    69 		{                                                        \
       
    70 		TInt its = aParams.iIts;                                 \
       
    71 		const TUint8* src = srcBase + aParams.iSourceAlign;      \
       
    72 		TUint8* dest = destBase + aParams.iDestAlign;            \
       
    73 		pre;                                                     \
       
    74 		for (TInt j = 0 ; j < its ; ++j)                         \
       
    75 			{                                                    \
       
    76 			CALL_10_TIMES(test);                                 \
       
    77 			}                                                    \
       
    78 		post;                                                    \
       
    79 		}                                                        \
       
    80 	} Instance_##name
       
    81 
       
    82 /// Base class for benchmarks using a second thread
       
    83 class TThreadedBenchmark : public TKernelBenchmark
       
    84 	{
       
    85 public:
       
    86 	virtual TInt Run(const TBmParams& aParams, TInt& aResult);
       
    87 protected:
       
    88 	TThreadedBenchmark(const TDesC8& aName, TInt aRelPri);
       
    89 private:
       
    90 	static TInt Thread2Func(TAny *aPtr);
       
    91 	virtual void DoRun2(TInt aIts) = 0;
       
    92 protected:
       
    93 	DThread* iThread1;
       
    94 	DThread* iThread2;
       
    95 private:
       
    96 	TInt iRelPri;
       
    97 	TInt iIts;
       
    98 	};
       
    99 
       
   100 /// Macro to define a thread benchmark easily
       
   101 #define DEFINE_THREADED_BENCHMARK(name, relPri, pre, test1, test2, post) \
       
   102 _LIT(KName_##name, #name);                                               \
       
   103 class TKernelBenchmark_##name : public TThreadedBenchmark                \
       
   104 	{                                                                    \
       
   105 public:                                                                  \
       
   106 	TKernelBenchmark_##name():TThreadedBenchmark(KName_##name, relPri){} \
       
   107 	virtual void DoRun(const TBmParams& aParams)                         \
       
   108 		{                                                                \
       
   109 		TInt its = aParams.iIts;                                         \
       
   110 		pre;                                                             \
       
   111 		for (TInt j = 0 ; j < its*10 ; ++j)                              \
       
   112 			{                                                            \
       
   113 			test1;                                                       \
       
   114 			}                                                            \
       
   115 		post;                                                            \
       
   116 		}                                                                \
       
   117 	virtual void DoRun2(TInt aIts)                                       \
       
   118 		{                                                                \
       
   119 		for (TInt j = 0 ; j < aIts*10 ; ++j)                             \
       
   120 			{                                                            \
       
   121 			test2;                                                       \
       
   122 			}                                                            \
       
   123 		}                                                                \
       
   124 	} Instance_##name
       
   125 
       
   126 /// Initialise data used by benchmarks
       
   127 TInt InitData();
       
   128 
       
   129 /// Clean up data used by benchmarks
       
   130 void CloseData();
       
   131 
       
   132 /// Pointer to user-side buffer, needed by some tests
       
   133 extern TUint8* UserPtr;
       
   134 
       
   135 /// List of defined benchmarks
       
   136 extern RPointerArray<TKernelBenchmark> KernelBenchmarks;
       
   137 
       
   138 /// Macro to 32-byte align addresses
       
   139 #define ALIGN_ADDR(a) ((TAny*)((((TInt)a) & ~0x1f) + 0x20))
       
   140 
       
   141 #endif