memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanContainerBase.cpp
branchRCL_3
changeset 21 52e343bb8f80
parent 20 ca8a1b6995f6
equal deleted inserted replaced
20:ca8a1b6995f6 21:52e343bb8f80
    47 
    47 
    48 
    48 
    49 
    49 
    50 
    50 
    51 
    51 
    52 DObject* DMemSpyDriverLogChanContainerBase::CheckedOpen(TMemSpyDriverContainerType aContainerType, DObject* aObject, TBool aQuick)
    52 
    53 	{
    53 
    54 	__ASSERT_CRITICAL;
    54 
    55 	__ASSERT_DEBUG(aObject != NULL, MemSpyDriverUtils::Fault( __LINE__ ));
    55 DObject* DMemSpyDriverLogChanContainerBase::CheckIfObjectIsInContainer( TMemSpyDriverContainerType aContainerType, DObject* aSearchFor, TBool aQuick )
    56     const TObjectType expectedType = ObjectTypeFromMemSpyContainerType(aContainerType);
    56     {
    57 
    57 	__ASSERT_DEBUG( aSearchFor != NULL, MemSpyDriverUtils::Fault( __LINE__ ) );
    58     // Quick mode means we just check container ids and we trust that the object will exist.
    58     const TObjectType expectedType = ObjectTypeFromMemSpyContainerType( aContainerType );
    59 	// [TomS: not entirely convinced we can ever be certain of that]
    59     TRACE( Kern::Printf("DMemSpyDriverLogChanContainerBase::CheckIfObjectIsInContainer - START - aSearchFor: 0x%08x, expectedType: %d", aSearchFor, expectedType ));
    60     TInt err = KErrNotFound;
    60 
    61     if (aQuick)
    61     DObject* ret = NULL;
    62         {
    62     
    63 		LOG("quick CheckedOpen of %08x", aObject);
    63     // Quick mode means we just check container ids and we trust that the object
    64         const TObjectType objectType = OSAdaption().DThread().GetObjectType(*aObject);
    64     // will exist.
    65         if (objectType == expectedType)
    65     if ( aQuick )
    66             {
    66         {
    67             err = aObject->Open();
    67         const TObjectType objectType = OSAdaption().DThread().GetObjectType( *aSearchFor );
    68             }
    68         TRACE( Kern::Printf("DMemSpyDriverLogChanContainerBase::CheckIfObjectIsInContainer - aSearchFor.iContainerID: %d", objectType ) );
    69         }
    69         if  ( objectType == expectedType )
    70 	else
    70             {
    71 		{
    71             ret = aSearchFor;
    72         DObjectCon* container = Kern::Containers()[expectedType];
    72             }
       
    73         }
       
    74     else
       
    75         {
       
    76         // Full check to see if the specified object is part of the container
       
    77         DObjectCon* container = Kern::Containers()[ expectedType ];
    73         container->Wait();
    78         container->Wait();
       
    79         NKern::LockSystem();
       
    80 
    74         const TInt count = container->Count();
    81         const TInt count = container->Count();
    75         for (TInt i = 0; i < count; i++)
    82         for(TInt i=0; i<count; i++)
    76             {
    83             {
    77             DObject* object = (*container)[i];
    84             DObject* object = (*container)[ i ];
    78             if (object == aObject)
    85 
       
    86             // Do the two match?
       
    87             if  ( object == aSearchFor )
    79                 {
    88                 {
    80                 err = aObject->Open();
    89                 TRACE( Kern::Printf("    found match: %O", object));
    81 				break;
    90 
    82 				}
    91                 ret = object;
    83 			}
    92                 break;
    84 		container->Signal();
    93                 }
    85 		}
    94             }
    86 
    95 
    87 	LOG("CheckedOpen(%d, 0x%08x, quick=%d) returned error %d", aContainerType, aObject, aQuick, err);
    96         NKern::UnlockSystem();
    88 	return (err == KErrNone) ? aObject : NULL;
    97         container->Signal();
    89 	}
    98         }
       
    99 
       
   100     TRACE( Kern::Printf("DMemSpyDriverLogChanContainerBase::CheckIfObjectIsInContainer - END - ret: 0x%08x", ret ));
       
   101     TRACE( Kern::Printf(" ") );
       
   102     return ret;
       
   103     }
    90 
   104 
    91 
   105 
    92 
   106 
    93 TObjectType DMemSpyDriverLogChanContainerBase::ObjectTypeFromMemSpyContainerType( TMemSpyDriverContainerType aType )
   107 TObjectType DMemSpyDriverLogChanContainerBase::ObjectTypeFromMemSpyContainerType( TMemSpyDriverContainerType aType )
    94     {
   108     {