tracesrv/tracecore/btrace_handler/test/d_tracecore/src/d_tracecore.cpp
author hgs
Fri, 08 Oct 2010 14:56:39 +0300
changeset 56 aa2539c91954
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
56
hgs
parents:
diff changeset
     1
// Copyright (c) 2005-2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     2
// All rights reserved.
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     7
//
hgs
parents:
diff changeset
     8
// Initial Contributors:
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    10
//
hgs
parents:
diff changeset
    11
// Contributors:
hgs
parents:
diff changeset
    12
//
hgs
parents:
diff changeset
    13
// Description:
hgs
parents:
diff changeset
    14
// e32test\debug\d_tracecore.cpp
hgs
parents:
diff changeset
    15
// 
hgs
parents:
diff changeset
    16
//
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include <kernel/kern_priv.h>
hgs
parents:
diff changeset
    19
#include <kernel/kernel.h>
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
#include <e32btrace.h>
hgs
parents:
diff changeset
    22
#include <opensystemtrace_types.h>
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
#ifndef __SMP__
hgs
parents:
diff changeset
    25
#include <nkern/nkern.h>
hgs
parents:
diff changeset
    26
#else
hgs
parents:
diff changeset
    27
#include <nkernsmp/nkern.h>
hgs
parents:
diff changeset
    28
#endif //__SMP__
hgs
parents:
diff changeset
    29
#include <TraceCoreTraceActivationIf.h>
hgs
parents:
diff changeset
    30
#include <TraceCoreNotificationReceiver.h>
hgs
parents:
diff changeset
    31
#include "TraceCore.h"
hgs
parents:
diff changeset
    32
#include "d_tracecore.h"
hgs
parents:
diff changeset
    33
hgs
parents:
diff changeset
    34
hgs
parents:
diff changeset
    35
#include "TraceCoreTestWriter.h"
hgs
parents:
diff changeset
    36
#include "TestDataWriterNotifier.h"
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
const TInt KFrameBufferLength = 4096;
hgs
parents:
diff changeset
    39
hgs
parents:
diff changeset
    40
class DTraceCoreTestFactory : public DLogicalDevice 
hgs
parents:
diff changeset
    41
	{
hgs
parents:
diff changeset
    42
public:
hgs
parents:
diff changeset
    43
	virtual TInt Install();
hgs
parents:
diff changeset
    44
	virtual void GetCaps(TDes8& aDes) const;
hgs
parents:
diff changeset
    45
	virtual TInt Create(DLogicalChannelBase*& aChannel);
hgs
parents:
diff changeset
    46
	};
hgs
parents:
diff changeset
    47
hgs
parents:
diff changeset
    48
class DTraceCoreTestChannel : public DLogicalChannel, MTestWriterNotifier, MTraceCoreNotificationReceiver
hgs
parents:
diff changeset
    49
	{
hgs
parents:
diff changeset
    50
public:
hgs
parents:
diff changeset
    51
	DTraceCoreTestChannel();
hgs
parents:
diff changeset
    52
	virtual ~DTraceCoreTestChannel();
hgs
parents:
diff changeset
    53
	//	Inherited from DObject
hgs
parents:
diff changeset
    54
	virtual TInt RequestUserHandle(DThread* aThread, TOwnerType aType);
hgs
parents:
diff changeset
    55
	// Inherited from DLogicalChannelBase
hgs
parents:
diff changeset
    56
	virtual TInt DoCreate(TInt aUnit, const TDesC8* anInfo, const TVersion& aVer);
hgs
parents:
diff changeset
    57
	virtual void HandleMsg(TMessageBase* aMsg);
hgs
parents:
diff changeset
    58
	TInt DoControl(TInt aFunction, TAny* a1, TAny* a2);
hgs
parents:
diff changeset
    59
	TInt DoRequest(TInt aId, TRequestStatus* aStatus, TAny* a1, TAny* a2);
hgs
parents:
diff changeset
    60
	
hgs
parents:
diff changeset
    61
    // Virtual from MTraceCoreNotificationReceiver. Called from TraceCore.
hgs
parents:
diff changeset
    62
    void TraceActivated( TUint32 aComponentId, TUint16 aGroupId  );
hgs
parents:
diff changeset
    63
    void TraceDeactivated( TUint32 aComponentId, TUint16 aGroupId  );
hgs
parents:
diff changeset
    64
	
hgs
parents:
diff changeset
    65
hgs
parents:
diff changeset
    66
private:
hgs
parents:
diff changeset
    67
	DThread* iClient;
hgs
parents:
diff changeset
    68
	
hgs
parents:
diff changeset
    69
private:
hgs
parents:
diff changeset
    70
	void ActivateTrace(TcDriverParameters& aDriverParameters, TInt aNumTraces);
hgs
parents:
diff changeset
    71
	void DeactivateTrace(TcDriverParameters& aDriverParameters, TInt aNumTraces);
hgs
parents:
diff changeset
    72
    TInt RefreshActivations();
hgs
parents:
diff changeset
    73
    TInt ValidateFilterSync(TcDriverParameters& aDriverParams);
hgs
parents:
diff changeset
    74
    void DropNextTrace(TBool aDrop);
hgs
parents:
diff changeset
    75
    void RegisterActivationNotification(TcDriverParameters& aDriverParameters, TBool aRegister);
hgs
parents:
diff changeset
    76
    TInt CheckActivationNotificationOk(TBool aShouldBeNotified);
hgs
parents:
diff changeset
    77
	
hgs
parents:
diff changeset
    78
	TInt CreateWriter();
hgs
parents:
diff changeset
    79
	// from MTestWriterNotifier
hgs
parents:
diff changeset
    80
    virtual void WriteComplete(TNotifyData aData);
hgs
parents:
diff changeset
    81
    virtual void WriteStart();
hgs
parents:
diff changeset
    82
private:
hgs
parents:
diff changeset
    83
  
hgs
parents:
diff changeset
    84
    TRequestStatus* iTraceDataRequestStatus;      // request status for asynct trace requests
hgs
parents:
diff changeset
    85
    TDes8*          iTraceDataDestination;        // pointer to write trace data to
hgs
parents:
diff changeset
    86
    TDynamicDfcQue* iOstTestDriverDfcQ;           // Dedicated non-realtime DfcQ
hgs
parents:
diff changeset
    87
    TBool           iDropTrace;                   // if test doesn't want trace to actually be sent
hgs
parents:
diff changeset
    88
    TInt                            iFrameCount;  // Number of frames to capture before notify is issued 
hgs
parents:
diff changeset
    89
    TBuf8<KFrameBufferLength>       iFrameBuffer; // the frame buffer
hgs
parents:
diff changeset
    90
    TBool           iFilterInSyncWhenNotified;    // If true, filter in TraceCore was in sync with the notification
hgs
parents:
diff changeset
    91
    TBool           iNotificationReceived;        // If true, trace activation notification was received
hgs
parents:
diff changeset
    92
	};
