kerneltest/e32test/misc/d_testkerncorestats.cpp
changeset 90 947f0dc9f7a8
child 102 ef2a444a7410
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/misc/d_testkerncorestats.cpp	Fri Apr 16 16:24:37 2010 +0300
@@ -0,0 +1,168 @@
+// Copyright (c) 2007-2009 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:
+// e32test\misc\d_kerncorestas.cpp
+// 
+//
+
+#include "d_TestKernCoreStats.h"
+
+#include <kernel/kernel.h>
+#include <kernel/kerncorestats.h>
+
+
+class DTestKernCoreStatsFactory : public DLogicalDevice
+        {
+public:
+        DTestKernCoreStatsFactory();
+        ~DTestKernCoreStatsFactory();
+        virtual TInt Install();
+        virtual void GetCaps(TDes8& aDes) const;
+        virtual TInt Create(DLogicalChannelBase*& aChannel);
+        };
+
+class DTestKernCoreStatsChannel : public DLogicalChannelBase
+        {
+public:
+        DTestKernCoreStatsChannel();
+        virtual ~DTestKernCoreStatsChannel();
+        TInt Request(TInt aFunction, TAny* a1, TAny* a2);
+        virtual TInt DoCreate(TInt aUnit, const TDesC8* anInfo, const TVersion&
+aVer);
+private:
+	TInt GetStats(TAny* aBuffer);
+	TInt Configure(TInt aMode);
+	TInt DumpInfo();
+private:
+	TInt iLength;
+        };
+
+
+DECLARE_STANDARD_LDD()
+        {
+        return new DTestKernCoreStatsFactory;
+        }
+
+DTestKernCoreStatsFactory::DTestKernCoreStatsFactory()
+        {
+        }
+
+DTestKernCoreStatsFactory::~DTestKernCoreStatsFactory()
+        {
+        }
+
+TInt DTestKernCoreStatsFactory::Install()
+        {
+        return SetName(&KTestKernCoreStatsName);
+        }
+
+
+void DTestKernCoreStatsFactory::GetCaps(TDes8&) const
+        {
+        }
+
+
+TInt DTestKernCoreStatsFactory::Create(DLogicalChannelBase*& aChannel)
+        {
+        aChannel=new DTestKernCoreStatsChannel();
+        if(!aChannel)
+                return KErrNoMemory;
+
+        return KErrNone;
+        }
+
+DTestKernCoreStatsChannel::DTestKernCoreStatsChannel()
+	{
+	}
+
+
+DTestKernCoreStatsChannel::~DTestKernCoreStatsChannel()
+	{
+	}
+
+TInt DTestKernCoreStatsChannel::DoCreate(TInt, const TDesC8*, const TVersion&)
+        {
+        return KErrNone;
+        }
+
+TInt DTestKernCoreStatsChannel::Request(TInt aFunction, TAny* a1, TAny*)
+        {
+        switch (aFunction)
+                {
+                case RTestKernCoreStats::ERequestGetStats:
+                        return GetStats( (TAny*) a1);
+                case RTestKernCoreStats::ERequestConfigure:
+                        return Configure( (TInt) a1);
+                case RTestKernCoreStats::ERequestDumpInfo:
+                        return DumpInfo();
+                default:
+                        return KErrNotSupported;
+                }
+        }
+
+
+TInt DTestKernCoreStatsChannel::GetStats(TAny* aBuffer)
+	{
+	NKern::ThreadEnterCS();
+	
+	if (iLength==0)
+		return KErrNone;
+	
+	TAny* tempBuff = Kern::Alloc(iLength);
+	if (!tempBuff)
+		{
+		NKern::ThreadLeaveCS();
+		return KErrNoMemory;
+		}
+
+	TInt r = KernCoreStats::Stats(tempBuff);
+
+
+	if (r==KErrNone)
+		kumemput(aBuffer, tempBuff, iLength);
+
+	Kern::Free(tempBuff);
+	NKern::ThreadLeaveCS();
+
+	return r;
+	}
+
+TInt DTestKernCoreStatsChannel::Configure(TInt aMode)
+	{
+
+	NKern::ThreadEnterCS();
+	TInt cores = NKern::NumberOfCpus();
+
+	TInt len = 0;
+	len+= (aMode & KStatsCoreTotalTimeInIdle)?		sizeof(TUint)*cores :0;
+	len+= (aMode & KStatsTimeCrossIdleAndActive)?		sizeof(TUint)*(cores+1) :0;
+	len+= (aMode & KStatsCoreNumTimesInIdle)?		sizeof(TUint)*cores :0;
+	len+= (aMode & KStatsNumEvents)?			sizeof(TUint) :0;
+	len+= (aMode & KStatsReadyStateChanges)?		sizeof(TUint)*2:0;
+	len+= (aMode & KStatsNumTimeSliceExpire)?		sizeof(TUint):0;
+
+	iLength=len;
+	Kern::Printf("KernCoreStats packet length = %d", len);
+	TInt r =  KernCoreStats::Configure(aMode);
+	NKern::ThreadLeaveCS();
+	return r;
+	}
+
+
+TInt DTestKernCoreStatsChannel::DumpInfo()
+	{
+
+	//KernCoreStats::Engage(0);
+
+	return iLength;
+	}