tracesrv/tracecore/btrace_handler/src/TraceCoreRouter.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) 2007-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
// Trace Core
hgs
parents:
diff changeset
    15
// 
hgs
parents:
diff changeset
    16
#include <kern_priv.h>
hgs
parents:
diff changeset
    17
#include "TraceCoreRouter.h"
hgs
parents:
diff changeset
    18
#include "TraceCoreSubscriber.h"
hgs
parents:
diff changeset
    19
#include "TraceCoreDebug.h"
hgs
parents:
diff changeset
    20
#include "OstTraceDefinitions.h"
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
#ifdef OST_TRACE_COMPILER_IN_USE
hgs
parents:
diff changeset
    23
#include "TraceCoreRouterTraces.h"
hgs
parents:
diff changeset
    24
#endif
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
// Constants
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
/** 
hgs
parents:
diff changeset
    29
 * Constructor
hgs
parents:
diff changeset
    30
 */
hgs
parents:
diff changeset
    31
DTraceCoreRouter::DTraceCoreRouter()
hgs
parents:
diff changeset
    32
: iMessageSender( NULL )
hgs
parents:
diff changeset
    33
    {
hgs
parents:
diff changeset
    34
    }
hgs
parents:
diff changeset
    35
hgs
parents:
diff changeset
    36
hgs
parents:
diff changeset
    37
/** 
hgs
parents:
diff changeset
    38
 * Destructor
hgs
parents:
diff changeset
    39
 */
hgs
parents:
diff changeset
    40
DTraceCoreRouter::~DTraceCoreRouter()
hgs
parents:
diff changeset
    41
    {
hgs
parents:
diff changeset
    42
    Kern::MutexWait(*iLock);
hgs
parents:
diff changeset
    43
    iRoutingItems.Reset();
hgs
parents:
diff changeset
    44
    Kern::MutexSignal(*iLock);
hgs
parents:
diff changeset
    45
    iLock->Close(NULL);
hgs
parents:
diff changeset
    46
    }
hgs
parents:
diff changeset
    47
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
/**
hgs
parents:
diff changeset
    50
 * Initializes this router
hgs
parents:
diff changeset
    51
 *
hgs
parents:
diff changeset
    52
 * @param aMessageSender The message sender interface
hgs
parents:
diff changeset
    53
 */
hgs
parents:
diff changeset
    54
TInt DTraceCoreRouter::Init( MTraceCoreMessageSender& aMessageSender )
hgs
parents:
diff changeset
    55
    {
hgs
parents:
diff changeset
    56
    iMessageSender = &aMessageSender;
hgs
parents:
diff changeset
    57
    _LIT(KTraceCoreRouterLock, "DTraceCoreRouter_Lock");
hgs
parents:
diff changeset
    58
    TInt err = Kern::MutexCreate(iLock, KTraceCoreRouterLock, KMutexOrdGeneral0);
hgs
parents:
diff changeset
    59
    return err;
hgs
parents:
diff changeset
    60
    }
hgs
parents:
diff changeset
    61
hgs
parents:
diff changeset
    62
hgs
parents:
diff changeset
    63
/**
hgs
parents:
diff changeset
    64
 * Callback for incoming messages
hgs
parents:
diff changeset
    65
 *
hgs
parents:
diff changeset
    66
 * @param aMsg The message
hgs
parents:
diff changeset
    67
 * @return KErrNotFound if the message id was not found (not subscribed), KErrNone if found
hgs
parents:
diff changeset
    68
 */
hgs
parents:
diff changeset
    69