hgs
parents:
diff changeset
    93
hgs
parents:
diff changeset
    94
const TInt KTestOstDriverThreadPriority = 24;
hgs
parents:
diff changeset
    95
_LIT(KTestOstDriverThread,"d_tracecore_dfcq");
hgs
parents:
diff changeset
    96
hgs
parents:
diff changeset
    97
hgs
parents:
diff changeset
    98
//
hgs
parents:
diff changeset
    99
// DTraceCoreTestFactory
hgs
parents:
diff changeset
   100
//
hgs
parents:
diff changeset
   101
hgs
parents:
diff changeset
   102
TInt DTraceCoreTestFactory::Install()
hgs
parents:
diff changeset
   103
	{
hgs
parents:
diff changeset
   104
	return SetName(&RTraceCoreTest::Name());
hgs
parents:
diff changeset
   105
	}
hgs
parents:
diff changeset
   106
hgs
parents:
diff changeset
   107
void DTraceCoreTestFactory::GetCaps(TDes8& aDes) const
hgs
parents:
diff changeset
   108
	{
hgs
parents:
diff changeset
   109
	Kern::InfoCopy(aDes,0,0);
hgs
parents:
diff changeset
   110
	}
hgs
parents:
diff changeset
   111
hgs
parents:
diff changeset
   112
TInt DTraceCoreTestFactory::Create(DLogicalChannelBase*& aChannel)
hgs
parents:
diff changeset
   113
	{
hgs
parents:
diff changeset
   114
	aChannel=new DTraceCoreTestChannel();
hgs
parents:
diff changeset
   115
	if(!aChannel)
hgs
parents:
diff changeset
   116
		return KErrNoMemory;
hgs
parents:
diff changeset
   117
	return KErrNone;
hgs
parents:
diff changeset
   118
	}
hgs
parents:
diff changeset
   119
hgs
parents:
diff changeset
   120
hgs
parents:
diff changeset
   121
//
hgs
parents:
diff changeset
   122
// DTraceCoreTestChannel
hgs
parents:
diff changeset
   123
//
hgs
parents:
diff changeset
   124
hgs
parents:
diff changeset
   125
DTraceCoreTestChannel::DTraceCoreTestChannel()
hgs
parents:
diff changeset
   126
: iTraceDataRequestStatus(NULL)
hgs
parents:
diff changeset
   127
, iTraceDataDestination(NULL)
hgs
parents:
diff changeset
   128
, iDropTrace(EFalse)
hgs
parents:
diff changeset
   129
, iFilterInSyncWhenNotified(EFalse)
hgs
parents:
diff changeset
   130
    {
hgs
parents:
diff changeset
   131
	}
hgs
parents:
diff changeset
   132
hgs
parents:
diff changeset
   133
DTraceCoreTestChannel::~DTraceCoreTestChannel()
hgs
parents:
diff changeset
   134
	{	
hgs
parents:
diff changeset
   135
	// Detatch (stop notifications) from writer	     
hgs
parents:
diff changeset
   136
    DTraceCoreTestWriter* testWriter = DTraceCoreTestWriter::GetInstance();
hgs
parents:
diff changeset
   137
    if(testWriter)
hgs
parents:
diff changeset
   138
        {
hgs
parents:
diff changeset
   139
        testWriter->SetNotifier(NULL);        
hgs
parents:
diff changeset
   140
        }           
hgs
parents:
diff changeset
   141
    delete testWriter;
hgs
parents:
diff changeset
   142
    
hgs
parents:
diff changeset
   143
    //destroy dfcq
hgs
parents:
diff changeset
   144
    if (iOstTestDriverDfcQ)
hgs
parents:
diff changeset
   145
        {
hgs
parents:
diff changeset
   146
        iOstTestDriverDfcQ->Destroy();
hgs
parents:
diff changeset
   147
        }
hgs
parents:
diff changeset
   148
	}
hgs
parents:
diff changeset
   149
hgs
parents:
diff changeset
   150
TInt DTraceCoreTestChannel::DoCreate(TInt /*aUnit*/, const TDesC8* /*aInfo*/, const TVersion& /*aVer*/)
hgs
parents:
diff changeset
   151
	{
hgs
parents:
diff changeset
   152
    TDynamicDfcQue* q;
hgs
parents:
diff changeset
   153
    TInt ret = Kern::DynamicDfcQCreate(q, KTestOstDriverThreadPriority , KTestOstDriverThread);
hgs
parents:
diff changeset
   154
    if (ret==KErrNone)
hgs
parents:
diff changeset
   155
        {
hgs
parents:
diff changeset
   156
        //disable real-time state of the dfcq
hgs
parents:
diff changeset
   157
        q->SetRealtimeState(ERealtimeStateOff);
hgs
parents:
diff changeset
   158
        iOstTestDriverDfcQ=q;
hgs
parents:
diff changeset
   159
        SetDfcQ(iOstTestDriverDfcQ);
hgs
parents:
diff changeset
   160
        iMsgQ.Receive();
hgs
parents:
diff changeset
   161
        }
hgs
parents:
diff changeset
   162
    else
hgs
parents:
diff changeset
   163
        {
hgs
parents:
diff changeset
   164
        Kern::Printf("Kern::DynamicDfcQCreate returned with error: %d",ret);
hgs
parents:
diff changeset
   165
        return ret;
hgs
parents:
diff changeset
   166
        }
hgs
parents:
diff changeset
   167
	iClient = &Kern::CurrentThread();			
hgs
parents:
diff changeset
   168
	return CreateWriter();
hgs
parents:
diff changeset
   169
	}
hgs
parents:
diff changeset
   170
hgs
parents:
diff changeset
   171
void DTraceCoreTestChannel::WriteStart()
hgs
parents:
diff changeset
   172
    {
hgs
parents:
diff changeset
   173
    }
hgs
parents:
diff changeset
   174
hgs
parents:
diff changeset
   175
void DTraceCoreTestChannel::WriteComplete(TNotifyData aNotifyData) 
hgs
parents:
diff changeset
   176
    {
hgs
parents:
diff changeset
   177
hgs
parents:
diff changeset
   178
    if(iTraceDataRequestStatus && iFrameCount > 0 )
hgs
parents:
diff changeset
   179
        {    
hgs
parents:
diff changeset
   180
hgs
parents:
diff changeset
   181
        // append the data into the frame buffer if it fits
hgs
parents:
diff changeset
   182
        if( iFrameBuffer.Length() + aNotifyData.iLen < KFrameBufferLength)
hgs
parents:
diff changeset
   183
            {        
hgs
parents:
diff changeset
   184
            iFrameBuffer.Append(TPtrC8((TUint8*)aNotifyData.iAddr, aNotifyData.iLen ));
hgs
parents:
diff changeset
   185
            }
hgs
parents:
diff changeset
   186
        else
hgs
parents:
diff changeset
   187
            {
hgs
parents:
diff changeset
   188
            // force a send of what we have
hgs
parents:
diff changeset
   189
            iFrameCount = 1;
hgs
parents:
diff changeset
   190
            }
hgs
parents:
diff changeset
   191
                       
hgs
parents:
diff changeset
   192
        if( --iFrameCount == 0)
hgs
parents:
diff changeset
   193
            {    
hgs
parents:
diff changeset
   194
            if (iDropTrace)
hgs
parents:
diff changeset
   195
                {
hgs
parents:
diff changeset
   196
                // test client is requesting we force tracecore to drop the next trace
hgs
parents:
diff changeset
   197
                // so we call the same function that a writer would call ( SetPreviousTraceDropped )
hgs
parents:
diff changeset
   198
                // in order to notify tracecore that a trace has been dropped            
hgs
parents:
diff changeset
   199
                DTraceCore* tracecore = DTraceCore::GetInstance();
hgs
parents:
diff changeset
   200
                tracecore->SetPreviousTraceDropped(ETrue);
hgs
parents:
diff changeset
   201
                }
hgs
parents:
diff changeset
   202
            else//send the trace
hgs
parents:
diff changeset
   203
                {
hgs
parents:
diff changeset
   204
                Kern::KUDesPut(*iTraceDataDestination,iFrameBuffer);
hgs
parents:
diff changeset
   205
                }
hgs
parents:
diff changeset
   206
            
hgs
parents:
diff changeset
   207
            // complete the clients request
hgs
parents:
diff changeset
   208
            Kern::RequestComplete(iTraceDataRequestStatus, 0);
hgs
parents:
diff changeset
   209
            iTraceDataRequestStatus = NULL;
hgs
parents:
diff changeset
   210
            iFrameBuffer.Zero();            
hgs
parents:
diff changeset
   211
            }
hgs
parents:
diff changeset
   212
        }    
hgs
parents:
diff changeset
   213
    }
hgs
parents:
diff changeset
   214
hgs
parents:
diff changeset
   215
TInt DTraceCoreTestChannel::CreateWriter()
hgs
parents:
diff changeset
   216
    {
hgs
parents:
diff changeset
   217
    TInt r = KErrNoMemory;
hgs
parents:
diff changeset
   218
    DTraceCoreTestWriter* testWriter = DTraceCoreTestWriter::GetInstance(); 
hgs
parents:
diff changeset
   219
    if(testWriter)
hgs
parents:
diff changeset
   220
        {
hgs
parents:
diff changeset
   221
        r = KErrNone;
hgs
parents:
diff changeset
   222
        testWriter->SetNotifier(this);
hgs
parents:
diff changeset
   223
        }       
hgs
parents:
diff changeset
   224
    return r;
hgs
parents:
diff changeset
   225
    }
hgs
parents:
diff changeset
   226
hgs
parents:
diff changeset
   227
TInt DTraceCoreTestChannel::RequestUserHandle(DThread* aThread, TOwnerType aType)
hgs
parents:
diff changeset
   228
	{
hgs
parents:
diff changeset
   229
	if (aType!=EOwnerThread || aThread!=iClient)
hgs
parents:
diff changeset
   230
		return KErrAccessDenied;
hgs
parents:
diff changeset
   231
	return KErrNone;
hgs
parents:
diff changeset
   232
	}
hgs
parents:
diff changeset
   233
hgs
parents:
diff changeset
   234
void DTraceCoreTestChannel::HandleMsg(TMessageBase* aMsg)
hgs
parents:
diff changeset
   235
	{    
hgs
parents:
diff changeset
   236
    TThreadMessage& msg = *(static_cast<TThreadMessage*>(aMsg));    
hgs
parents:
diff changeset
   237
    TInt id = msg.iValue;
hgs
parents:
diff changeset
   238
    
hgs
parents:
diff changeset
   239
    if ( id == static_cast<TInt>( ECloseMsg ) )
hgs
parents:
diff changeset
   240
        {
hgs
parents:
diff changeset
   241
hgs
parents:
diff changeset
   242
        // Don't receive any more messages
hgs
parents:
diff changeset
   243
        msg.Complete( KErrNone, EFalse );
hgs
parents:
diff changeset
   244
hgs
parents:
diff changeset
   245
        // Complete all outstanding messages on this queue
hgs
parents:
diff changeset
   246
        iMsgQ.CompleteAll( KErrServerTerminated );
hgs
parents:
diff changeset
   247
        }
hgs
parents:
diff changeset
   248
    else if ( id == KMaxTInt )
hgs
parents:
diff changeset
   249
        {
hgs
parents:
diff changeset
   250
        // 'DoCancel' message
hgs
parents:
diff changeset
   251
        TRequestStatus* pS = reinterpret_cast<TRequestStatus*>( msg.Ptr0() );
hgs
parents:
diff changeset
   252
        Kern::RequestComplete(iClient,pS,KErrCancel);
hgs
parents:
diff changeset
   253
        msg.Complete( KErrNone, ETrue );
hgs
parents:
diff changeset
   254
        }
hgs
parents:
diff changeset
   255
    else if ( id < 0 )
hgs
parents:
diff changeset
   256
        {
hgs
parents:
diff changeset
   257
        // DoRequest
hgs
parents:
diff changeset
   258
        TRequestStatus* pS = reinterpret_cast<TRequestStatus*>( msg.Ptr0() );
hgs
parents:
diff changeset
   259
        
hgs
parents:
diff changeset
   260
        TInt ret = DoRequest( ~id, pS, msg.Ptr1(), msg.Ptr2());
hgs
parents:
diff changeset
   261
        if ( ret != KErrNone )
hgs
parents:
diff changeset
   262
            {
hgs
parents:
diff changeset
   263
            Kern::RequestComplete( iClient, pS, ret );
hgs
parents:
diff changeset
   264
            }//noelse
hgs
parents:
diff changeset
   265
        
hgs
parents:
diff changeset
   266
        msg.Complete( KErrNone, ETrue );
hgs
parents:
diff changeset
   267
        }
hgs
parents:
diff changeset
   268
    else
hgs
parents:
diff changeset
   269
        {
hgs
parents:
diff changeset
   270
        // DoControl
hgs
parents:
diff changeset
   271
        TInt ret = DoControl( id, msg.Ptr0(), msg.Ptr1() );
hgs
parents:
diff changeset
   272
        msg.Complete( ret, ETrue );
hgs
parents:
diff changeset
   273
        }
hgs
parents:
diff changeset
   274
hgs
parents:
diff changeset
   275
	}
