diff -r 6295dc2169f3 -r 8486d82aef45 connectivitylayer/isce/isirouter_dll/src/isikernelchannel.cpp --- a/connectivitylayer/isce/isirouter_dll/src/isikernelchannel.cpp Wed Apr 21 14:29:55 2010 +0300 +++ b/connectivitylayer/isce/isirouter_dll/src/isikernelchannel.cpp Tue Oct 19 13:16:20 2010 +0300 @@ -22,7 +22,7 @@ #include // For TDfc #include "isikernelchannel.h" // For DISIKernelChannel #include "isiroutertrace.h" // For C_TRACE, ASSERT_RESET.. and fault codes -#include "misichannelrouterif.h" // For MISIChannelRouterIf +#include "misiobjectrouterif.h" // For MISIObjectRouterIf #include "memapi.h" // For MemApi #include "isimsgqueue.h" // For DISIMsgQueue @@ -67,16 +67,18 @@ DISIKernelChannel::DISIKernelChannel( const TUint16& aObjId ) : iKernelChMsgQue( MsgQDfc, this, NULL, KISIKernelChannelMsgQueDfcPrio ) + , iObjId(KNotInitializedId) + , iUID( KNotInitializedUID ) { C_TRACE( ( _T( "DISIKernelChannel::DISIKernelChannel 0x%x>" ), this ) ); - iRouterIf = MISIChannelRouterIf::GetIf(); + iRouterIf = MISIObjectRouterIf::GetIf(); ASSERT_RESET_ALWAYS( iRouterIf, ( EISIKernelChannelMemAllocFailure | EDISIKernelChannelId << KClassIdentifierShift ) ); iRequests = new DISIKernelAsyncRequests( EISILastAsyncRequest ); iRx = new DISIMsgQueue( KISILddRxQueueSize ); - iCompletionThread = iRouterIf->GetDfcThread( MISIChannelRouterIf::EISIUserRequestCompletionThread ); + iCompletionThread = iRouterIf->GetDfcThread( MISIObjectRouterIf::EISIUserRequestCompletionThread ); iEmptyRxDfc = new TDfc( EmptyRxDfc, this, iCompletionThread, KISIKernelEmptyRxQueuePrio ); ASSERT_RESET_ALWAYS( ( iEmptyRxDfc && iRequests && iRx ), ( EISIKernelChannelMemAllocFailure1 | EDISIKernelChannelId << KClassIdentifierShift ) ); - iMainThread = iRouterIf->GetDfcThread( MISIChannelRouterIf::EISIKernelMainThread ); + iMainThread = iRouterIf->GetDfcThread( MISIObjectRouterIf::EISIKernelMainThread ); iKernelChMsgQue.SetDfcQ( iMainThread ); iKernelChMsgQue.Receive(); C_TRACE( ( _T( "DISIKernelChannel::DISIKernelChannel 0x%x<" ), this ) ); @@ -97,9 +99,12 @@ iRx = NULL; C_TRACE( ( _T( "DISIKernelChannel::~DISIKernelChannel iEmptyRxDfc 0x%x" ), iEmptyRxDfc ) ); // Only modified in constructor, if not created already reseted. - iEmptyRxDfc->Cancel(); - delete iEmptyRxDfc; - iEmptyRxDfc = NULL; + if ( iEmptyRxDfc ) + { + iEmptyRxDfc->Cancel(); + delete iEmptyRxDfc; + iEmptyRxDfc = NULL; + } C_TRACE( ( _T( "DISIKernelChannel::~DISIKernelChannel iRequests 0x%x" ), iEmptyRxDfc ) ); iPtrPtrToRxBuf = NULL; iRouterIf = NULL; @@ -271,95 +276,20 @@ } // Called in 1...N transceivers thread context -void DISIKernelChannel::ReceiveMsg( +void DISIKernelChannel::Receive( const TDesC8& aMessage ) { - C_TRACE( ( _T( "DISIKernelChannel::ReceiveMsg 0x%x 0x%x 0x%x>" ), this, &aMessage, iObjId ) ); + C_TRACE( ( _T( "DISIKernelChannel::Receive 0x%x 0x%x 0x%x>" ), this, &aMessage, iObjId ) ); ASSERT_THREAD_CONTEXT_ALWAYS( ( EISIKernelChannelNotThreadContext1 | EDISIKernelChannelId << KClassIdentifierShift ) ); iRx->Add( aMessage ); iEmptyRxDfc->Enque(); - C_TRACE( ( _T( "DISIKernelChannel::ReceiveMsg 0x%x 0x%x 0x%x<" ), this, &aMessage, iObjId ) ); + C_TRACE( ( _T( "DISIKernelChannel::Receive 0x%x 0x%x 0x%x<" ), this, &aMessage, iObjId ) ); } // From MISIRouterChannelIf end -DISIKernelChannel::DISIKernelAsyncRequests::DISIKernelAsyncRequests( - const TInt aSize - ) - { - C_TRACE( ( _T( "DISIKernelAsyncRequests::DISIKernelAsyncRequests size %d>" ), aSize ) ); - iRequestLock = new NFastMutex(); - iDfcFunctionList = new TDfc*[ aSize ]; - iRequestStatusList = new TRequestStatus*[ aSize ]; - C_TRACE( ( _T( "DISIKernelAsyncRequests::DISIKernelAsyncRequests<" ) ) ); - } - -DISIKernelChannel::DISIKernelAsyncRequests::~DISIKernelAsyncRequests() - { - C_TRACE( ( _T( "DISIKernelAsyncRequests::~DISIKernelAsyncRequests>" ) ) ); - // Delete space reserved for the array not the contents of the array, so mem behind pointers that are not owned are not deleted. - delete iDfcFunctionList; - delete iRequestStatusList; - // Deletes lock - delete iRequestLock; - C_TRACE( ( _T( "DISIKernelAsyncRequests::~DISIKernelAsyncRequests<" ) ) ); - } - -void DISIKernelChannel::DISIKernelAsyncRequests::SetPending( - const TUint aRequest, - TDfc* aDfc, - TRequestStatus* aStatus - ) - { - C_TRACE( ( _T( "DISIKernelAsyncRequests::SetPending %d 0x%x 0x%x>" ), aRequest, aDfc, aStatus ) ); - ASSERT_RESET_ALWAYS( aDfc, ( EISIKernelChannelNullParam5 | EDISIKernelChannelId << KClassIdentifierShift ) ); - ASSERT_RESET_ALWAYS( aStatus, ( EISIKernelChannelNullParam6 | EDISIKernelChannelId << KClassIdentifierShift ) ); - ASSERT_RESET_ALWAYS( ( EISILastAsyncRequest > aRequest && EISIAsyncReceive <= aRequest ), ( EISIKernelChannelOverTheLimits2 | EDISIKernelChannelId << KClassIdentifierShift ) ); - // Note asserts must be done before holding the lock. - NKern::FMWait( iRequestLock ); - iDfcFunctionList[ aRequest ] = aDfc; - iRequestStatusList[ aRequest ] = aStatus; - *iRequestStatusList[ aRequest ] = KRequestPending; - NKern::FMSignal( iRequestLock ); - C_TRACE( ( _T( "DISIKernelAsyncRequests::SetPending %d 0x%x 0x%x<" ), aRequest, aDfc, aStatus ) ); - } - -TBool DISIKernelChannel::DISIKernelAsyncRequests::IsPending( - const TUint aRequest - ) - { - C_TRACE( ( _T( "DISIKernelAsyncRequests::IsPending %d>" ), aRequest ) ); - ASSERT_RESET_ALWAYS( ( EISILastAsyncRequest > aRequest && EISIAsyncReceive <= aRequest ), ( EISIKernelChannelOverTheLimits3 | EDISIKernelChannelId << KClassIdentifierShift ) ); - TBool ret( EFalse ); - NKern::FMWait( iRequestLock ); - ret = ( iDfcFunctionList[ aRequest ] && iRequestStatusList[ aRequest ] ) ? ETrue : EFalse; - NKern::FMSignal( iRequestLock ); - C_TRACE( ( _T( "DISIKernelAsyncRequests::IsPending %d %d<" ), aRequest, ret ) ); - return ret; - } - -void DISIKernelChannel::DISIKernelAsyncRequests::Complete( - const TUint aRequest, - const TInt aStatusToComplete - ) - { - C_TRACE( ( _T( "DISIKernelAsyncRequests::Complete %d>" ), aRequest ) ); - // Check that request is legal. - ASSERT_RESET_ALWAYS( ( EISILastAsyncRequest > aRequest && EISIAsyncReceive <= aRequest ), ( EISIKernelChannelOverTheLimits4 | EDISIKernelChannelId << KClassIdentifierShift ) ); - NKern::FMWait( iRequestLock ); - TDfc* completeDfc = iDfcFunctionList[ aRequest ]; - if( ( completeDfc && iRequestStatusList[ aRequest ] ) ) - { - // Writing straight to clients pointer. There is a risk that malfunctioning client can mess up it's own pointer, if used out side of rx dfc, but what can you do.. - *iRequestStatusList[ aRequest ] = aStatusToComplete; - ASSERT_RESET_ALWAYS( !completeDfc->Queued(), ( EISIKernelChannelDfcAlreadyQueued | EDISIKernelChannelId << KClassIdentifierShift ) ); - completeDfc->Enque(); - iDfcFunctionList[ aRequest ] = NULL; - } - NKern::FMSignal( iRequestLock ); - C_TRACE( ( _T( "DISIKernelAsyncRequests::Complete %d<" ), aRequest ) ); - } +// Internal start void DISIKernelChannel::EmptyRxDfc( TAny* aPtr // self @@ -367,7 +297,7 @@ { C_TRACE( ( _T( "DISIKernelChannel::EmptyRxDfc>" ) ) ); DISIKernelChannel& chTmp = *reinterpret_cast( aPtr ); - C_TRACE( ( _T( "DISIKernelChannel::EmptyRxDfc 0x%x 0x%x>" ), &chTmp, chTmp.iObjId ) ); + C_TRACE( ( _T( "DISIKernelChannel::EmptyRxDfc 0x%x 0x%x" ), &chTmp, chTmp.iObjId ) ); if( chTmp.iRequests->IsPending( EISIAsyncReceive ) && chTmp.iRx->Count() > 0 ) { C_TRACE( ( _T( "DISIKernelChannel::EmptyRxDfc 0x%x writing to kernel client" ), &chTmp ) ); @@ -432,7 +362,7 @@ { C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIConnect 0x%x" ), this ) ); iUID = tablePtr[ KFirstParam ]; - TUint8* objIdPtr = reinterpret_cast( tablePtr[ KSecondParam ] ); //TODO vasta tempobjid + TUint8* objIdPtr = reinterpret_cast( tablePtr[ KSecondParam ] ); C_TRACE( ( _T( "DISIKernelChannel::HandleDfcRequest EISINokiaKernelOpen 0x%x" ), this ) ); iRouterIf->Connect( iUID, iObjId, this ); *objIdPtr = iObjId; @@ -516,7 +446,7 @@ ) { C_TRACE( ( _T( "DISIKernelChannel::ResetQueues 0x%x 0x%x>" ), this, iObjId ) ); - // TODO: assert router ext thread context + // assert router ext thread context if( iRx ) { C_TRACE( ( _T( "DISIKernelChannel::ResetQueues 0x%x iRx 0x%x" ), this, iRx ) ); @@ -528,5 +458,84 @@ C_TRACE( ( _T( "DISIKernelChannel::ResetQueues 0x%x 0x%x<" ), this, iObjId ) ); } +DISIKernelChannel::DISIKernelAsyncRequests::DISIKernelAsyncRequests( + const TInt aSize + ) + { + C_TRACE( ( _T( "DISIKernelAsyncRequests::DISIKernelAsyncRequests size %d>" ), aSize ) ); + iRequestLock = new NFastMutex(); + iDfcFunctionList = new TDfc*[ aSize ]; + iRequestStatusList = new TRequestStatus*[ aSize ]; + C_TRACE( ( _T( "DISIKernelAsyncRequests::DISIKernelAsyncRequests<" ) ) ); + } + +DISIKernelChannel::DISIKernelAsyncRequests::~DISIKernelAsyncRequests() + { + C_TRACE( ( _T( "DISIKernelAsyncRequests::~DISIKernelAsyncRequests>" ) ) ); + // Delete space reserved for the array not the contents of the array, so mem behind pointers that are not owned are not deleted. + delete iDfcFunctionList; + delete iRequestStatusList; + // Deletes lock + delete iRequestLock; + C_TRACE( ( _T( "DISIKernelAsyncRequests::~DISIKernelAsyncRequests<" ) ) ); + } + +void DISIKernelChannel::DISIKernelAsyncRequests::SetPending( + const TUint aRequest, + TDfc* aDfc, + TRequestStatus* aStatus + ) + { + C_TRACE( ( _T( "DISIKernelAsyncRequests::SetPending %d 0x%x 0x%x>" ), aRequest, aDfc, aStatus ) ); + ASSERT_RESET_ALWAYS( aDfc, ( EISIKernelChannelNullParam5 | EDISIKernelChannelId << KClassIdentifierShift ) ); + ASSERT_RESET_ALWAYS( aStatus, ( EISIKernelChannelNullParam6 | EDISIKernelChannelId << KClassIdentifierShift ) ); + ASSERT_RESET_ALWAYS( ( EISILastAsyncRequest > aRequest && EISIAsyncReceive <= aRequest ), ( EISIKernelChannelOverTheLimits2 | EDISIKernelChannelId << KClassIdentifierShift ) ); + // Note asserts must be done before holding the lock. + NKern::FMWait( iRequestLock ); + iDfcFunctionList[ aRequest ] = aDfc; + iRequestStatusList[ aRequest ] = aStatus; + *iRequestStatusList[ aRequest ] = KRequestPending; + NKern::FMSignal( iRequestLock ); + C_TRACE( ( _T( "DISIKernelAsyncRequests::SetPending %d 0x%x 0x%x<" ), aRequest, aDfc, aStatus ) ); + } + +TBool DISIKernelChannel::DISIKernelAsyncRequests::IsPending( + const TUint aRequest + ) + { + C_TRACE( ( _T( "DISIKernelAsyncRequests::IsPending %d>" ), aRequest ) ); + ASSERT_RESET_ALWAYS( ( EISILastAsyncRequest > aRequest && EISIAsyncReceive <= aRequest ), ( EISIKernelChannelOverTheLimits3 | EDISIKernelChannelId << KClassIdentifierShift ) ); + TBool ret( EFalse ); + NKern::FMWait( iRequestLock ); + ret = ( iDfcFunctionList[ aRequest ] && iRequestStatusList[ aRequest ] ) ? ETrue : EFalse; + NKern::FMSignal( iRequestLock ); + C_TRACE( ( _T( "DISIKernelAsyncRequests::IsPending %d %d<" ), aRequest, ret ) ); + return ret; + } + +void DISIKernelChannel::DISIKernelAsyncRequests::Complete( + const TUint aRequest, + const TInt aStatusToComplete + ) + { + C_TRACE( ( _T( "DISIKernelAsyncRequests::Complete %d>" ), aRequest ) ); + // Check that request is legal. + ASSERT_RESET_ALWAYS( ( EISILastAsyncRequest > aRequest && EISIAsyncReceive <= aRequest ), ( EISIKernelChannelOverTheLimits4 | EDISIKernelChannelId << KClassIdentifierShift ) ); + NKern::FMWait( iRequestLock ); + TDfc* completeDfc = iDfcFunctionList[ aRequest ]; + if( ( completeDfc && iRequestStatusList[ aRequest ] ) ) + { + // Writing straight to clients pointer. There is a risk that malfunctioning client can mess up it's own pointer, if used out side of rx dfc, but what can you do.. + *iRequestStatusList[ aRequest ] = aStatusToComplete; + ASSERT_RESET_ALWAYS( !completeDfc->Queued(), ( EISIKernelChannelDfcAlreadyQueued | EDISIKernelChannelId << KClassIdentifierShift ) ); + completeDfc->Enque(); + iDfcFunctionList[ aRequest ] = NULL; + } + NKern::FMSignal( iRequestLock ); + C_TRACE( ( _T( "DISIKernelAsyncRequests::Complete %d<" ), aRequest ) ); + } + +// Internal end + // End of file.