TInt DTraceCoreRouter::MessageReceived( TTraceMessage &aMsg )
hgs
parents:
diff changeset
    70
    {
hgs
parents:
diff changeset
    71
    OstTraceExt1( TRACE_FLOW, DTRACECOREROUTER_MESSAGERECEIVED_ENTRY, "> DTraceCoreRouter::MessageReceived. MsgId:0x%hhx", aMsg.iMessageId );
hgs
parents:
diff changeset
    72
   
hgs
parents:
diff changeset
    73
    TInt ret( KErrNotFound );
hgs
parents:
diff changeset
    74
    TUint32 messageId = aMsg.iMessageId;
hgs
parents:
diff changeset
    75
    TUint32 msgFormat = aMsg.iMsgFormat;
hgs
parents:
diff changeset
    76
    
hgs
parents:
diff changeset
    77
    Kern::MutexWait(*iLock);
hgs
parents:
diff changeset
    78
    for ( TInt i = 0; i < iRoutingItems.Count(); i++ )
hgs
parents:
diff changeset
    79
        {
hgs
parents:
diff changeset
    80
        if ( iRoutingItems[ i ].iMessageID == messageId && iRoutingItems[ i ].iMsgFormat == msgFormat )
hgs
parents:
diff changeset
    81
            {
hgs
parents:
diff changeset
    82
            iRoutingItems[ i ].iSubscriber->MessageReceived( aMsg );
hgs
parents:
diff changeset
    83
            ret = KErrNone;
hgs
parents:
diff changeset
    84
            }
hgs
parents:
diff changeset
    85
        }
hgs
parents:
diff changeset
    86
    Kern::MutexSignal(*iLock);
hgs
parents:
diff changeset
    87
        
hgs
parents:
diff changeset
    88
	OstTrace1( TRACE_FLOW, DTRACECOREROUTER_MESSAGERECEIVED_EXIT, "< DTraceCoreRouter::MessageReceived. Ret:%d", ret );
hgs
parents:
diff changeset
    89
	return ret;
hgs
parents:
diff changeset
    90
	}
hgs
parents:
diff changeset
    91
hgs
parents:
diff changeset
    92
hgs
parents:
diff changeset
    93
/**
hgs
parents:
diff changeset
    94
 * Subscribes to a message
hgs
parents:
diff changeset
    95
 * 
hgs
parents:
diff changeset
    96
 * @param aRoutingItem The subscription properties.
hgs
parents:
diff changeset
    97
 */
hgs
parents:
diff changeset
    98
TInt DTraceCoreRouter::Subscribe( TRoutingItem& aRoutingItem )
hgs
parents:
diff changeset
    99
    {
hgs
parents:
diff changeset
   100
    OstTrace1( TRACE_FLOW, DTRACECOREROUTER_SUBSCRIBE_ENTRY, "> DTraceCoreRouter::Subscribe 0x%x", ( TUint )&( aRoutingItem ) );
hgs
parents:
diff changeset
   101
    
hgs
parents:
diff changeset
   102
    TInt err = KErrNone;
hgs
parents:
diff changeset
   103
    if ( iMessageSender != NULL ) 
hgs
parents:
diff changeset
   104
        {
hgs
parents:
diff changeset
   105
        if ( aRoutingItem.iSubscriber != NULL )
hgs
parents:
diff changeset
   106
            {
hgs
parents:
diff changeset
   107
            Kern::MutexWait(*iLock);
hgs
parents:
diff changeset
   108
            // Add to routingItems array
hgs
parents:
diff changeset
   109
            err = iRoutingItems.Append( aRoutingItem );
hgs
parents:
diff changeset
   110
            Kern::MutexSignal(*iLock);
hgs
parents:
diff changeset
   111
            if ( err == KErrNone )                
hgs
parents:
diff changeset
   112
                {
hgs
parents:
diff changeset
   113
                // Set message sender to routing item
hgs
parents:
diff changeset
   114
                aRoutingItem.iSubscriber->SetMessageSender( *iMessageSender );
hgs
parents:
diff changeset
   115
                OstTraceExt2( TRACE_NORMAL, DTRACECOREROUTER_SUBSCRIBE_SUBSCRIBED_TO_MESSAGE, "DTraceCoreRouter::Subscribe - Subscribed to message. Subscriber:0x%x MsgId:0x%x", (TUint)aRoutingItem.iSubscriber, (TUint)aRoutingItem.iMessageID );
hgs
parents:
diff changeset
   116
                }
hgs
parents:
diff changeset
   117
            }
hgs
parents:
diff changeset
   118
        // Subscriber was NULL
hgs
parents:
diff changeset
   119
        else
hgs
parents:
diff changeset
   120
            {         
hgs
parents:
diff changeset
   121
            err = KErrArgument;
hgs
parents:
diff changeset
   122
            }
hgs
parents:
diff changeset
   123
        }
hgs
parents:
diff changeset
   124
    // Message sender not set
hgs
parents:
diff changeset
   125
    else
hgs
parents:
diff changeset
   126
        {
hgs
parents:
diff changeset
   127
        err = KErrGeneral;
hgs
parents:
diff changeset
   128
        }                                    
hgs
parents:
diff changeset
   129
    OstTrace1( TRACE_FLOW, DTRACECOREROUTER_SUBSCRIBE_EXIT, "< DTraceCoreRouter::Subscribe. Err:%d", err );
hgs
parents:
diff changeset
   130
    return err;
hgs
parents:
diff changeset
   131
    }
