diff -r 000000000000 -r 7f656887cf89 libraries/extrabtrace/src/extrabtracek.cpp --- /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 +#include + +#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(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; + } +