hgs
parents:
diff changeset
   276
hgs
parents:
diff changeset
   277
TInt DTraceCoreTestChannel::DoControl(TInt aFunction, TAny* a1, TAny* a2)
hgs
parents:
diff changeset
   278
    {
hgs
parents:
diff changeset
   279
    switch(aFunction)
hgs
parents:
diff changeset
   280
          {
hgs
parents:
diff changeset
   281
    // test functions
hgs
parents:
diff changeset
   282
          case RTraceCoreTest::EActivateTrace:
hgs
parents:
diff changeset
   283
              {
hgs
parents:
diff changeset
   284
//            Kern::Printf("DTraceCoreTestChannel::DoControl() RTraceCoreTest::EActivateTrace");
hgs
parents:
diff changeset
   285
              TcDriverParameters* tcDriverParameters = static_cast<TcDriverParameters*>(a1); 
hgs
parents:
diff changeset
   286
              __ASSERT_ALWAYS(tcDriverParameters!=NULL, Kern::Fault("DTraceCoreTestChannel::DoControl: NULL parameter!", __LINE__) );
hgs
parents:
diff changeset
   287
              ActivateTrace(*tcDriverParameters, (TInt)(a2));
hgs
parents:
diff changeset
   288
              return KErrNone;
hgs
parents:
diff changeset
   289
              }
hgs
parents:
diff changeset
   290
         case RTraceCoreTest::EDeactivateTrace:
hgs
parents:
diff changeset
   291
              {
hgs
parents:
diff changeset
   292
//            Kern::Printf("DTraceCoreTestChannel::DoControl()  RTraceCoreTest::EDeactivateTrace");
hgs
parents:
diff changeset
   293
              TcDriverParameters* tcDriverParameters = static_cast<TcDriverParameters*>(a1); 
hgs
parents:
diff changeset
   294
              __ASSERT_ALWAYS(tcDriverParameters!=NULL, Kern::Fault("DTraceCoreTestChannel::DoControl: NULL parameter!", __LINE__) );              
hgs
parents:
diff changeset
   295
              DeactivateTrace(*tcDriverParameters, (TInt)(a2));
hgs
parents:
diff changeset
   296
              return KErrNone;
hgs
parents:
diff changeset
   297
              }
hgs
parents:
diff changeset
   298
         case RTraceCoreTest::ERefreshActivations:
hgs
parents:
diff changeset
   299
             {
hgs
parents:
diff changeset
   300
//            Kern::Printf("DTraceCoreTestChannel::DoControl() RTraceCoreTest::ERefreshActivations");
hgs
parents:
diff changeset
   301
             return RefreshActivations();
hgs
parents:
diff changeset
   302
             }
hgs
parents:
diff changeset
   303
              
hgs
parents:
diff changeset
   304
         case RTraceCoreTest::EValidateFilterSync:
hgs
parents:
diff changeset
   305
             {
hgs
parents:
diff changeset
   306
//           Kern::Printf("DTraceCoreTestChannel::ReqDoControluest()  RTraceCoreTest::EValidateFilterSync");
hgs
parents:
diff changeset
   307
             TcDriverParameters* tcDriverParameters = static_cast<TcDriverParameters*>(a1); 
hgs
parents:
diff changeset
   308
             __ASSERT_ALWAYS(tcDriverParameters!=NULL, Kern::Fault("DTraceCoreTestChannel::DoControl: NULL parameter!", __LINE__) );             
hgs
parents:
diff changeset
   309
             return ValidateFilterSync(*tcDriverParameters);
hgs
parents:
diff changeset
   310
             }
hgs
parents:
diff changeset
   311
             
hgs
parents:
diff changeset
   312
         case RTraceCoreTest::EDropNextTrace:
hgs
parents:
diff changeset
   313
             {
hgs
parents:
diff changeset
   314
//           Kern::Printf("DTraceCoreTestChannel::DoControl()  RTraceCoreTest::EDropNextTrace");        
hgs
parents:
diff changeset
   315
             DropNextTrace(TBool(a1));
hgs
parents:
diff changeset
   316
             return KErrNone;
hgs
parents:
diff changeset
   317
             }
hgs
parents:
diff changeset
   318
         case RTraceCoreTest::ERegisterActivationNotification:
hgs
parents:
diff changeset
   319
             {
hgs
parents:
diff changeset
   320
//           Kern::Printf("DTraceCoreTestChannel::DoControl()  RTraceCoreTest::ERegisterActivationNotification");
hgs
parents:
diff changeset
   321
             TcDriverParameters* tcDriverParameters = static_cast<TcDriverParameters*>(a1); 
hgs
parents:
diff changeset
   322
             __ASSERT_ALWAYS(tcDriverParameters!=NULL, Kern::Fault("DTraceCoreTestChannel::DoControl: NULL parameter!", __LINE__) );
hgs
parents:
diff changeset
   323
             RegisterActivationNotification(*tcDriverParameters, (TBool)(a2));
hgs
parents:
diff changeset
   324
             return KErrNone;
hgs
parents:
diff changeset
   325
             }       
hgs
parents:
diff changeset
   326
         case RTraceCoreTest::ECheckActivationNotificationOk:
hgs
parents:
diff changeset
   327
             {
hgs
parents:
diff changeset
   328
//             Kern::Printf("DTraceCoreTestChannel::DoControl()  RTraceCoreTest::ECheckActivationNotificationOk");        
hgs
parents:
diff changeset
   329
             return CheckActivationNotificationOk((TBool)(a1));
hgs
parents:
diff changeset
   330
             }                  
hgs
parents:
diff changeset
   331
            
hgs
parents:
diff changeset
   332
         default:
hgs
parents:
diff changeset
   333
             break;
hgs
parents:
diff changeset
   334
              }
hgs
parents:
diff changeset
   335
    return KErrNotSupported;
hgs
parents:
diff changeset
   336
    }
