sl@0: // Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of the License "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // e32test\system\d_nanowait.cpp sl@0: // LDD for testing nanosecond blocking sl@0: // sl@0: // sl@0: sl@0: #include "plat_priv.h" sl@0: #include "d_nanowait.h" sl@0: sl@0: const TInt KMajorVersionNumber=0; sl@0: const TInt KMinorVersionNumber=1; sl@0: const TInt KBuildVersionNumber=1; sl@0: sl@0: sl@0: // global Dfc Que sl@0: TDynamicDfcQue* gDfcQ; sl@0: sl@0: sl@0: class DNanoWaitFactory : public DLogicalDevice sl@0: // sl@0: // NanoWait LDD factory sl@0: // sl@0: { sl@0: public: sl@0: DNanoWaitFactory(); sl@0: ~DNanoWaitFactory(); sl@0: virtual TInt Install(); //overriding pure virtual sl@0: virtual void GetCaps(TDes8& aDes) const; //overriding pure virtual sl@0: virtual TInt Create(DLogicalChannelBase*& aChannel); //overriding pure virtual sl@0: }; sl@0: sl@0: class DNanoWait : public DLogicalChannel sl@0: // sl@0: // nanowait LDD channel sl@0: // sl@0: { sl@0: public: sl@0: DNanoWait(); sl@0: ~DNanoWait(); sl@0: protected: sl@0: virtual TInt DoCreate(TInt aUnit, const TDesC8* anInfo, const TVersion& aVer); sl@0: TInt DoControl(TInt aFunction, TAny* a1, TAny* a2); sl@0: virtual void HandleMsg(TMessageBase* aMsg); sl@0: public: sl@0: inline DThread* Client() { return iThread; } sl@0: public: sl@0: DThread* iThread; sl@0: TDynamicDfcQue* iDfcQ; sl@0: }; sl@0: sl@0: sl@0: sl@0: DECLARE_STANDARD_LDD() sl@0: { sl@0: return new DNanoWaitFactory; sl@0: } sl@0: sl@0: DNanoWaitFactory::DNanoWaitFactory() sl@0: // sl@0: // Constructor sl@0: // sl@0: { sl@0: iVersion=TVersion(KMajorVersionNumber,KMinorVersionNumber,KBuildVersionNumber); sl@0: //iParseMask=0;//No units, no info, no PDD sl@0: //iUnitsMask=0;//Only one thing sl@0: } sl@0: sl@0: TInt DNanoWaitFactory::Create(DLogicalChannelBase*& aChannel) sl@0: // sl@0: // Create a new DMsTim on this logical device sl@0: // sl@0: { sl@0: aChannel=new DNanoWait; sl@0: return aChannel?KErrNone:KErrNoMemory; sl@0: } sl@0: sl@0: const TInt KDNanoWaitThreadPriority = 27; sl@0: _LIT(KDNanoWaitThread,"DNanoWaitThread"); sl@0: sl@0: TInt DNanoWaitFactory::Install() sl@0: // sl@0: // Install the LDD - overriding pure virtual sl@0: // sl@0: { sl@0: // Allocate a kernel thread to run the DFC sl@0: TInt r = Kern::DynamicDfcQCreate(gDfcQ, KDNanoWaitThreadPriority, KDNanoWaitThread); sl@0: sl@0: #ifdef CPU_AFFINITY_ANY sl@0: NKern::ThreadSetCpuAffinity((NThread*)(gDfcQ->iThread), KCpuAffinityAny); sl@0: #endif sl@0: sl@0: if (r != KErrNone) sl@0: return r; sl@0: sl@0: return SetName(&KNanoWaitLddName); sl@0: } sl@0: sl@0: void DNanoWaitFactory::GetCaps(TDes8& aDes) const sl@0: // sl@0: // Get capabilities - overriding pure virtual sl@0: // sl@0: { sl@0: TCapsNanoWaitV01 b; sl@0: b.iVersion=TVersion(KMajorVersionNumber,KMinorVersionNumber,KBuildVersionNumber); sl@0: Kern::InfoCopy(aDes,(TUint8*)&b,sizeof(b)); sl@0: } sl@0: sl@0: /** sl@0: Destructor sl@0: */ sl@0: DNanoWaitFactory::~DNanoWaitFactory() sl@0: { sl@0: if (gDfcQ) sl@0: gDfcQ->Destroy(); sl@0: } sl@0: sl@0: DNanoWait::DNanoWait() sl@0: // sl@0: // Constructor sl@0: // sl@0: { sl@0: iThread=&Kern::CurrentThread(); sl@0: iThread->Open(); sl@0: } sl@0: sl@0: TInt DNanoWait::DoCreate(TInt /*aUnit*/, const TDesC8* /*anInfo*/, const TVersion& aVer) sl@0: // sl@0: // Create channel sl@0: // sl@0: { sl@0: sl@0: if (!Kern::QueryVersionSupported(TVersion(KMajorVersionNumber,KMinorVersionNumber,KBuildVersionNumber),aVer)) sl@0: return KErrNotSupported; sl@0: SetDfcQ(gDfcQ); sl@0: iMsgQ.Receive(); sl@0: return KErrNone; sl@0: } sl@0: sl@0: DNanoWait::~DNanoWait() sl@0: // sl@0: // Destructor sl@0: // sl@0: { sl@0: Kern::SafeClose((DObject*&)iThread, NULL); sl@0: } sl@0: sl@0: void DNanoWait::HandleMsg(TMessageBase* aMsg) sl@0: { sl@0: TInt r=KErrNone; sl@0: TThreadMessage& m=*(TThreadMessage*)aMsg; sl@0: TInt id=m.iValue; sl@0: if (id==(TInt)ECloseMsg) sl@0: { sl@0: m.Complete(KErrNone,EFalse); sl@0: iMsgQ.CompleteAll(KErrServerTerminated); sl@0: return; sl@0: } sl@0: else sl@0: { sl@0: r=DoControl(id,m.Ptr0(),m.Ptr1()); sl@0: } sl@0: m.Complete(r,ETrue); sl@0: } sl@0: sl@0: TInt DNanoWait::DoControl(TInt aFunction, TAny* a1, TAny* a2) sl@0: { sl@0: TInt r=KErrNone; sl@0: TInt interval=(TInt)a2; sl@0: switch (aFunction) sl@0: { sl@0: case RNanoWait::EControlStartNanoWait: sl@0: { sl@0: TInt loopCount=(TInt)a1; sl@0: for( int loop = 0; loop < loopCount; loop++) sl@0: { sl@0: Kern::NanoWait(interval); sl@0: } sl@0: break; sl@0: } sl@0: default: sl@0: r=KErrNotSupported; sl@0: break; sl@0: } sl@0: return r; sl@0: } sl@0: