65 |
65 |
66 |
66 |
67 DISIKernelChannel::DISIKernelChannel( |
67 DISIKernelChannel::DISIKernelChannel( |
68 const TUint16& aObjId |
68 const TUint16& aObjId |
69 ) : iKernelChMsgQue( MsgQDfc, this, NULL, KISIKernelChannelMsgQueDfcPrio ) |
69 ) : iKernelChMsgQue( MsgQDfc, this, NULL, KISIKernelChannelMsgQueDfcPrio ) |
|
70 , iObjId(KNotInitializedId) |
|
71 , iUID( KNotInitializedUID ) |
70 { |
72 { |
71 C_TRACE( ( _T( "DISIKernelChannel::DISIKernelChannel 0x%x>" ), this ) ); |
73 C_TRACE( ( _T( "DISIKernelChannel::DISIKernelChannel 0x%x>" ), this ) ); |
72 iRouterIf = MISIChannelRouterIf::GetIf(); |
74 iRouterIf = MISIObjectRouterIf::GetIf(); |
73 ASSERT_RESET_ALWAYS( iRouterIf, ( EISIKernelChannelMemAllocFailure | EDISIKernelChannelId << KClassIdentifierShift ) ); |
75 ASSERT_RESET_ALWAYS( iRouterIf, ( EISIKernelChannelMemAllocFailure | EDISIKernelChannelId << KClassIdentifierShift ) ); |
74 iRequests = new DISIKernelAsyncRequests( EISILastAsyncRequest ); |
76 iRequests = new DISIKernelAsyncRequests( EISILastAsyncRequest ); |
75 iRx = new DISIMsgQueue( KISILddRxQueueSize ); |
77 iRx = new DISIMsgQueue( KISILddRxQueueSize ); |
76 iCompletionThread = iRouterIf->GetDfcThread( MISIChannelRouterIf::EISIUserRequestCompletionThread ); |
78 iCompletionThread = iRouterIf->GetDfcThread( MISIObjectRouterIf::EISIUserRequestCompletionThread ); |
77 iEmptyRxDfc = new TDfc( EmptyRxDfc, this, iCompletionThread, KISIKernelEmptyRxQueuePrio ); |
79 iEmptyRxDfc = new TDfc( EmptyRxDfc, this, iCompletionThread, KISIKernelEmptyRxQueuePrio ); |
78 ASSERT_RESET_ALWAYS( ( iEmptyRxDfc && iRequests && iRx ), ( EISIKernelChannelMemAllocFailure1 | EDISIKernelChannelId << KClassIdentifierShift ) ); |
80 ASSERT_RESET_ALWAYS( ( iEmptyRxDfc && iRequests && iRx ), ( EISIKernelChannelMemAllocFailure1 | EDISIKernelChannelId << KClassIdentifierShift ) ); |
79 iMainThread = iRouterIf->GetDfcThread( MISIChannelRouterIf::EISIKernelMainThread ); |
81 iMainThread = iRouterIf->GetDfcThread( MISIObjectRouterIf::EISIKernelMainThread ); |
80 iKernelChMsgQue.SetDfcQ( iMainThread ); |
82 iKernelChMsgQue.SetDfcQ( iMainThread ); |
81 iKernelChMsgQue.Receive(); |
83 iKernelChMsgQue.Receive(); |
82 C_TRACE( ( _T( "DISIKernelChannel::DISIKernelChannel 0x%x<" ), this ) ); |
84 C_TRACE( ( _T( "DISIKernelChannel::DISIKernelChannel 0x%x<" ), this ) ); |
83 } |
85 } |
84 |
86 |
269 } |
274 } |
270 C_TRACE( ( _T( "DISIKernelChannel::HandleDfcRequest 0x%x 0x%x 0x%x<" ), this, &aMsg, iObjId ) ); |
275 C_TRACE( ( _T( "DISIKernelChannel::HandleDfcRequest 0x%x 0x%x 0x%x<" ), this, &aMsg, iObjId ) ); |
271 } |
276 } |
272 |
277 |
273 // Called in 1...N transceivers thread context |
278 // Called in 1...N transceivers thread context |
274 void DISIKernelChannel::ReceiveMsg( |
279 void DISIKernelChannel::Receive( |
275 const TDesC8& aMessage |
280 const TDesC8& aMessage |
276 ) |
281 ) |
277 { |
282 { |
278 C_TRACE( ( _T( "DISIKernelChannel::ReceiveMsg 0x%x 0x%x 0x%x>" ), this, &aMessage, iObjId ) ); |
283 C_TRACE( ( _T( "DISIKernelChannel::Receive 0x%x 0x%x 0x%x>" ), this, &aMessage, iObjId ) ); |
279 ASSERT_THREAD_CONTEXT_ALWAYS( ( EISIKernelChannelNotThreadContext1 | EDISIKernelChannelId << KClassIdentifierShift ) ); |
284 ASSERT_THREAD_CONTEXT_ALWAYS( ( EISIKernelChannelNotThreadContext1 | EDISIKernelChannelId << KClassIdentifierShift ) ); |
280 iRx->Add( aMessage ); |
285 iRx->Add( aMessage ); |
281 iEmptyRxDfc->Enque(); |
286 iEmptyRxDfc->Enque(); |
282 C_TRACE( ( _T( "DISIKernelChannel::ReceiveMsg 0x%x 0x%x 0x%x<" ), this, &aMessage, iObjId ) ); |
287 C_TRACE( ( _T( "DISIKernelChannel::Receive 0x%x 0x%x 0x%x<" ), this, &aMessage, iObjId ) ); |
283 } |
288 } |
284 |
289 |
285 // From MISIRouterChannelIf end |
290 // From MISIRouterChannelIf end |
|
291 |
|
292 // Internal start |
|
293 |
|
294 void DISIKernelChannel::EmptyRxDfc( |
|
295 TAny* aPtr // self |
|
296 ) |
|
297 { |
|
298 C_TRACE( ( _T( "DISIKernelChannel::EmptyRxDfc>" ) ) ); |
|
299 DISIKernelChannel& chTmp = *reinterpret_cast<DISIKernelChannel*>( aPtr ); |
|
300 C_TRACE( ( _T( "DISIKernelChannel::EmptyRxDfc 0x%x 0x%x" ), &chTmp, chTmp.iObjId ) ); |
|
301 if( chTmp.iRequests->IsPending( EISIAsyncReceive ) && chTmp.iRx->Count() > 0 ) |
|
302 { |
|
303 C_TRACE( ( _T( "DISIKernelChannel::EmptyRxDfc 0x%x writing to kernel client" ), &chTmp ) ); |
|
304 TDes8*& tmpWrite = *chTmp.iPtrPtrToRxBuf; |
|
305 tmpWrite = &chTmp.iRx->Get(); |
|
306 C_TRACE( ( _T( "DISIKernelChannel::EmptyRxDfc 0x%x 0x%x 0x%x clientRx 0x%x " ), &chTmp, chTmp.iPtrPtrToRxBuf, &chTmp.iPtrPtrToRxBuf, *chTmp.iPtrPtrToRxBuf ) ); |
|
307 chTmp.EnqueChannelRequestCompleteDfc( EISIAsyncReceive, KErrNone ); |
|
308 } |
|
309 else |
|
310 { |
|
311 C_TRACE( ( _T( "DISIKernelChannel::EmptyRxDfc 0x%x no receive active or no message" ), &chTmp ) ); |
|
312 } |
|
313 C_TRACE( ( _T( "DISIKernelChannel::EmptyRxDfc 0x%x 0x%x<" ), &chTmp, chTmp.iObjId ) ); |
|
314 } |
|
315 |
|
316 void DISIKernelChannel::DoCancel( |
|
317 TInt aRequest, |
|
318 TInt aMask ) |
|
319 { |
|
320 C_TRACE( ( _T( "DISIKernelChannel::DoCancel 0x%x 0x%x>" ), this, iObjId ) ); |
|
321 ASSERT_RESET_ALWAYS( EISILastAsyncRequest > ( aMask&aRequest ), EISIKernelChannelOverTheLimits | EDISIKernelChannelId << KClassIdentifierShift ); |
|
322 if( iRequests->IsPending( aMask&aRequest ) ) |
|
323 { |
|
324 switch( aMask&aRequest ) |
|
325 { |
|
326 case EISIAsyncReceive: |
|
327 { |
|
328 C_TRACE( ( _T( "DISIKernelChannel::DoCancel EIADAsyncReceive 0x%x ptrs 0x%x 0x%x" ), this, iPtrPtrToRxBuf, &iPtrPtrToRxBuf ) ); |
|
329 iPtrPtrToRxBuf = NULL; |
|
330 break; |
|
331 } |
|
332 default: |
|
333 { |
|
334 ASSERT_RESET_ALWAYS( 0, EISIKernelChannelWrongRequest | EDISIKernelChannelId << KClassIdentifierShift ); |
|
335 break; |
|
336 } |
|
337 } |
|
338 EnqueChannelRequestCompleteDfc( aMask&aRequest, KErrCancel ); |
|
339 } |
|
340 else |
|
341 { |
|
342 C_TRACE( ( _T( "DISIKernelChannel::DoCancel nothing to cancel 0x%x" ), this ) ); |
|
343 } |
|
344 C_TRACE( ( _T( "DISIKernelChannel::DoCancel 0x%x 0x%x<" ), this, iObjId ) ); |
|
345 } |
|
346 |
|
347 TInt DISIKernelChannel::HandleSyncRequest( |
|
348 TThreadMessage& aMsg |
|
349 ) |
|
350 { |
|
351 C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest 0x%x 0x%x 0x%x>" ), this, &aMsg, iObjId ) ); |
|
352 TThreadMessage& m = ( aMsg ); |
|
353 TInt request( m.iValue ); |
|
354 ASSERT_RESET_ALWAYS( m.iArg, ( EISIKernelChannelNullParam4 | EDISIKernelChannelId << KClassIdentifierShift ) ); |
|
355 TInt returnValue( KErrNone ); |
|
356 C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest 0x%x handling %d" ), this, request ) ); |
|
357 TUint32* tablePtr = reinterpret_cast<TUint32*>( m.Ptr0() ); |
|
358 |
|
359 switch( request ) |
|
360 { |
|
361 case EISIConnect: |
|
362 { |
|
363 C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIConnect 0x%x" ), this ) ); |
|
364 iUID = tablePtr[ KFirstParam ]; |
|
365 TUint8* objIdPtr = reinterpret_cast<TUint8*>( tablePtr[ KSecondParam ] ); |
|
366 C_TRACE( ( _T( "DISIKernelChannel::HandleDfcRequest EISINokiaKernelOpen 0x%x" ), this ) ); |
|
367 iRouterIf->Connect( iUID, iObjId, this ); |
|
368 *objIdPtr = iObjId; |
|
369 C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIConnect 0x%x" ), this ) ); |
|
370 break; |
|
371 } |
|
372 case EISIDisconnect: |
|
373 { |
|
374 C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIDisconnect 0x%x" ), this ) ); |
|
375 Disconnect(); |
|
376 C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIDisconnect 0x%x" ), this ) ); |
|
377 returnValue = KErrNone; |
|
378 break; |
|
379 } |
|
380 case EISIAllocateBlock: |
|
381 { |
|
382 C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIAllocateBlock 0x%x" ), this ) ); |
|
383 const TInt size = *reinterpret_cast<TInt*>( tablePtr[ KFirstParam ] ); |
|
384 TDes8*& block = *(reinterpret_cast<TDes8**>( tablePtr[ KSecondParam ] )); |
|
385 C_TRACE( ( _T( "DISIKernelChannel:: EISIAllocateBlock 0x%x block 0x%x %d" ), this, block, size ) ); |
|
386 block = ( &MemApi::AllocBlock( size ) ); |
|
387 C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIAllocateBlock 0x%x" ), this ) ); |
|
388 break; |
|
389 } |
|
390 case EISIDeallocateBlock: |
|
391 { |
|
392 C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIDeallocateBlock 0x%x" ), this ) ); |
|
393 TDes8& block = *reinterpret_cast<TDes8*>( tablePtr[ KFirstParam ] ); |
|
394 C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIAllocateBlock 0x%x block 0x%x" ), this, &block ) ); |
|
395 // Needed to ensure that right channel is deleting the right block. (Could it be done otherways too?) |
|
396 if( iPtrPtrToRxBuf ) |
|
397 { |
|
398 if ( &block == *iPtrPtrToRxBuf ) |
|
399 { |
|
400 C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest release 0x%x 0x%x clientRx 0x%x"), iPtrPtrToRxBuf, &iPtrPtrToRxBuf, *iPtrPtrToRxBuf ) ); |
|
401 iPtrPtrToRxBuf = NULL; |
|
402 } |
|
403 } |
|
404 MemApi::DeallocBlock( block ); |
|
405 C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIDeallocateBlock 0x%x" ), this ) ); |
|
406 break; |
|
407 } |
|
408 case EISISend: |
|
409 { |
|
410 C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISISend 0x%x" ), this ) ); |
|
411 TDes8& block = *reinterpret_cast<TDes8*>( tablePtr[ KFirstParam ] ); |
|
412 C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISISend 0x%x block 0x%x" ), this, &block ) ); |
|
413 returnValue = iRouterIf->Send( block, iObjId ); |
|
414 C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISISend 0x%x" ), this ) ); |
|
415 break; |
|
416 } |
|
417 default: |
|
418 { |
|
419 ASSERT_RESET_ALWAYS( 0, ( EISIKernelChannelWrongRequest3 | EDISIKernelChannelId << KClassIdentifierShift ) ); |
|
420 break; |
|
421 } |
|
422 } |
|
423 C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest 0x%x 0x%x %d 0x%x<" ), this, &aMsg, returnValue, iObjId ) ); |
|
424 return returnValue; |
|
425 } |
|
426 |
|
427 void DISIKernelChannel::Disconnect( |
|
428 // None |
|
429 ) |
|
430 { |
|
431 C_TRACE( ( _T( "DISIKernelChannel::Disconnect 0x%x 0x%x>" ), this, iObjId ) ); |
|
432 ResetQueues(); |
|
433 for( TInt i( EISILastSyncRequest ); i < EISILastAsyncRequest; ++i ) |
|
434 { |
|
435 C_TRACE( ( _T( "DISIKernelChannel::CancelRequests req to cancel %d" ), i ) ); |
|
436 DoCancel( KMaxTInt, i ); |
|
437 } |
|
438 iRouterIf->Disconnect( iObjId ); |
|
439 iRouterIf->FreeDfcThread( iMainThread ); |
|
440 iRouterIf->FreeDfcThread( iCompletionThread ); |
|
441 C_TRACE( ( _T( "DISIKernelChannel::Disconnect 0x%x 0x%x<" ), this, iObjId ) ); |
|
442 } |
|
443 |
|
444 void DISIKernelChannel::ResetQueues( |
|
445 // None |
|
446 ) |
|
447 { |
|
448 C_TRACE( ( _T( "DISIKernelChannel::ResetQueues 0x%x 0x%x>" ), this, iObjId ) ); |
|
449 // assert router ext thread context |
|
450 if( iRx ) |
|
451 { |
|
452 C_TRACE( ( _T( "DISIKernelChannel::ResetQueues 0x%x iRx 0x%x" ), this, iRx ) ); |
|
453 while( iRx->Count() ) |
|
454 { |
|
455 MemApi::DeallocBlock( iRx->Get() ); |
|
456 } |
|
457 } |
|
458 C_TRACE( ( _T( "DISIKernelChannel::ResetQueues 0x%x 0x%x<" ), this, iObjId ) ); |
|
459 } |
286 |
460 |
287 DISIKernelChannel::DISIKernelAsyncRequests::DISIKernelAsyncRequests( |
461 DISIKernelChannel::DISIKernelAsyncRequests::DISIKernelAsyncRequests( |
288 const TInt aSize |
462 const TInt aSize |
289 ) |
463 ) |
290 { |
464 { |
359 } |
533 } |
360 NKern::FMSignal( iRequestLock ); |
534 NKern::FMSignal( iRequestLock ); |
361 C_TRACE( ( _T( "DISIKernelAsyncRequests::Complete %d<" ), aRequest ) ); |
535 C_TRACE( ( _T( "DISIKernelAsyncRequests::Complete %d<" ), aRequest ) ); |
362 } |
536 } |
363 |
537 |
364 void DISIKernelChannel::EmptyRxDfc( |
538 // Internal end |
365 TAny* aPtr // self |
|
366 ) |
|
367 { |
|
368 C_TRACE( ( _T( "DISIKernelChannel::EmptyRxDfc>" ) ) ); |
|
369 DISIKernelChannel& chTmp = *reinterpret_cast<DISIKernelChannel*>( aPtr ); |
|
370 C_TRACE( ( _T( "DISIKernelChannel::EmptyRxDfc 0x%x 0x%x>" ), &chTmp, chTmp.iObjId ) ); |
|
371 if( chTmp.iRequests->IsPending( EISIAsyncReceive ) && chTmp.iRx->Count() > 0 ) |
|
372 { |
|
373 C_TRACE( ( _T( "DISIKernelChannel::EmptyRxDfc 0x%x writing to kernel client" ), &chTmp ) ); |
|
374 TDes8*& tmpWrite = *chTmp.iPtrPtrToRxBuf; |
|
375 tmpWrite = &chTmp.iRx->Get(); |
|
376 C_TRACE( ( _T( "DISIKernelChannel::EmptyRxDfc 0x%x 0x%x 0x%x clientRx 0x%x " ), &chTmp, chTmp.iPtrPtrToRxBuf, &chTmp.iPtrPtrToRxBuf, *chTmp.iPtrPtrToRxBuf ) ); |
|
377 chTmp.EnqueChannelRequestCompleteDfc( EISIAsyncReceive, KErrNone ); |
|
378 } |
|
379 else |
|
380 { |
|
381 C_TRACE( ( _T( "DISIKernelChannel::EmptyRxDfc 0x%x no receive active or no message" ), &chTmp ) ); |
|
382 } |
|
383 C_TRACE( ( _T( "DISIKernelChannel::EmptyRxDfc 0x%x 0x%x<" ), &chTmp, chTmp.iObjId ) ); |
|
384 } |
|
385 |
|
386 void DISIKernelChannel::DoCancel( |
|
387 TInt aRequest, |
|
388 TInt aMask ) |
|
389 { |
|
390 C_TRACE( ( _T( "DISIKernelChannel::DoCancel 0x%x 0x%x>" ), this, iObjId ) ); |
|
391 ASSERT_RESET_ALWAYS( EISILastAsyncRequest > ( aMask&aRequest ), EISIKernelChannelOverTheLimits | EDISIKernelChannelId << KClassIdentifierShift ); |
|
392 if( iRequests->IsPending( aMask&aRequest ) ) |
|
393 { |
|
394 switch( aMask&aRequest ) |
|
395 { |
|
396 case EISIAsyncReceive: |
|
397 { |
|
398 C_TRACE( ( _T( "DISIKernelChannel::DoCancel EIADAsyncReceive 0x%x ptrs 0x%x 0x%x" ), this, iPtrPtrToRxBuf, &iPtrPtrToRxBuf ) ); |
|
399 iPtrPtrToRxBuf = NULL; |
|
400 break; |
|
401 } |
|
402 default: |
|
403 { |
|
404 ASSERT_RESET_ALWAYS( 0, EISIKernelChannelWrongRequest | EDISIKernelChannelId << KClassIdentifierShift ); |
|
405 break; |
|
406 } |
|
407 } |
|
408 EnqueChannelRequestCompleteDfc( aMask&aRequest, KErrCancel ); |
|
409 } |
|
410 else |
|
411 { |
|
412 C_TRACE( ( _T( "DISIKernelChannel::DoCancel nothing to cancel 0x%x" ), this ) ); |
|
413 } |
|
414 C_TRACE( ( _T( "DISIKernelChannel::DoCancel 0x%x 0x%x<" ), this, iObjId ) ); |
|
415 } |
|
416 |
|
417 TInt DISIKernelChannel::HandleSyncRequest( |
|
418 TThreadMessage& aMsg |
|
419 ) |
|
420 { |
|
421 C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest 0x%x 0x%x 0x%x>" ), this, &aMsg, iObjId ) ); |
|
422 TThreadMessage& m = ( aMsg ); |
|
423 TInt request( m.iValue ); |
|
424 ASSERT_RESET_ALWAYS( m.iArg, ( EISIKernelChannelNullParam4 | EDISIKernelChannelId << KClassIdentifierShift ) ); |
|
425 TInt returnValue( KErrNone ); |
|
426 C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest 0x%x handling %d" ), this, request ) ); |
|
427 TUint32* tablePtr = reinterpret_cast<TUint32*>( m.Ptr0() ); |
|
428 |
|
429 switch( request ) |
|
430 { |
|
431 case EISIConnect: |
|
432 { |
|
433 C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIConnect 0x%x" ), this ) ); |
|
434 iUID = tablePtr[ KFirstParam ]; |
|
435 TUint8* objIdPtr = reinterpret_cast<TUint8*>( tablePtr[ KSecondParam ] ); //TODO vasta tempobjid |
|
436 C_TRACE( ( _T( "DISIKernelChannel::HandleDfcRequest EISINokiaKernelOpen 0x%x" ), this ) ); |
|
437 iRouterIf->Connect( iUID, iObjId, this ); |
|
438 *objIdPtr = iObjId; |
|
439 C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIConnect 0x%x" ), this ) ); |
|
440 break; |
|
441 } |
|
442 case EISIDisconnect: |
|
443 { |
|
444 C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIDisconnect 0x%x" ), this ) ); |
|
445 Disconnect(); |
|
446 C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIDisconnect 0x%x" ), this ) ); |
|
447 returnValue = KErrNone; |
|
448 break; |
|
449 } |
|
450 case EISIAllocateBlock: |
|
451 { |
|
452 C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIAllocateBlock 0x%x" ), this ) ); |
|
453 const TInt size = *reinterpret_cast<TInt*>( tablePtr[ KFirstParam ] ); |
|
454 TDes8*& block = *(reinterpret_cast<TDes8**>( tablePtr[ KSecondParam ] )); |
|
455 C_TRACE( ( _T( "DISIKernelChannel:: EISIAllocateBlock 0x%x block 0x%x %d" ), this, block, size ) ); |
|
456 block = ( &MemApi::AllocBlock( size ) ); |
|
457 C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIAllocateBlock 0x%x" ), this ) ); |
|
458 break; |
|
459 } |
|
460 case EISIDeallocateBlock: |
|
461 { |
|
462 C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIDeallocateBlock 0x%x" ), this ) ); |
|
463 TDes8& block = *reinterpret_cast<TDes8*>( tablePtr[ KFirstParam ] ); |
|
464 C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIAllocateBlock 0x%x block 0x%x" ), this, &block ) ); |
|
465 // Needed to ensure that right channel is deleting the right block. (Could it be done otherways too?) |
|
466 if( iPtrPtrToRxBuf ) |
|
467 { |
|
468 if ( &block == *iPtrPtrToRxBuf ) |
|
469 { |
|
470 C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest release 0x%x 0x%x clientRx 0x%x"), iPtrPtrToRxBuf, &iPtrPtrToRxBuf, *iPtrPtrToRxBuf ) ); |
|
471 iPtrPtrToRxBuf = NULL; |
|
472 } |
|
473 } |
|
474 MemApi::DeallocBlock( block ); |
|
475 C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIDeallocateBlock 0x%x" ), this ) ); |
|
476 break; |
|
477 } |
|
478 case EISISend: |
|
479 { |
|
480 C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISISend 0x%x" ), this ) ); |
|
481 TDes8& block = *reinterpret_cast<TDes8*>( tablePtr[ KFirstParam ] ); |
|
482 C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISISend 0x%x block 0x%x" ), this, &block ) ); |
|
483 returnValue = iRouterIf->Send( block, iObjId ); |
|
484 C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISISend 0x%x" ), this ) ); |
|
485 break; |
|
486 } |
|
487 default: |
|
488 { |
|
489 ASSERT_RESET_ALWAYS( 0, ( EISIKernelChannelWrongRequest3 | EDISIKernelChannelId << KClassIdentifierShift ) ); |
|
490 break; |
|
491 } |
|
492 } |
|
493 C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest 0x%x 0x%x %d 0x%x<" ), this, &aMsg, returnValue, iObjId ) ); |
|
494 return returnValue; |
|
495 } |
|
496 |
|
497 void DISIKernelChannel::Disconnect( |
|
498 // None |
|
499 ) |
|
500 { |
|
501 C_TRACE( ( _T( "DISIKernelChannel::Disconnect 0x%x 0x%x>" ), this, iObjId ) ); |
|
502 ResetQueues(); |
|
503 for( TInt i( EISILastSyncRequest ); i < EISILastAsyncRequest; ++i ) |
|
504 { |
|
505 C_TRACE( ( _T( "DISIKernelChannel::CancelRequests req to cancel %d" ), i ) ); |
|
506 DoCancel( KMaxTInt, i ); |
|
507 } |
|
508 iRouterIf->Disconnect( iObjId ); |
|
509 iRouterIf->FreeDfcThread( iMainThread ); |
|
510 iRouterIf->FreeDfcThread( iCompletionThread ); |
|
511 C_TRACE( ( _T( "DISIKernelChannel::Disconnect 0x%x 0x%x<" ), this, iObjId ) ); |
|
512 } |
|
513 |
|
514 void DISIKernelChannel::ResetQueues( |
|
515 // None |
|
516 ) |
|
517 { |
|
518 C_TRACE( ( _T( "DISIKernelChannel::ResetQueues 0x%x 0x%x>" ), this, iObjId ) ); |
|
519 // TODO: assert router ext thread context |
|
520 if( iRx ) |
|
521 { |
|
522 C_TRACE( ( _T( "DISIKernelChannel::ResetQueues 0x%x iRx 0x%x" ), this, iRx ) ); |
|
523 while( iRx->Count() ) |
|
524 { |
|
525 MemApi::DeallocBlock( iRx->Get() ); |
|
526 } |
|
527 } |
|
528 C_TRACE( ( _T( "DISIKernelChannel::ResetQueues 0x%x 0x%x<" ), this, iObjId ) ); |
|
529 } |
|
530 |
539 |
531 // End of file. |
540 // End of file. |
532 |
541 |