hgs
parents:
diff changeset
   337
hgs
parents:
diff changeset
   338
TInt DTraceCoreTestChannel::DoRequest(TInt aId, TRequestStatus* aStatus, TAny* a1, TAny* a2)
hgs
parents:
diff changeset
   339
    {
hgs
parents:
diff changeset
   340
    switch(aId)
hgs
parents:
diff changeset
   341
        {
hgs
parents:
diff changeset
   342
        case RTraceCoreTest::ERequestTraceData:  // async request
hgs
parents:
diff changeset
   343
            {                     
hgs
parents:
diff changeset
   344
            iTraceDataRequestStatus   = aStatus;           
hgs
parents:
diff changeset
   345
            if(a1)
hgs
parents:
diff changeset
   346
                {
hgs
parents:
diff changeset
   347
                TDes8* p = NULL;
hgs
parents:
diff changeset
   348
                XTRAPD(r, XT_DEFAULT, kumemget(&p, &a1, sizeof(TAny*)); )                
hgs
parents:
diff changeset
   349
                iTraceDataDestination = (r == KErrNone) ? p : NULL;                
hgs
parents:
diff changeset
   350
                }
hgs
parents:
diff changeset
   351
            
hgs
parents:
diff changeset
   352
            iFrameCount = (a2) ? (TInt)a2 : 1;
hgs
parents:
diff changeset
   353
            iFrameBuffer.Zero();
hgs
parents:
diff changeset
   354
            
hgs
parents:
diff changeset
   355
            return KErrNone;
hgs
parents:
diff changeset
   356
                }
hgs
parents:
diff changeset
   357
          
hgs
parents:
diff changeset
   358
         default:
hgs
parents:
diff changeset
   359
            break;
hgs
parents:
diff changeset
   360
        }
hgs
parents:
diff changeset
   361
    return KErrNotSupported;
hgs
parents:
diff changeset
   362
    }
hgs
parents:
diff changeset
   363
hgs
parents:
diff changeset
   364
void DTraceCoreTestChannel::ActivateTrace(TcDriverParameters& aDriverParameters, TInt aNumTraces)
hgs
parents:
diff changeset
   365
    {
hgs
parents:
diff changeset
   366
    TcDriverParameters tcDriverParams;
hgs
parents:
diff changeset
   367
    TInt ret = Kern::ThreadRawRead(iClient, (const TAny *)&aDriverParameters,(TAny*)&tcDriverParams, sizeof(TcDriverParameters) );
hgs
parents:
diff changeset
   368
    __ASSERT_ALWAYS(KErrDied!=ret, Kern::Fault("DTraceCoreTestChannel::ActivateTrace: ThreadRawRead: iClient died!", __LINE__) );    
hgs
parents:
diff changeset
   369
    
hgs
parents:
diff changeset
   370
    NKern::ThreadEnterCS();
hgs
parents:
diff changeset
   371
    for (TInt i=0; i<aNumTraces; i++)
hgs
parents:
diff changeset
   372
        {
hgs
parents:
diff changeset
   373
        DTraceActivationIf::ActivateTrace((tcDriverParams.iComponentId)+i,(tcDriverParams.iGroupId)+i);
hgs
parents:
diff changeset
   374
        }
hgs
parents:
diff changeset
   375
    NKern::ThreadLeaveCS();    
hgs
parents:
diff changeset
   376
    }
hgs
parents:
diff changeset
   377
hgs
parents:
diff changeset
   378
void DTraceCoreTestChannel::DeactivateTrace(TcDriverParameters& aDriverParameters, TInt aNumTraces)
hgs
parents:
diff changeset
   379
    {    
hgs
parents:
diff changeset
   380
    TcDriverParameters tcDriverParams;    
hgs
parents:
diff changeset
   381
    TInt ret = Kern::ThreadRawRead(iClient, (const TAny *)&aDriverParameters,(TAny*)&tcDriverParams, sizeof(TcDriverParameters) );
hgs
parents:
diff changeset
   382
    __ASSERT_ALWAYS(KErrDied!=ret,Kern::Fault("DTraceCoreTestChannel::DeactivateTrace: ThreadRawRead: iClient died!", __LINE__) );
hgs
parents:
diff changeset
   383
hgs
parents:
diff changeset
   384
    NKern::ThreadEnterCS();    
hgs
parents:
diff changeset
   385
    for (TInt i=0; i<aNumTraces; i++)
hgs
parents:
diff changeset
   386
        {
hgs
parents:
diff changeset
   387
        DTraceActivationIf::DeactivateTrace((tcDriverParams.iComponentId)+i,(tcDriverParams.iGroupId)+i);
hgs
parents:
diff changeset
   388
        }
hgs
parents:
diff changeset
   389
    NKern::ThreadLeaveCS();    
hgs
parents:
diff changeset
   390
    }
