libraries/extrabtrace/src/extrabtracek.cpp
changeset 0 7f656887cf89
child 22 30834c0f3179
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libraries/extrabtrace/src/extrabtracek.cpp	Wed Jun 23 15:52:26 2010 +0100
@@ -0,0 +1,154 @@
+// extrabtracek.cpp
+// 
+// Copyright (c) 2010 Accenture. All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the "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:
+// Accenture - Initial contribution
+//
+
+#include <fshell/extrabtracek.h>
+#include <kern_priv.h>
+
+#include "common.h"
+#include "sampler.h"
+#include "eventhandler.h"
+
+class DExtraBTraceChannel : public DLogicalChannelBase
+	{
+public:
+	DExtraBTraceChannel();
+	virtual ~DExtraBTraceChannel();
+	//	Inherited from DObject
+	virtual TInt RequestUserHandle(DThread* aThread, TOwnerType aType);
+	// Inherited from DLogicalChannelBase
+	virtual TInt DoCreate(TInt aUnit, const TDesC8* anInfo, const TVersion& aVer);
+	virtual TInt Request(TInt aReqNo, TAny* a1, TAny* a2);
+private:
+	DCpuSampler* Sampler();
+	};
+
+TInt DExtraBTraceFactory::Install()
+	{
+	TInt err = SetName(&KLogicalDeviceName);
+	if (err) return err;
+	err = Open();
+	if (err) return err;
+
+	iSampler = new DCpuSampler();
+	if (!iSampler) err = KErrNoMemory;
+
+	if (!err) iEventHandler = new DExtraBtraceEventHandler(this);
+	if (!iEventHandler) err = KErrNoMemory;
+
+	if (err)
+		{
+		Close(NULL);
+		}
+	else
+		{
+		iEventHandler->Add();
+		// We must NOT call anything that could fail from this point on - otherwise it is impossible to safely close the DExtraBtraceEventHandler (looks like a bug in constructing a DKernelEventHandler from DLogicalDevice::Install())
+		}
+	return err;
+	}
+
+
+void DExtraBTraceFactory::GetCaps(TDes8& /*aDes*/) const
+	{
+	//Kern::InfoCopy(aDes,0,0);
+	}
+
+TInt DExtraBTraceFactory::Create(DLogicalChannelBase*& aChannel)
+	{
+	aChannel=new DExtraBTraceChannel();
+	if(!aChannel)
+		return KErrNoMemory;
+	return KErrNone;
+	}
+
+DExtraBTraceFactory::~DExtraBTraceFactory()
+	{
+	delete iSampler;
+	delete iEventHandler;
+	}
+
+void DExtraBTraceFactory::SetCpuUsageSampling(MExtraBtrace::TCpuUsageCallback aCallbackFn)
+	{
+	iSampler->SetCpuUsageSampling(aCallbackFn);
+	}
+
+void DExtraBTraceFactory::SetProfilingSampling(TBool aEnabled)
+	{
+	iSampler->SetProfilingSampling(aEnabled);
+	}
+
+TAny* DExtraBTraceFactory::GetVersion(TInt /*aVersion*/)
+	{
+	return NULL; // We don't have any versions yet - this is like CBase::_Extension, just in case
+	}
+
+void DExtraBTraceFactory::MExtraBtrace_Close()
+	{
+	Close(NULL);
+	}
+
+//
+
+DExtraBTraceChannel::DExtraBTraceChannel()
+	{
+	}
+
+DExtraBTraceChannel::~DExtraBTraceChannel()
+	{
+	}
+
+TInt DExtraBTraceChannel::DoCreate(TInt /*aUnit*/, const TDesC8* /*aInfo*/, const TVersion& /*aVer*/)
+	{
+	return KErrNone;
+	}
+
+DCpuSampler* DExtraBTraceChannel::Sampler()
+	{
+	return static_cast<DExtraBTraceFactory*>(iDevice)->iSampler;
+	}
+
+TInt DExtraBTraceChannel::RequestUserHandle(DThread* /*aThread*/, TOwnerType /*aType*/)
+	{
+	//if (aType!=EOwnerThread || aThread!=iClient)
+	//	return KErrAccessDenied;
+	return KErrNone;
+	}
+
+TInt DExtraBTraceChannel::Request(TInt aReqNo, TAny* a1, TAny* /*a2*/)
+	{
+	switch (aReqNo)
+		{
+	case EControlEnableProfiling:
+		{
+		TInt enable = (a1 == 0) ? 0 : 1; // We still ignore the rate, currently
+		TInt err = BTrace::SetFilter(BTrace::EProfiling, enable);
+		if (err >= 0)
+			{
+			Sampler()->SetProfilingSampling(enable);
+			}
+		return err;
+		}
+	default:
+		return KErrNotSupported;
+		}
+	}
+
+DECLARE_EXTENSION_LDD()
+	{
+	return new DExtraBTraceFactory;
+	}
+
+DECLARE_STANDARD_EXTENSION()
+	{
+	return KErrNone;
+	}
+