Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h)
Have multiple extension sections in the bld.inf, one for each version
of the compiler. The RVCT version building the tools will build the
runtime libraries for its version, but make sure we extract all the other
versions from zip archives. Also add the archive for RVCT4.
// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of the License "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:
//
#include <e32test.h>
#include <e32property.h>
#include "bm_suite.h"
static const TInt32 KUidPropBenchmarkCategoryValue = 0x101f75b7;
static const TUid KPropBenchmarkCategory = { KUidPropBenchmarkCategoryValue };
static _LIT_SECURITY_POLICY_PASS(KPassPolicy);
typedef void (*MeasurementFunc)(TBMResult*, TBMUInt64 aIter, struct Measurement*);
enum TSetGetType
{
EOneArg,
EThreeArgsInt,
EThreeArgsBuf8,
EThreeArgsBuf16
};
struct Measurement
{
MeasurementFunc iFunc;
TPtrC iName;
TBool iRemote;
RProperty::TType iType;
TInt iSize;
TSetGetType iSetGetType;
Measurement(MeasurementFunc aFunc, const TDesC& aName,
RProperty::TType aType, TInt aSize, TBool aRemote = EFalse,
TSetGetType aSetGetType = EOneArg) :
iFunc(aFunc), iName(aName), iRemote(aRemote), iType(aType), iSize(aSize),
iSetGetType(aSetGetType) {}
};
class Property : public BMProgram
{
public :
Property() : BMProgram(_L("Properties"))
{}
virtual TBMResult* Run(TBMUInt64 aIter, TInt* aCount);
static TBMResult iResults[];
static Measurement iMeasurements[];
static void NotificationLatencyParent(TBMResult* aResult, TBMUInt64 aIter, Measurement*);
static TInt NotificationLatencyChild(TAny*);
static void SetOverhead(TBMResult* aResult, TBMUInt64 aIter, struct Measurement* aM);
static void GetOverhead(TBMResult* aResult, TBMUInt64 aIter, struct Measurement* aM);
private:
static TBuf8<RProperty::KMaxPropertySize> iInBuf;
static TBuf8<RProperty::KMaxPropertySize> iOutBuf;
static TBuf16<RProperty::KMaxPropertySize> iInBuf16;
static TBuf16<RProperty::KMaxPropertySize> iOutBuf16;
};
Measurement Property::iMeasurements[] =
{
Measurement(&Property::NotificationLatencyParent, _L("Local Int Notification Latency "),
RProperty::EInt, 0, EFalse),
Measurement(&Property::NotificationLatencyParent, _L("Remote Int Notification Latency"),
RProperty::EInt, 0,ETrue),
Measurement(&Property::NotificationLatencyParent, _L("Local Byte(1) Notification Latency"),
RProperty::EByteArray, 1, EFalse),
Measurement(&Property::NotificationLatencyParent, _L("Remote Byte(1) Notification Latency"),
RProperty::EByteArray, 1, ETrue),
Measurement(&Property::NotificationLatencyParent, _L("Local Byte(8) Notification Latency"),
RProperty::EByteArray, 8, EFalse),
Measurement(&Property::NotificationLatencyParent, _L("Remote Byte(8) Notification Latency"),
RProperty::EByteArray, 8,ETrue),
Measurement(&Property::NotificationLatencyParent, _L("Local Byte(512) Notification Latency"),
RProperty::EByteArray, 512, EFalse),
Measurement(&Property::NotificationLatencyParent, _L("Remote Byte(512) Notification Latency"),
RProperty::EByteArray, 512,ETrue),
Measurement(&Property::NotificationLatencyParent, _L("Local Int Notification Latency ThreeArgsInt"),
RProperty::EInt, 0, EFalse, EThreeArgsInt),
Measurement(&Property::NotificationLatencyParent, _L("Remote Int Notification Latency ThreeArgsInt"),
RProperty::EInt, 0,ETrue, EThreeArgsInt),
Measurement(&Property::NotificationLatencyParent, _L("Local Byte(1) Notification Latency ThreeArgsBuf8"),
RProperty::EByteArray, 1, EFalse, EThreeArgsBuf8),
Measurement(&Property::NotificationLatencyParent, _L("Remote Byte(1) Notification Latency ThreeArgsBuf8"),
RProperty::EByteArray, 1, ETrue, EThreeArgsBuf8),
Measurement(&Property::NotificationLatencyParent, _L("Local TUint16(1) Notification Latency ThreeArgsBuf16"),
RProperty::EByteArray, 1, EFalse, EThreeArgsBuf16),
Measurement(&Property::NotificationLatencyParent, _L("Remote TUint16(1) Notification Latency ThreeArgsBuf16"),
RProperty::EByteArray, 1, ETrue, EThreeArgsBuf16),
Measurement(&Property::NotificationLatencyParent, _L("Local Byte(8) Notification Latency ThreeArgsBuf8"),
RProperty::EByteArray, 8, EFalse, EThreeArgsBuf8),
Measurement(&Property::NotificationLatencyParent, _L("Remote Byte(8) Notification Latency ThreeArgsBuf8"),
RProperty::EByteArray, 8,ETrue, EThreeArgsBuf8),
Measurement(&Property::NotificationLatencyParent, _L("Local TUint16(8) Notification Latency ThreeArgsBuf16"),
RProperty::EByteArray, 8, EFalse, EThreeArgsBuf16),
Measurement(&Property::NotificationLatencyParent, _L("Remote TUint16(8) Notification Latency ThreeArgsBuf16"),
RProperty::EByteArray, 8,ETrue, EThreeArgsBuf16),
Measurement(&Property::NotificationLatencyParent, _L("Local Byte(512) Notification Latency ThreeArgsBuf8"),
RProperty::EByteArray, 512, EFalse, EThreeArgsBuf8),
Measurement(&Property::NotificationLatencyParent, _L("Remote Byte(512) Notification Latency ThreeArgsBuf8"),
RProperty::EByteArray, 512,ETrue, EThreeArgsBuf8),
Measurement(&Property::NotificationLatencyParent, _L("Local TUint16(512) Notification Latency ThreeArgsBuf16"),
RProperty::ELargeByteArray, 512, EFalse, EThreeArgsBuf16),
Measurement(&Property::NotificationLatencyParent, _L("Remote TUint16(512) Notification Latency ThreeArgsBuf16"),
RProperty::ELargeByteArray, 512,ETrue, EThreeArgsBuf16),
Measurement(&Property::SetOverhead, _L("Int Set Overhead"),
RProperty::EInt, 0),
Measurement(&Property::SetOverhead, _L("Byte(1) Set Overhead"),
RProperty::EByteArray, 1),
Measurement(&Property::SetOverhead, _L("Byte(8) Set Overhead"),
RProperty::EByteArray, 8),
Measurement(&Property::SetOverhead, _L("Byte(512) Set Overhead"),
RProperty::EByteArray, 512),
Measurement(&Property::SetOverhead, _L("Int Set Overhead ThreeArgsInt"),
RProperty::EInt, 0, EFalse, EThreeArgsInt),
Measurement(&Property::SetOverhead, _L("Byte(1) Set Overhead ThreeArgsBuf8"),
RProperty::EByteArray, 1, EFalse, EThreeArgsBuf8),
Measurement(&Property::SetOverhead, _L("TUint16(1) Set Overhead ThreeArgsBuf16"),
RProperty::EByteArray, 1, EFalse, EThreeArgsBuf16),
Measurement(&Property::SetOverhead, _L("Byte(8) Set Overhead ThreeArgsBuf8"),
RProperty::EByteArray, 8, EFalse, EThreeArgsBuf8),
Measurement(&Property::SetOverhead, _L("TUint16(8) Set Overhead ThreeArgsBuf16"),
RProperty::EByteArray, 8, EFalse, EThreeArgsBuf16),
Measurement(&Property::SetOverhead, _L("Byte(512) Set Overhead ThreeArgsBuf8"),
RProperty::EByteArray, 512, EFalse, EThreeArgsBuf8),
Measurement(&Property::SetOverhead, _L("TUint16(512) Set Overhead ThreeArgsBuf16"),
RProperty::ELargeByteArray, 512, EFalse, EThreeArgsBuf16),
Measurement(&Property::GetOverhead, _L("Int Get Overhead"),
RProperty::EInt, 0),
Measurement(&Property::GetOverhead, _L("Byte(1) Get Overhead"),
RProperty::EByteArray, 1),
Measurement(&Property::GetOverhead, _L("Byte(8) Get Overhead"),
RProperty::EByteArray, 8),
Measurement(&Property::GetOverhead, _L("Byte(512) Get Overhead"),
RProperty::EByteArray, 512),
Measurement(&Property::GetOverhead, _L("Int Get Overhead ThreeArgsInt"),
RProperty::EInt, 0, EFalse, EThreeArgsInt),
Measurement(&Property::GetOverhead, _L("Byte(1) Get Overhead ThreeArgsBuf8"),
RProperty::EByteArray, 1, EFalse, EThreeArgsBuf8),
Measurement(&Property::GetOverhead, _L("TUint16(1) Get Overhead ThreeArgsBuf16"),
RProperty::EByteArray, 1, EFalse, EThreeArgsBuf16),
Measurement(&Property::GetOverhead, _L("Byte(8) Get Overhead ThreeArgsBuf8"),
RProperty::EByteArray, 8, EFalse, EThreeArgsBuf8),
Measurement(&Property::GetOverhead, _L("TUint16(8) Get Overhead ThreeArgsBuf16"),
RProperty::EByteArray, 8, EFalse, EThreeArgsBuf16),
Measurement(&Property::GetOverhead, _L("Byte(512) Get Overhead ThreeArgsBuf8"),
RProperty::EByteArray, 512, EFalse, EThreeArgsBuf8),
Measurement(&Property::GetOverhead, _L("TUint16(512) Get Overhead ThreeArgsBuf16"),
RProperty::ELargeByteArray, 512, EFalse, EThreeArgsBuf16),
};
TBMResult Property::iResults[sizeof(Property::iMeasurements)/sizeof(Property::iMeasurements[0])];
TBuf8<RProperty::KMaxPropertySize> Property::iInBuf(RProperty::KMaxPropertySize);
TBuf8<RProperty::KMaxPropertySize> Property::iOutBuf(RProperty::KMaxPropertySize);
TBuf16<RProperty::KMaxPropertySize> Property::iInBuf16(RProperty::KMaxPropertySize);
TBuf16<RProperty::KMaxPropertySize> Property::iOutBuf16(RProperty::KMaxPropertySize);
static Property property;
class NotificationLatencyArgs : public TBMSpawnArgs
{
public:
TBMUInt64 iIterationCount;
RProperty::TType iType;
TInt iSize;
TSetGetType iSetGetType;
NotificationLatencyArgs(RProperty::TType aType, TInt aSize, TInt aRemote, TBMUInt64 aIter,
TSetGetType aSetGetType);
};
NotificationLatencyArgs::NotificationLatencyArgs(RProperty::TType aType, TInt aSize, TInt aRemote,
TBMUInt64 aIter, TSetGetType aSetGetType) :
TBMSpawnArgs(Property::NotificationLatencyChild, KBMPriorityLow, aRemote, sizeof(*this)),
iIterationCount(aIter), iType(aType), iSize(aSize), iSetGetType(aSetGetType)
{
}
void Property::NotificationLatencyParent(TBMResult* aResult, TBMUInt64 aIter, struct Measurement* aM)
{
RProperty time;
TInt r = time.Define(KPropBenchmarkCategory, 0, RProperty::EByteArray, KPassPolicy, KPassPolicy);
BM_ERROR(r, r == KErrNone);
r = time.Attach(KPropBenchmarkCategory, 0);
BM_ERROR(r, r == KErrNone);
RProperty prop;
r = prop.Define(KPropBenchmarkCategory, 1, aM->iType, KPassPolicy, KPassPolicy);
BM_ERROR(r, r == KErrNone);
r = prop.Attach(KPropBenchmarkCategory, 1);
BM_ERROR(r, r == KErrNone);
NotificationLatencyArgs sl(aM->iType, aM->iSize, aM->iRemote, aIter, aM->iSetGetType);
MBMChild* child = property.SpawnChild(&sl);
for (TBMUInt64 i = 0; i < aIter; ++i)
{
TRequestStatus st;
prop.Subscribe(st);
User::WaitForRequest(st);
switch(aM->iSetGetType)
{
case EOneArg:
if (aM->iType == RProperty::EInt)
{
TInt value;
r = prop.Get(value);
BM_ERROR(r, r == KErrNone);
}
else
{
r = prop.Get(iInBuf);
BM_ERROR(r, r == KErrNone);
}
break;
case EThreeArgsInt:
{
TInt value;
r = prop.Get(KPropBenchmarkCategory, 1, value);
BM_ERROR(r, r == KErrNone);
}
break;
case EThreeArgsBuf8:
r = prop.Get(KPropBenchmarkCategory, 1, iInBuf);
BM_ERROR(r, r == KErrNone);
break;
case EThreeArgsBuf16:
r = prop.Get(KPropBenchmarkCategory, 1, iInBuf16);
BM_ERROR(r, r == KErrNone);
break;
}
TBMTicks now;
::bmTimer.Stamp(&now);
BM_ERROR(st.Int(), st.Int() == KErrNone);
// subscribe for the time just before Set()
time.Subscribe(st);
User::WaitForRequest(st);
BM_ERROR(st.Int(), st.Int() == KErrNone);
// get the time just before Set()
TBMTicks propSetTime;
TPtr8 ptr((TUint8*) &propSetTime, sizeof(propSetTime), sizeof(propSetTime));
r = time.Get(KPropBenchmarkCategory, 0, ptr);
BM_ERROR(r, r == KErrNone);
aResult->Cumulate(TBMTicksDelta(propSetTime, now));
}
prop.Close();
time.Close();
child->WaitChildExit();
r = prop.Delete(KPropBenchmarkCategory, 1);
BM_ERROR(r, r == KErrNone);
r = time.Delete(KPropBenchmarkCategory, 0);
BM_ERROR(r, r == KErrNone);
}
TInt Property::NotificationLatencyChild(TAny* cookie)
{
NotificationLatencyArgs* sl = (NotificationLatencyArgs*) cookie;
TInt prio = BMProgram::SetAbsPriority(RThread(), sl->iChildOrigPriority);
for (TInt j = 0; j < RProperty::KMaxPropertySize; ++j)
{
iOutBuf[j] = (TUint8)(j + 1);
}
RProperty time;
RProperty prop;
TInt r = prop.Attach(KPropBenchmarkCategory, 1);
BM_ERROR(r, r == KErrNone);
for (TBMUInt64 i = 0; i < sl->iIterationCount; ++i)
{
TBMTicks propSetTime;
::bmTimer.Stamp(&propSetTime);
switch(sl->iSetGetType)
{
case EOneArg:
if (sl->iType == RProperty::EInt)
{
TInt value = 0xdeadbeef;
r = prop.Set(value);
BM_ERROR(r, r == KErrNone);
}
else
{
TPtrC8 ptr(iOutBuf.Ptr(), sl->iSize);
r = prop.Set(ptr);
BM_ERROR(r, r == KErrNone);
}
break;
case EThreeArgsInt:
{
TInt value = 0xdeadbeef;
r = prop.Set(KPropBenchmarkCategory, 1, value);
BM_ERROR(r, r == KErrNone);
}
break;
case EThreeArgsBuf8:
{
TPtrC8 ptr(iOutBuf.Ptr(), sl->iSize);
r = prop.Set(KPropBenchmarkCategory, 1, ptr);
BM_ERROR(r, r == KErrNone);
}
break;
case EThreeArgsBuf16:
{
TPtrC16 ptr(iOutBuf16.Ptr(), sl->iSize);
r = prop.Set(KPropBenchmarkCategory, 1, ptr);
BM_ERROR(r, r == KErrNone);
}
break;
}
// publish the time just before Set()
TPtr8 ptr((TUint8*) &propSetTime, sizeof(propSetTime), sizeof(propSetTime));
r = time.Set(KPropBenchmarkCategory, 0, ptr);
BM_ERROR(r, r == KErrNone);
}
prop.Close();
time.Close();
BMProgram::SetAbsPriority(RThread(), prio);
return KErrNone;
}
void Property::SetOverhead(TBMResult* aResult, TBMUInt64 aIter, struct Measurement* aM)
{
RProperty prop;
TInt r = prop.Define(KPropBenchmarkCategory, 1, aM->iType, KPassPolicy, KPassPolicy);
BM_ERROR(r, r == KErrNone);
r = prop.Attach(KPropBenchmarkCategory, 1);
BM_ERROR(r, r == KErrNone);
if (aM->iType == RProperty::EByteArray)
{
TPtrC8 ptr(iOutBuf.Ptr(), aM->iSize);
r = prop.Set(ptr);
BM_ERROR(r, r == KErrNone);
}
TBMTimeInterval ti;
ti.Begin();
for (TBMUInt64 i = 0; i < aIter; ++i)
{
switch(aM->iSetGetType)
{
case EOneArg:
if (aM->iType == RProperty::EInt)
{
TInt value = 1;
r = prop.Set(value);
BM_ERROR(r, r == KErrNone);
}
else
{
TPtrC8 ptr(iOutBuf.Ptr(), aM->iSize);
r = prop.Set(ptr);
BM_ERROR(r, r == KErrNone);
}
break;
case EThreeArgsInt:
{
TInt value = 1;
r = prop.Set(KPropBenchmarkCategory, 1, value);
BM_ERROR(r, r == KErrNone);
}
break;
case EThreeArgsBuf8:
{
TPtrC8 ptr(iOutBuf.Ptr(), aM->iSize);
r = prop.Set(KPropBenchmarkCategory, 1, ptr);
BM_ERROR(r, r == KErrNone);
}
break;
case EThreeArgsBuf16:
{
TPtrC16 ptr(iOutBuf16.Ptr(), aM->iSize);
r = prop.Set(KPropBenchmarkCategory, 1, ptr);
BM_ERROR(r, r == KErrNone);
}
break;
}
}
TBMTicks t = ti.End();
prop.Close();
r = prop.Delete(KPropBenchmarkCategory, 1);
BM_ERROR(r, r == KErrNone);
aResult->Cumulate(t, aIter);
}
void Property::GetOverhead(TBMResult* aResult, TBMUInt64 aIter, struct Measurement* aM)
{
RProperty prop;
TInt r = prop.Define(KPropBenchmarkCategory, 1, aM->iType, KPassPolicy, KPassPolicy);
BM_ERROR(r, r == KErrNone);
r = prop.Attach(KPropBenchmarkCategory, 1);
BM_ERROR(r, r == KErrNone);
if (aM->iType == RProperty::EByteArray)
{
TPtrC8 ptr(iOutBuf.Ptr(), aM->iSize);
r = prop.Set(ptr);
BM_ERROR(r, r == KErrNone);
}
TBMTimeInterval ti;
ti.Begin();
for (TBMUInt64 i = 0; i < aIter; ++i)
{
switch(aM->iSetGetType)
{
case EOneArg:
if (aM->iType == RProperty::EInt)
{
TInt value = 1;
r = prop.Get(value);
BM_ERROR(r, r == KErrNone);
}
else
{
r = prop.Get(iInBuf);
BM_ERROR(r, r == KErrNone);
}
break;
case EThreeArgsInt:
{
TInt value = 1;
r = prop.Get(KPropBenchmarkCategory, 1, value);
BM_ERROR(r, r == KErrNone);
}
break;
case EThreeArgsBuf8:
r = prop.Get(KPropBenchmarkCategory, 1, iInBuf);
BM_ERROR(r, r == KErrNone);
break;
case EThreeArgsBuf16:
r = prop.Get(KPropBenchmarkCategory, 1, iInBuf16);
BM_ERROR(r, r == KErrNone);
break;
}
}
TBMTicks t = ti.End();
prop.Close();
r = prop.Delete(KPropBenchmarkCategory, 1);
BM_ERROR(r, r == KErrNone);
aResult->Cumulate(t, aIter);
}
TBMResult* Property::Run(TBMUInt64 aIter, TInt* aCount)
{
TInt count = sizeof(iResults)/sizeof(iResults[0]);
for (TInt i = 0; i < count; ++i)
{
iResults[i].Reset(iMeasurements[i].iName);
iMeasurements[i].iFunc(&iResults[i], aIter, &iMeasurements[i]);
iResults[i].Update();
}
*aCount = count;
return iResults;
}
void AddProperty()
{
BMProgram* next = bmSuite;
bmSuite=(BMProgram*)&property;
bmSuite->Next()=next;
}