hgs
parents:
diff changeset
   391
hgs
parents:
diff changeset
   392
TInt DTraceCoreTestChannel::RefreshActivations()
hgs
parents:
diff changeset
   393
    {
hgs
parents:
diff changeset
   394
    NKern::ThreadEnterCS();
hgs
parents:
diff changeset
   395
    TInt err = DTraceActivationIf::RefreshActivations();
hgs
parents:
diff changeset
   396
    NKern::ThreadLeaveCS();
hgs
parents:
diff changeset
   397
    return err;
hgs
parents:
diff changeset
   398
    }
hgs
parents:
diff changeset
   399
hgs
parents:
diff changeset
   400
/**
hgs
parents:
diff changeset
   401
 * Validate that the BTrace::Filter matches the tracecore filters 
hgs
parents:
diff changeset
   402
 * for all OST categories
hgs
parents:
diff changeset
   403
 * 
hgs
parents:
diff changeset
   404
 * returns KErrNone if filters match - KErrGeneral otherwise
hgs
parents:
diff changeset
   405
 */
hgs
parents:
diff changeset
   406
TInt  DTraceCoreTestChannel::ValidateFilterSync(TcDriverParameters& aDriverParameters)
hgs
parents:
diff changeset
   407
    {
hgs
parents:
diff changeset
   408
    TcDriverParameters tcDriverParams;
hgs
parents:
diff changeset
   409
    TInt ret = Kern::ThreadRawRead(iClient, (const TAny *)&aDriverParameters,(TAny*)&tcDriverParams, sizeof(TcDriverParameters) );
hgs
parents:
diff changeset
   410
    __ASSERT_ALWAYS(ret == KErrNone, Kern::Fault("DTraceCoreTestChannel::ValidateFilterSync: ThreadRawRead: iClient died!", __LINE__) );    
hgs
parents:
diff changeset
   411
    
hgs
parents:
diff changeset
   412
    TBool tcFilter = DTraceActivationIf::IsTraceActivated(tcDriverParams.iComponentId, tcDriverParams.iGroupId);
hgs
parents:
diff changeset
   413
    TBool btFilter = BTrace::CheckFilter(tcDriverParams.iGroupId);                    
hgs
parents:
diff changeset
   414
    if( tcFilter != btFilter)
hgs
parents:
diff changeset
   415
        {
hgs
parents:
diff changeset
   416
        ret = KErrGeneral;
hgs
parents:
diff changeset
   417
        }            
hgs
parents:
diff changeset
   418
hgs
parents:
diff changeset
   419
    return ret;
hgs
parents:
diff changeset
   420
    }
hgs
parents:
diff changeset
   421
hgs
parents:
diff changeset
   422
/**
hgs
parents:
diff changeset
   423
 * Adds or removes a activation notification listener
hgs
parents:
diff changeset
   424
 * 
hgs
parents:
diff changeset
   425
 * returns KErrNone if filters match - KErrGeneral otherwise
hgs
parents:
diff changeset
   426
 */
hgs
parents:
diff changeset
   427
void DTraceCoreTestChannel::RegisterActivationNotification(TcDriverParameters& aDriverParameters, TBool aRegister)
hgs
parents:
diff changeset
   428
    {
hgs
parents:
diff changeset
   429
    TcDriverParameters tcDriverParams;
hgs
parents:
diff changeset
   430
    TInt ret = Kern::ThreadRawRead(iClient, (const TAny *)&aDriverParameters,(TAny*)&tcDriverParams, sizeof(TcDriverParameters) );
hgs
parents:
diff changeset
   431
    __ASSERT_ALWAYS(ret == KErrNone, Kern::Fault("DTraceCoreTestChannel::ValidateFilterSync: ThreadRawRead: iClient died!", __LINE__) );
hgs
parents:
diff changeset
   432
        
hgs
parents:
diff changeset
   433
    if (aRegister)
hgs
parents:
diff changeset
   434
        {
hgs
parents:
diff changeset
   435
        MTraceCoreNotificationReceiver::RegisterNotificationReceiver(tcDriverParams.iComponentId, tcDriverParams.iGroupId);
hgs
parents:
diff changeset
   436
        }
hgs
parents:
diff changeset
   437
    else
hgs
parents:
diff changeset
   438
        {
hgs
parents:
diff changeset
   439
        MTraceCoreNotificationReceiver::UnregisterNotificationReceiver(tcDriverParams.iComponentId, tcDriverParams.iGroupId);
hgs
parents:
diff changeset
   440
        }
hgs
parents:
diff changeset
   441
    }
