kernel/eka/drivers/resmanus/d_resmanus.cpp
changeset 291 206a6eaaeb71
parent 279 957c583b417b
equal deleted inserted replaced
289:55a0a1279a7e 291:206a6eaaeb71
    75 			break;													\
    75 			break;													\
    76 		default:													\
    76 		default:													\
    77 			__ASSERT_ALWAYS(0,RESMANUS_FAULT());					\
    77 			__ASSERT_ALWAYS(0,RESMANUS_FAULT());					\
    78 		}															\
    78 		}															\
    79 	}
    79 	}
       
    80 
    80 /***************************************************************************************
    81 /***************************************************************************************
    81 	class TTrackGetStateBuf
    82 	class TTrackGetStateBuf
    82  ***************************************************************************************/
    83  ***************************************************************************************/
    83 TTrackGetStateBuf::TTrackGetStateBuf(TPowerResourceCbFn aFn, TAny* aPtr,
    84 TTrackGetStateBuf::TTrackGetStateBuf(TPowerResourceCbFn aFn, TAny* /*aPtr*/,
    84 						       TDfcQue* aQue, TInt aPriority)
    85 						       TDfcQue* aQue, TInt aPriority)
    85 							   :	iCtrlBlock(aFn, aPtr, aQue, aPriority)
    86 							   :	iCtrlBlock(aFn, this, aQue, aPriority)
    86 	{
    87 	{
    87 	iRequest = NULL;
    88 	iRequest = NULL;
       
    89 	}
       
    90 
       
    91 TTrackGetStateBuf::~TTrackGetStateBuf()
       
    92 	{
       
    93 	if(iRequest)
       
    94 		Kern::DestroyClientRequest(iRequest);
    88 	}
    95 	}
    89 
    96 
    90 /***************************************************************************************
    97 /***************************************************************************************
    91 	class TTrackSetStateBuf
    98 	class TTrackSetStateBuf
    92  ***************************************************************************************/
    99  ***************************************************************************************/
    93 TTrackSetStateBuf::TTrackSetStateBuf(TPowerResourceCbFn aFn, TAny* aPtr,
   100 TTrackSetStateBuf::TTrackSetStateBuf(TPowerResourceCbFn aFn, TAny* /*aPtr*/,
    94 						       TDfcQue* aQue, TInt aPriority)
   101 						       TDfcQue* aQue, TInt aPriority)
    95 							   :	iCtrlBlock(aFn, aPtr, aQue, aPriority)
   102 							   :	iCtrlBlock(aFn, this, aQue, aPriority)
    96 	{
   103 	{
    97 	iRequest = NULL;
   104 	iRequest = NULL;
       
   105 	}
       
   106 
       
   107 TTrackSetStateBuf::~TTrackSetStateBuf()
       
   108 	{
       
   109 	if(iRequest)
       
   110 		Kern::DestroyClientRequest(iRequest);
    98 	}
   111 	}
    99 
   112 
   100 /***************************************************************************************
   113 /***************************************************************************************
   101 	class TTrackNotifyBuf
   114 	class TTrackNotifyBuf
   102  ***************************************************************************************/
   115  ***************************************************************************************/
   103 TTrackNotifyBuf::TTrackNotifyBuf(TPowerResourceCbFn aFn, TAny* aPtr,
   116 TTrackNotifyBuf::TTrackNotifyBuf(TPowerResourceCbFn aFn, TAny* /*aPtr*/,
   104 								 TDfcQue* aQue, TInt aPriority)
   117 								 TDfcQue* aQue, TInt aPriority)
   105 							   :	iNotifyBlock(aFn, aPtr, aQue, aPriority)
   118 							   :	iNotifyBlock(aFn, this, aQue, aPriority)
   106 	{
   119 	{
   107 	iRequest = NULL;
   120 	iRequest = NULL;
   108 	}
   121 	}
   109 
   122 
   110 TTrackNotifyBuf::~TTrackNotifyBuf()
   123 TTrackNotifyBuf::~TTrackNotifyBuf()
   111 	{
   124 	{
   112 	if(iRequest)
   125 	if(iRequest)
   113 		Kern::DestroyClientRequest(iRequest);
   126 		Kern::DestroyClientRequest(iRequest);
   114 	}
   127 	}
   115 
   128 
   116 TTrackSetStateBuf::~TTrackSetStateBuf()
       
   117 	{
       
   118 	if(iRequest)
       
   119 		Kern::DestroyClientRequest(iRequest);
       
   120 	}
       
   121 
       
   122 TTrackGetStateBuf::~TTrackGetStateBuf()
       
   123 	{
       
   124 	if(iRequest)
       
   125 		Kern::DestroyClientRequest(iRequest);
       
   126 	}
       
   127 	
   129 	
   128 /***************************************************************************************
   130 /***************************************************************************************
   129 	class DDeviceResManUs
   131 	class DDeviceResManUs
   130  ***************************************************************************************/
   132  ***************************************************************************************/
   131 DDeviceResManUs::DDeviceResManUs()
   133 DDeviceResManUs::DDeviceResManUs()
   503 #endif
   505 #endif
   504 			r = GetAndInitTrackingBuffer(iSetStateTracker, trackBuf, (TUint)m.Ptr1(), pS);
   506 			r = GetAndInitTrackingBuffer(iSetStateTracker, trackBuf, (TUint)m.Ptr1(), pS);
   505 			if( r != KErrNone)
   507 			if( r != KErrNone)
   506 				return r;
   508 				return r;
   507 			callBack = &(((TTrackSetStateBuf*)trackBuf)->iCtrlBlock);
   509 			callBack = &(((TTrackSetStateBuf*)trackBuf)->iCtrlBlock);
   508 			new (callBack) TPowerResourceCb(&AsyncCallBackFn, (TAny*)trackBuf, iDfcQ, KResManCallBackPriority);
       
   509 			parms[0] = (TUint)m.Ptr2();
   510 			parms[0] = (TUint)m.Ptr2();
   510 			parms[1] = (TUint)callBack;
   511 			parms[1] = (TUint)callBack;
   511 			m.iArg[2] = &(parms[0]);
   512 			m.iArg[2] = &(parms[0]);
   512 			break;
   513 			break;
   513 			}
   514 			}
   530 			__ASSERT_ALWAYS(m.Ptr1() != NULL, RESMANUS_FAULT());
   531 			__ASSERT_ALWAYS(m.Ptr1() != NULL, RESMANUS_FAULT());
   531 			r = GetAndInitTrackingBuffer(iListenableTracker, trackBuf, (TUint)m.Ptr1(), pS);
   532 			r = GetAndInitTrackingBuffer(iListenableTracker, trackBuf, (TUint)m.Ptr1(), pS);
   532 			if(r != KErrNone)
   533 			if(r != KErrNone)
   533 				return r;
   534 				return r;
   534 			prn = &(((TTrackNotifyBuf*)trackBuf)->iNotifyBlock);
   535 			prn = &(((TTrackNotifyBuf*)trackBuf)->iNotifyBlock);
   535 			new (prn) DPowerResourceNotification(&AsyncCallBackFn, (TAny*)trackBuf, iDfcQ, KResManCallBackPriority);
       
   536 			m.iArg[2] = (TAny*)prn;
   536 			m.iArg[2] = (TAny*)prn;
   537 			break;
   537 			break;
   538 			}
   538 			}
   539 		case RBusDevResManUs::ERequestQualifiedChangeNotification:
   539 		case RBusDevResManUs::ERequestQualifiedChangeNotification:
   540 			{
   540 			{
   544 			m.iArg[2] = &parms[0];
   544 			m.iArg[2] = &parms[0];
   545 			r = GetAndInitTrackingBuffer(iListenableTracker, trackBuf, (TUint)parms[0], pS);
   545 			r = GetAndInitTrackingBuffer(iListenableTracker, trackBuf, (TUint)parms[0], pS);
   546 			if(r != KErrNone)
   546 			if(r != KErrNone)
   547 				return r;
   547 				return r;
   548 			prn = &(((TTrackNotifyBuf*)trackBuf)->iNotifyBlock);
   548 			prn = &(((TTrackNotifyBuf*)trackBuf)->iNotifyBlock);
   549 			new (prn) DPowerResourceNotification(&AsyncCallBackFn, (TAny*)trackBuf, iDfcQ, KResManCallBackPriority);
       
   550 			parms[2] = (TUint)prn;
   549 			parms[2] = (TUint)prn;
   551 			break;
   550 			break;
   552 			}
   551 			}
   553 		default:
   552 		default:
   554 			{
   553 			{
  2018 	if(r==KErrNone)
  2017 	if(r==KErrNone)
  2019 		{
  2018 		{
  2020 		TTrackGetStateBuf* stateBuf = (TTrackGetStateBuf*)aBuffer;
  2019 		TTrackGetStateBuf* stateBuf = (TTrackGetStateBuf*)aBuffer;
  2021 		stateBuf->iRequest->SetDestPtr1(aState);
  2020 		stateBuf->iRequest->SetDestPtr1(aState);
  2022 		stateBuf->iRequest->SetDestPtr2(aLevelOwnerPtr);
  2021 		stateBuf->iRequest->SetDestPtr2(aLevelOwnerPtr);
  2023 		// Use placement new to update the content of the TPowerResourceCb
       
  2024 		aCb = &(stateBuf->iCtrlBlock);
  2022 		aCb = &(stateBuf->iCtrlBlock);
  2025 		new (aCb) TPowerResourceCb(&AsyncCallBackFn,(TAny*)aBuffer,iDfcQ,KResManCallBackPriority);
       
  2026 		}
  2023 		}
  2027 	return r;
  2024 	return r;
  2028 	}
  2025 	}
  2029 
  2026 
  2030 #ifdef _DUMP_TRACKERS
  2027 #ifdef _DUMP_TRACKERS
  2050 			Kern::Printf("= Notify tracker\n");
  2047 			Kern::Printf("= Notify tracker\n");
  2051 		break;
  2048 		break;
  2052 		}
  2049 		}
  2053 	Kern::Printf("iOwningChannel at 0x%x\n",aTracker->iOwningChannel);
  2050 	Kern::Printf("iOwningChannel at 0x%x\n",aTracker->iOwningChannel);
  2054 	Kern::Printf("iFreeQue at 0x%x\n",aTracker->iFreeQue);
  2051 	Kern::Printf("iFreeQue at 0x%x\n",aTracker->iFreeQue);
       
  2052 	
  2055 	SDblQueLink* buf;
  2053 	SDblQueLink* buf;
  2056 	if(aTracker->iFreeQue!=NULL)
  2054 	if(aTracker->iFreeQue!=NULL)
  2057 		{
  2055 		{
  2058 		buf=aTracker->iFreeQue->First();
  2056 		SDblQueLink* anchor = &(aTracker->iFreeQue->iA);
  2059 		while(buf!=aTracker->iFreeQue->Last())
  2057 		buf = anchor->iNext;
  2060 			{
  2058 		while(anchor != buf )
  2061 			Kern::Printf("iFreeQue first buffer at 0x%x\n",buf);
  2059 			{
       
  2060 			Kern::Printf("iFreeQue buffer at 0x%x\n",buf);
  2062 			TAny* intermediatePtr = (TAny*)buf;
  2061 			TAny* intermediatePtr = (TAny*)buf;
  2063 			if((aTracker->iType == EGetState)||(aTracker->iType == ESetState))
  2062 			if(aTracker->iType == EGetState)
       
  2063 				{
       
  2064 				TTrackGetStateBuf* tempBuf =(TTrackGetStateBuf*)intermediatePtr;
       
  2065 				Kern::Printf("TTrackGetStateBuf buffer control block at 0x%x\n",&(tempBuf->iCtrlBlock));
       
  2066 				}
       
  2067 			else if(aTracker->iType == ESetState)
  2064 				{
  2068 				{
  2065 				TTrackSetStateBuf* tempBuf =(TTrackSetStateBuf*)intermediatePtr;
  2069 				TTrackSetStateBuf* tempBuf =(TTrackSetStateBuf*)intermediatePtr;
  2066 				Kern::Printf("buffer control block at 0x%x\n",(TInt)&tempBuf->iCtrlBlock);
  2070 				Kern::Printf("TTrackSetStateBuf buffer control block at 0x%x\n",&(tempBuf->iCtrlBlock));
       
  2071 				}
       
  2072 			else if(aTracker->iType == ENotify)
       
  2073 				{
       
  2074 				TTrackNotifyBuf* tempBuf =(TTrackNotifyBuf*)intermediatePtr;
       
  2075 				Kern::Printf("TTrackNotifyBuf buffer notify block at 0x%x\n",&(tempBuf->iNotifyBlock));
  2067 				}
  2076 				}
  2068 			buf = buf->iNext;
  2077 			buf = buf->iNext;
  2069 			};
  2078 			};
  2070 		}
  2079 		}
  2071 	Kern::Printf("iBusyQue at 0x%x\n",aTracker->iBusyQue);
  2080 	Kern::Printf("iBusyQue at 0x%x\n",aTracker->iBusyQue);
  2072 	if(aTracker->iBusyQue!=NULL)
  2081 	if(aTracker->iBusyQue!=NULL)
  2073 		{
  2082 		{
  2074 		buf=aTracker->iBusyQue->First();
  2083 		SDblQueLink* anchor = &(aTracker->iBusyQue->iA);
  2075 		while(buf!=aTracker->iBusyQue->Last())
  2084 		buf = anchor->iNext;
       
  2085 		while(anchor != buf )
  2076 			{
  2086 			{
  2077 			Kern::Printf("iBusyQue buffer at 0x%x\n",buf);
  2087 			Kern::Printf("iBusyQue buffer at 0x%x\n",buf);
  2078 			TAny* intermediatePtr = (TAny*)buf;
  2088 			TAny* intermediatePtr = (TAny*)buf;
  2079 			if((aTracker->iType == EGetState)||(aTracker->iType == ESetState))
  2089 			if(aTracker->iType == EGetState)
       
  2090 				{
       
  2091 				TTrackGetStateBuf* tempBuf =(TTrackGetStateBuf*)intermediatePtr;
       
  2092 				Kern::Printf("TTrackGetStateBuf buffer control block at 0x%x\n",&(tempBuf->iCtrlBlock));
       
  2093 				}
       
  2094 			else if(aTracker->iType == ESetState)
  2080 				{
  2095 				{
  2081 				TTrackSetStateBuf* tempBuf =(TTrackSetStateBuf*)intermediatePtr;
  2096 				TTrackSetStateBuf* tempBuf =(TTrackSetStateBuf*)intermediatePtr;
  2082 				Kern::Printf("buffer control block at 0x%x\n", (TInt)&tempBuf->iCtrlBlock);
  2097 				Kern::Printf("TTrackSetStateBuf buffer control block at 0x%x\n",&(tempBuf->iCtrlBlock));
       
  2098 				}
       
  2099 			else if(aTracker->iType == ENotify)
       
  2100 				{
       
  2101 				TTrackNotifyBuf* tempBuf =(TTrackNotifyBuf*)intermediatePtr;
       
  2102 				Kern::Printf("TTrackNotifyBuf buffer notify block at 0x%x\n",&(tempBuf->iNotifyBlock));
  2083 				}
  2103 				}
  2084 			buf= buf->iNext;
  2104 			buf= buf->iNext;
  2085 			};
  2105 			};
  2086 		}
  2106 		}
  2087 	}
  2107 	}
  2155 			}
  2175 			}
  2156 		// If buffer allocation failed, need to remove all previously-allocated buffers and the queues
  2176 		// If buffer allocation failed, need to remove all previously-allocated buffers and the queues
  2157 		if(r!=KErrNone)
  2177 		if(r!=KErrNone)
  2158 			{
  2178 			{
  2159 			SDblQueLink* ptr = (aTracker->iFreeQue)->First();
  2179 			SDblQueLink* ptr = (aTracker->iFreeQue)->First();
       
  2180 			TTrackingBuffer *buf = NULL;
  2160 			do
  2181 			do
  2161 				{
  2182 				{
  2162 				SDblQueLink* next = NULL;
  2183 				SDblQueLink* next = NULL;
  2163 				if(ptr !=NULL)
  2184 				if(ptr !=NULL)
  2164 					next = ptr->iNext;
  2185 					next = ptr->iNext;
  2165 				delete ptr;
  2186 				buf = (TTrackingBuffer *)ptr;
       
  2187 				DELETE_TRACKING_BUFFER(aTracker,buf)
  2166 				ptr = next;
  2188 				ptr = next;
  2167 				} while ((ptr!=NULL)&&(ptr!=(aTracker->iFreeQue)->Last()));
  2189 				} while ((ptr!=NULL)&&(ptr!=(aTracker->iFreeQue)->Last()));
  2168 			delete aTracker->iFreeQue;
  2190 			delete aTracker->iFreeQue;
  2169 			delete aTracker->iBusyQue;
  2191 			delete aTracker->iBusyQue;
  2170 			}
  2192 			}