hgs
parents:
diff changeset
   132
hgs
parents:
diff changeset
   133
hgs
parents:
diff changeset
   134
/**
hgs
parents:
diff changeset
   135
 * Unsubscribes from a message
hgs
parents:
diff changeset
   136
 * 
hgs
parents:
diff changeset
   137
 * @param aRoutingItem The subscription properties
hgs
parents:
diff changeset
   138
 */
hgs
parents:
diff changeset
   139
void DTraceCoreRouter::Unsubscribe( TRoutingItem& aRoutingItem )
hgs
parents:
diff changeset
   140
    {
hgs
parents:
diff changeset
   141
    // Make sure not to delete item while going through items somewhere else
hgs
parents:
diff changeset
   142
    Kern::MutexWait(*iLock);
hgs
parents:
diff changeset
   143
	for ( TInt i = 0; i < iRoutingItems.Count(); i++ )
hgs
parents:
diff changeset
   144
	    {
hgs
parents:
diff changeset
   145
	    if ( iRoutingItems[ i ].iMessageID == aRoutingItem.iMessageID
hgs
parents:
diff changeset
   146
	            && iRoutingItems[ i ].iSubscriber == aRoutingItem.iSubscriber )
hgs
parents:
diff changeset
   147
	        {
hgs
parents:
diff changeset
   148
	        OstTraceExt2( TRACE_NORMAL, DTRACECOREROUTER_UNSUBSCRIBE_UNSUBSCRIBED, "DTraceCoreRouter::Unsubscribe - Unsubscribed 0x%x MsgID:0x%x", (TUint)aRoutingItem.iSubscriber, (TUint)aRoutingItem.iMessageID );
hgs
parents:
diff changeset
   149
	        iRoutingItems.Remove( i );
hgs
parents:
diff changeset
   150
	        i--;
hgs
parents:
diff changeset
   151
	        }
hgs
parents:
diff changeset
   152
	    }
hgs
parents:
diff changeset
   153
	Kern::MutexSignal(*iLock); 
hgs
parents:
diff changeset
   154
    }
hgs
parents:
diff changeset
   155
hgs
parents:
diff changeset
   156
hgs
parents:
diff changeset
   157
/**
hgs
parents:
diff changeset
   158
 * Unsubscribes from all messages of given subscriber
hgs
parents:
diff changeset
   159
 * 
hgs
parents:
diff changeset
   160
 * @param aSubscriber The subscriber to be unregistered
hgs
parents:
diff changeset
   161
 */
hgs
parents:
diff changeset
   162
void DTraceCoreRouter::Unsubscribe( DTraceCoreSubscriber& aSubscriber )
hgs
parents:
diff changeset
   163
    {
hgs
parents:
diff changeset
   164
    OstTrace1( TRACE_FLOW, DTRACECOREROUTER_UNSUBSCRIBEALL_ENTRY, "> DTraceCoreRouter::UnsubscribeAll 0x%x", ( TUint )&( aSubscriber ) );
hgs
parents:
diff changeset
   165
    
hgs
parents:
diff changeset
   166
    Kern::MutexWait(*iLock);
hgs
parents:
diff changeset
   167
	for ( TInt i = 0; i < iRoutingItems.Count(); i++ )
hgs
parents:
diff changeset
   168
	    {
hgs
parents:
diff changeset
   169
	    if ( iRoutingItems[ i ].iSubscriber == &aSubscriber )
hgs
parents:
diff changeset
   170
	        {
hgs
parents:
diff changeset
   171
	        OstTraceExt2( TRACE_NORMAL, DTRACECOREROUTER_UNSUBSCRIBEALL_UNSUBSCRIBED, "DTraceCoreRouter::UnsubscribeAll - Unsubscribed 0x%x MsgID:%d", (TUint)&aSubscriber, (TInt)iRoutingItems[ i ].iMessageID );
hgs
parents:
diff changeset
   172
	        iRoutingItems.Remove( i );
hgs
parents:
diff changeset
   173
	        i--;
hgs
parents:
diff changeset
   174
	        }
hgs
parents:
diff changeset
   175
	    }
hgs
parents:
diff changeset
   176
	Kern::MutexSignal(*iLock);
hgs
parents:
diff changeset
   177
    }
hgs
parents:
diff changeset
   178
hgs
parents:
diff changeset
   179
// End of File