hgs
parents:
diff changeset
   442
hgs
parents:
diff changeset
   443
/**
hgs
parents:
diff changeset
   444
 * Add a activation notification listener, then activate a trace group and check if the activation  
hgs
parents:
diff changeset
   445
 * has really happened when the notification arrives
hgs
parents:
diff changeset
   446
 * 
hgs
parents:
diff changeset
   447
 * returns KErrNone if filters match - KErrGeneral otherwise
hgs
parents:
diff changeset
   448
 */
hgs
parents:
diff changeset
   449
TInt DTraceCoreTestChannel::CheckActivationNotificationOk(TBool aShouldBeNotified)
hgs
parents:
diff changeset
   450
    {
hgs
parents:
diff changeset
   451
    TInt ret = KErrGeneral;
hgs
parents:
diff changeset
   452
    
hgs
parents:
diff changeset
   453
    // Everything OK if we should've got notification and we got and filters were in sync
hgs
parents:
diff changeset
   454
    if (aShouldBeNotified && iNotificationReceived && iFilterInSyncWhenNotified)
hgs
parents:
diff changeset
   455
        {
hgs
parents:
diff changeset
   456
        ret = KErrNone;
hgs
parents:
diff changeset
   457
        }
hgs
parents:
diff changeset
   458
    
hgs
parents:
diff changeset
   459
    // Everything OK if we should NOT got notification and we didn't
hgs
parents:
diff changeset
   460
    else if (!aShouldBeNotified && !iNotificationReceived)
hgs
parents:
diff changeset
   461
        {
hgs
parents:
diff changeset
   462
        ret = KErrNone;
hgs
parents:
diff changeset
   463
        }
hgs
parents:
diff changeset
   464
    
hgs
parents:
diff changeset
   465
    // Reset the variables for next test
hgs
parents:
diff changeset
   466
    iFilterInSyncWhenNotified = EFalse;
hgs
parents:
diff changeset
   467
    iNotificationReceived = EFalse;
hgs
parents:
diff changeset
   468
    
hgs
parents:
diff changeset
   469
    return ret;
hgs
parents:
diff changeset
   470
    }
hgs
parents:
diff changeset
   471
hgs
parents:
diff changeset
   472
/**
hgs
parents:
diff changeset
   473
 * Callback function from TraceCore when the trace is activated
hgs
parents:
diff changeset
   474
 */
hgs
parents:
diff changeset
   475
void DTraceCoreTestChannel::TraceActivated( TUint32 aComponentId, TUint16 aGroupId  )
hgs
parents:
diff changeset
   476
    {
hgs
parents:
diff changeset
   477
    TBool tcFilter = DTraceActivationIf::IsTraceActivated(aComponentId, aGroupId);
hgs
parents:
diff changeset
   478
    iFilterInSyncWhenNotified = tcFilter;
hgs
parents:
diff changeset
   479
    iNotificationReceived = ETrue;
hgs
parents:
diff changeset
   480
    }
hgs
parents:
diff changeset
   481
hgs
parents:
diff changeset
   482
/**
hgs
parents:
diff changeset
   483
 * Callback function from TraceCore when the trace is deactivated
hgs
parents:
diff changeset
   484
 */
hgs
parents:
diff changeset
   485
void DTraceCoreTestChannel::TraceDeactivated( TUint32 aComponentId, TUint16 aGroupId  )
hgs
parents:
diff changeset
   486
    {
hgs
parents:
diff changeset
   487
    TBool tcFilter = DTraceActivationIf::IsTraceActivated(aComponentId, aGroupId);
hgs
parents:
diff changeset
   488
    iFilterInSyncWhenNotified = !tcFilter;
hgs
parents:
diff changeset
   489
    iNotificationReceived = ETrue;
hgs
parents:
diff changeset
   490
    }
hgs
parents:
diff changeset
   491
hgs
parents:
diff changeset
   492
/*
hgs
parents:
diff changeset
   493
 * Tells the test writer that we don't actually want to 
hgs
parents:
diff changeset
   494
 * send a trace... this is to test that the handlers
hgs
parents:
diff changeset
   495
 * are formatting the data to include "missing" info.
hgs
parents:
diff changeset
   496
 */
hgs
parents:
diff changeset
   497
void DTraceCoreTestChannel::DropNextTrace(TBool aDrop)
hgs
parents:
diff changeset
   498
    {
hgs
parents:
diff changeset
   499
    iDropTrace=aDrop;
hgs
parents:
diff changeset
   500
    }
hgs
parents:
diff changeset
   501
hgs
parents:
diff changeset
   502
DECLARE_STANDARD_LDD()
hgs
parents:
diff changeset
   503
	{
hgs
parents:
diff changeset
   504
	Kern::Printf("d_tracecore.ldd creating DTraceCoreTestFactory");
hgs
parents:
diff changeset
   505
	return new DTraceCoreTestFactory;
hgs
parents:
diff changeset
   506
	}
hgs
parents:
diff changeset
   507
hgs
parents:
diff changeset
   508