kerneltest/e32test/resourceman/d_rescontrolclisync.cpp
branchRCL_3
changeset 44 3e88ff8f41d5
parent 43 c1f20ce4abcf
child 45 9e2d4f7f5028
--- a/kerneltest/e32test/resourceman/d_rescontrolclisync.cpp	Tue Aug 31 16:34:26 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,419 +0,0 @@
-// Copyright (c) 2010 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:
-// e32test\resourceman\d_rescontrolclisync.cpp
-// 
-//
-
-#include <kernel/kern_priv.h>
-#include <drivers/resource_extend.h>
-#include <drivers/resourceman.h>
-#include "d_rescontrolclisync.h"
-
-#include "resourceman_psl/rescontrol_psl.h"
-
-_LIT(KTestPowerRCName, "D_RESCONTROLCLISYNC.LDD");
-
-
-const TInt KTestResManLddThreadPriority  = 0x5;
-const TUint KResourceId = 16; // DMLSHLGLSPResource
-const TInt KResourceMax = 65;
-const TInt KResourceMin = 10;
-
-_LIT(KTestResManLddThread, "TestResManLddThread");
-_LIT(KTestResManLddHelperThread, "TestResManLddHelperThread");
-_LIT(KTestResManLddCallbackThread, "TestResManLddCallbackThread");
-_LIT(KResClientName1, "ResTestClient1");
-_LIT(KResClientName2, "ResTestClient2");
-
-class DTestResManLdd;
-/**
-The logical device (factory class) for the resource manager client side test.
-*/
-class DTestResManLddFactory : public DLogicalDevice
-	{
-public:
-    enum {
-        ESignallerCallback,
-        EWaiterCallback
-    };
-	DTestResManLddFactory();
-	~DTestResManLddFactory();
-	virtual TInt Install();
-	virtual void GetCaps(TDes8 &aDes) const;
-	virtual TInt Create(DLogicalChannelBase*& aChannel);
-	
-    NFastSemaphore iSemaphore1; // fast semaphore for helper queue
-    NFastSemaphore iSemaphore2; // fast semaphore for call back thread
-
-	TInt iResourceClientRegisterCount;
-	TDynamicDfcQue* iLddQue;   // dfc que for logical channel (also running the primary ChangeResourceState
-	TDynamicDfcQue* iLddHelperQue; // helper dfc que to execute the secondary ChangeResourceState
-    TDynamicDfcQue* iCallbackQue;  // dfc que for call back 
- 
-    DTestResManLdd* iChannel1;
-    DTestResManLdd* iChannel2;
-    TInt iCallbackState;
-    TPowerResourceCb* iAsyncResourceCallback; 
-	};
-
-/** Logical channel class for Resource manager test LDD */
-class DTestResManLdd : public DLogicalChannel
-	{
-public:
-	DTestResManLdd();
-	virtual ~DTestResManLdd();
-	// Inherited from DLogicalChannel
-	virtual TInt DoCreate(TInt aUnit, const TDesC8* anInfo, const TVersion& aVer);
-	virtual void HandleMsg(TMessageBase* aMsg);
-
-    DThread* iClientThreadPtr;	
-    TRequestStatus* iStatus;
-    TUint iResClientId;
-    TDfc* iWaitAndChangeResourceDfc;
-    
-private:
-	TInt DoControl(TInt aFunction, TAny* a1, TAny* a2);
-	TInt DoRequest(TInt aFunction, TRequestStatus* aStatus, TAny* a1, TAny* a2);
-	TInt DoCancel(TUint aMask);
-	};
-
-void AsyncResourceCallbackFn(TUint /*aClientId*/, TUint /*aResourceId*/, TInt /*aLevel*/, TInt /*aLevelOwnerId*/, TInt aResult, TAny* aParam)
-    {
-    // call back function, always run on call back dfc queue
-    Kern::Printf(">AsyncResourceCallbackFn 0x%x", &(Kern::CurrentThread().iNThread));
-    DTestResManLddFactory* pLddFactory = (DTestResManLddFactory*)aParam;
-    DTestResManLdd* pLdd = NULL;
-
-    if(pLddFactory->iCallbackState == DTestResManLddFactory::ESignallerCallback)
-        {
-        pLdd = pLddFactory->iChannel1;
-        Kern::Printf("AsyncResourceCallbackFn cond 1 signal [#3.1]"); 
-        NKern::FSSignal(&(pLddFactory->iSemaphore1));
-        
-        Kern::Printf("AsyncResourceCallbackFn cond 1 wait [#3.2]");
-        NKern::FSWait(&(pLddFactory->iSemaphore2));
-        
-        Kern::Printf("AsyncResourceCallbackFn cond 1 wake up [#3.3]");
-        }
-    else if(pLddFactory->iCallbackState == DTestResManLddFactory::EWaiterCallback)
-        {
-        pLdd = pLddFactory->iChannel2;
-        // aResult should be equal to KErrNone (not KErrCompletion)
-        Kern::Printf("AsyncResourceCallbackFn cond 2 r = %d [#2.5]", aResult);
-        }
-    else
-        {
-        Kern::Fault("AsyncResourceCallbackFn", __LINE__);
-        }
-    
-    Kern::RequestComplete(pLdd->iClientThreadPtr, pLdd->iStatus, aResult);
-    pLdd->iStatus = NULL;    
-    Kern::Printf("<AsyncResourceCallbackFn");
-    }
-
-void WaitAndChangeResourceDfcFn(TAny* aLdd)
-    {
-    // helper function to call ChangeResourceState, always run on ldd helper dfc queue
-    Kern::Printf(">WaitAndChangeResourceDfcFn 0x%x [#2.1]", &(Kern::CurrentThread().iNThread));
-    DTestResManLdd* pLdd = (DTestResManLdd*)aLdd;
-    DTestResManLddFactory* pLddFactory = (DTestResManLddFactory*)(pLdd->iDevice);
-    
-    Kern::Printf(" WaitAndChangeResourceDfcFn - Wait for Semaphore [#2.2]");
-    NKern::FSWait(&(pLddFactory->iSemaphore1));
-    
-    Kern::Printf(" WaitAndChangeResourceDfcFn - ChangeResourceState [#2.3]");
-    pLddFactory->iCallbackState = DTestResManLddFactory::EWaiterCallback;
-    PowerResourceManager::ChangeResourceState(pLdd->iResClientId, KResourceId, KResourceMax, pLddFactory->iAsyncResourceCallback);
-    
-    Kern::Printf(" WaitAndChangeResourceDfcFn - signal [#2.4]");
-    NKern::FSSignal(&(pLddFactory->iSemaphore2));
-    
-    delete pLdd->iWaitAndChangeResourceDfc;
-    Kern::Printf("<WaitAndChangeResourceDfcFn");
-    }
-
-DTestResManLddFactory::DTestResManLddFactory()
-	{
-	iParseMask=0; // Allow info and pdd, but not units
-	iUnitsMask=0;
-	// Set version number for this device
-	iVersion=RTestResMan::VersionRequired();
-	}
-
-DTestResManLddFactory::~DTestResManLddFactory()
-	{
-    if(iLddQue)
-        iLddQue->Destroy();       
-    if(iLddHelperQue)
-      iLddHelperQue->Destroy(); 
-    if(iCallbackQue)
-      iCallbackQue->Destroy(); 
-    
-    if(iAsyncResourceCallback)
-      delete iAsyncResourceCallback;
-	}
-
-/** Entry point for this driver */
-DECLARE_STANDARD_LDD()
-	{
-	DTestResManLddFactory* p = new DTestResManLddFactory;
-	if(!p)
-		return NULL;
-
-	TInt r = KErrNone;
-	
-    r = Kern::DynamicDfcQCreate(p->iLddQue, KTestResManLddThreadPriority, KTestResManLddThread);
-    if(r != KErrNone)
-        {
-        return NULL;
-        }
-    Kern::Printf("iLddQue 0x%x", p->iLddQue->iThread);
-    
-    r = Kern::DynamicDfcQCreate(p->iLddHelperQue, KTestResManLddThreadPriority, KTestResManLddHelperThread);
-    if(r != KErrNone)
-        {
-        p->iLddQue->Destroy();  
-        return NULL;
-        }
-    p->iSemaphore1.iOwningThread = (NThreadBase*)(p->iLddHelperQue->iThread);
-    Kern::Printf("iSemaphore1 owning thread 0x%x", p->iSemaphore1.iOwningThread);
-
-    r = Kern::DynamicDfcQCreate(p->iCallbackQue, KTestResManLddThreadPriority, KTestResManLddCallbackThread);
-    if(r != KErrNone)
-        {
-        p->iLddQue->Destroy();  
-        p->iLddHelperQue->Destroy();          
-        return NULL;
-        }
-    p->iSemaphore2.iOwningThread = (NThreadBase*)(p->iCallbackQue->iThread);
-    Kern::Printf("iSemaphore2 owning thread 0x%x", p->iSemaphore2.iOwningThread);
-
-    p->iAsyncResourceCallback = new TPowerResourceCb(AsyncResourceCallbackFn, p, 
-            p->iCallbackQue, 5);    
-    
-#ifdef __SMP__      
-    NKern::ThreadSetCpuAffinity((NThread*)(p->iLddQue->iThread), 0);
-    NKern::ThreadSetCpuAffinity((NThread*)(p->iLddHelperQue->iThread), 0);
-    NKern::ThreadSetCpuAffinity((NThread*)(p->iCallbackQue->iThread), 1);
-#endif      
-    
-	r = DSimulatedPowerResourceController::CompleteResourceControllerInitialisation();
-	if(r != KErrNone)
-		Kern::Fault("PRM INIT FAILED", __LINE__);
-	return p;
-	}
-
-/** Second stage constuctor */
-TInt DTestResManLddFactory::Install()
-	{
-   	return(SetName(&KTestPowerRCName));
-	}
-
-/** Device capabilities */
-void DTestResManLddFactory::GetCaps(TDes8& aDes)const
-	{
-	// Create a capabilities object
-	RTestResMan::TCaps caps;
-	caps.iVersion = iVersion;
-	// Write it back to user memory
-	Kern::InfoCopy(aDes,(TUint8*)&caps,sizeof(caps));
-	}
-
-
-TInt DTestResManLddFactory::Create(DLogicalChannelBase*& aChannel)
-	{
-	aChannel = new DTestResManLdd();
-	if(!aChannel)
-		return KErrNoMemory;
-	if(!iChannel1)
-	    iChannel1 = (DTestResManLdd*)aChannel;
-	else if(!iChannel2)
-	    iChannel2 = (DTestResManLdd*)aChannel;
-	else
-	    {
-        delete aChannel;
-	    return KErrInUse;
-	    }
-	return KErrNone;
-	}
-
-/** Constructor */
-DTestResManLdd::DTestResManLdd()
-	{
-	iClientThreadPtr=&Kern::CurrentThread();
-	iResClientId = 0;
-
-	// Increase the DThread's ref count so that it does not close without us
-	((DObject*)iClientThreadPtr)->Open();
-	}
-
-/** Destructor */
-DTestResManLdd::~DTestResManLdd()
-	{
-	Kern::SafeClose((DObject*&)iClientThreadPtr,NULL);
-	}
-
-/** Second stage constructor. */
-TInt DTestResManLdd::DoCreate(TInt /*aUnit*/, const TDesC8* /*aInfo*/, const TVersion& aVer)
-	{
-   	// Check version
-	if (!Kern::QueryVersionSupported(RTestResMan::VersionRequired(),aVer))
-		return KErrNotSupported;
-
-	SetDfcQ(((DTestResManLddFactory*)iDevice)->iLddQue);
- 	iMsgQ.Receive();
-	return KErrNone;
-	}
-
-/** Process a message for this logical channel */
-void DTestResManLdd::HandleMsg(TMessageBase* aMsg)
-	{
-	TThreadMessage& m=*(TThreadMessage*)aMsg;
-	TInt id=m.iValue;
-
-	if (id==(TInt)ECloseMsg)
-		{
-		// Channel close.
-		m.Complete(KErrNone,EFalse);
-		return;
-		}
-	else if (id==KMaxTInt)
-		{
-		// DoCancel
-		m.Complete(KErrNone,ETrue);
-		return;
-		}
-	else if (id<0)
-		{
-		// DoRequest
-		TRequestStatus* pS=(TRequestStatus*)m.Ptr0();
-		TInt r=DoRequest(~id,pS,m.Ptr1(),m.Ptr2());
-		if (r!=KErrNone)
-			Kern::RequestComplete(iClientThreadPtr,pS,r);
-		m.Complete(KErrNone,ETrue);
-		}
-	else
-		{
-		// DoControl
-		TInt r=DoControl(id,m.Ptr0(),m.Ptr1());
-		m.Complete(r,ETrue);
-		}
-	}
-
-/**
-  Process synchronous 'control' requests
-*/
-TInt DTestResManLdd::DoControl(TInt aFunction, TAny* /*a1*/, TAny* /*a2*/)
-	{
-	TInt r = KErrNone;
-
-	switch(aFunction)
-		{
-		case RTestResMan::ERegisterClient:
-		    {
-            Kern::Printf("RTestResMan::ERegisterClient");		    
-			if(iResClientId!=0)
-				{
-				r = KErrInUse;
-				break;
-				}
-			if(((DTestResManLddFactory*)iDevice)->iResourceClientRegisterCount==0)
-			    {
-			    r = PowerResourceManager::RegisterClient(iResClientId, KResClientName1);
-			    }
-			else if(((DTestResManLddFactory*)iDevice)->iResourceClientRegisterCount==1)
-			    {
-                r = PowerResourceManager::RegisterClient(iResClientId, KResClientName2);
-                }                
-			else
-			    r = KErrInUse;
-			
-			(((DTestResManLddFactory*)iDevice)->iResourceClientRegisterCount)++;
-			
-			break;
-		    }
-	    case RTestResMan::EDeRegisterClient:
-	        {
-            Kern::Printf("RTestResMan::EDeRegisterClient");          
-            if(iResClientId==0)
-                {
-                r = KErrArgument;
-                break;
-                }
-            r = PowerResourceManager::DeRegisterClient(iResClientId);
-            break;
-	        }    
-        case RTestResMan::EPrintResourceInfo:
-            {
-            Kern::Printf("RTestResMan::EPrintResourceInfo");          
-            TPowerResourceInfoBuf01 info;
-            info.SetLength(0);
-            Kern::Printf("EPrintResourceInfo");
-            r = PowerResourceManager::GetResourceInfo(iResClientId,KResourceId,&info);
-            Kern::Printf("EPrintResourceInfo:%S", info().iResourceName);
-            break;
-            }
-		default:
-		    {
-			r = KErrNotSupported;
-			break;
-		    }
-		}
-	return r;
-
-	}
-
-
-TInt DTestResManLdd::DoRequest(TInt aReqNo, TRequestStatus* aStatus, TAny* /*a1*/, TAny* /*a2*/)
-	{
-	TInt r = KErrNone;
-
-	if(r != KErrNone)
-		Kern::RequestComplete(iClientThreadPtr, aStatus, r);
-	switch(aReqNo)
-		{
-        case RTestResMan::EWaitAndChangeResource:
-            // Queue a dfc which wait for the semaphore and then call ChangeResourceState
-            Kern::Printf("RTestResMan::EWaitAndChangeResource 0x%x [#1.1]", &(Kern::CurrentThread().iNThread));            
-            if(iStatus)
-                {
-                r = KErrInUse;
-                break;
-                }
-            iStatus = aStatus;
-
-            iWaitAndChangeResourceDfc = new TDfc(WaitAndChangeResourceDfcFn, this, 
-                    ((DTestResManLddFactory*)iDevice)->iLddHelperQue, 5);
-            iWaitAndChangeResourceDfc->Enque();
-
-            break;
-        case RTestResMan::EChangeResourceAndSignal:	
-            // call ChangeResourceState and signal the semaphore
-            Kern::Printf("RTestResMan::EChangeResourceAndSignal 0x%x [#1.2]", &(Kern::CurrentThread().iNThread));             
-            if(iStatus)
-                {
-                r = KErrInUse;
-                break;
-                }
-            iStatus = aStatus;
-            PowerResourceManager::ChangeResourceState(iResClientId, KResourceId, KResourceMin, 
-                    ((DTestResManLddFactory*)iDevice)->iAsyncResourceCallback);
-            ((DTestResManLddFactory*)iDevice)->iCallbackState = DTestResManLddFactory::ESignallerCallback;
-
-            break;            
-	    default:
-	        break;
-		}
-	return r;
-	}