perfsrv/memspy/Driver/Kernel/Source/MemSpyDriverStreamWriter.cpp
author hgs
Wed, 29 Sep 2010 17:45:35 +0300
changeset 54 a151135b0cf9
parent 51 98307c651589
permissions -rw-r--r--
201039
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
51
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include "MemSpyDriverStreamWriter.h"
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
// User includes
hgs
parents:
diff changeset
    21
#include "MemSpyDriverUtils.h"
hgs
parents:
diff changeset
    22
#include "MemSpyDriverXferBuffer.h"
hgs
parents:
diff changeset
    23
54
hgs
parents: 51
diff changeset
    24
#if defined(__GCC32__)
hgs
parents: 51
diff changeset
    25
#define __RETURN_ADDRESS() __builtin_return_address(0)
hgs
parents: 51
diff changeset
    26
#elif defined (__ARMCC__)
hgs
parents: 51
diff changeset
    27
#define __RETURN_ADDRESS() ((TAny*)__return_address())
hgs
parents: 51
diff changeset
    28
#else
hgs
parents: 51
diff changeset
    29
#define __RETURN_ADDRESS() 0 // not supported
hgs
parents: 51
diff changeset
    30
#endif 
51
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
hgs
parents:
diff changeset
    33
RMemSpyMemStreamWriter::RMemSpyMemStreamWriter()
hgs
parents:
diff changeset
    34
:   iBuffer( NULL ), iCurrent( NULL ), iMax( 0 ), iMark( NULL ), iCommitted( 0 )
hgs
parents:
diff changeset
    35
    {
hgs
parents:
diff changeset
    36
    }
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
RMemSpyMemStreamWriter::RMemSpyMemStreamWriter( DMemSpyDriverXferBuffer& aBuffer )
hgs
parents:
diff changeset
    40
:   iBuffer( &aBuffer ), iMark( NULL ), iCommitted( 0 )
hgs
parents:
diff changeset
    41
    {
hgs
parents:
diff changeset
    42
    iCurrent = iBuffer->Ptr();
hgs
parents:
diff changeset
    43
    iMax = iCurrent + iBuffer->Size();
hgs
parents:
diff changeset
    44
    TRACE( Kern::Printf("RMemSpyMemStreamWriter::RMemSpyMemStreamWriter() - current: 0x%08x, max: 0x%08x, size: %d", iCurrent, iMax, iBuffer->Size() ) );
hgs
parents:
diff changeset
    45
    }
hgs
parents:
diff changeset
    46
hgs
parents:
diff changeset
    47
hgs
parents:
diff changeset
    48
void RMemSpyMemStreamWriter::Close()
hgs
parents:
diff changeset
    49
    {
hgs
parents:
diff changeset
    50
    iBuffer = NULL;
hgs
parents:
diff changeset
    51
    iMark = NULL;
hgs
parents:
diff changeset
    52
    }
hgs
parents:
diff changeset
    53
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
TInt RMemSpyMemStreamWriter::WriteAndClose( TDes8* aDestinationPointer )
hgs
parents:
diff changeset
    56
    {
hgs
parents:
diff changeset
    57
    __ASSERT_ALWAYS( IsOpen(), MemSpyDriverUtils::Fault( __LINE__ ) );
hgs
parents:
diff changeset
    58
    //
hgs
parents:
diff changeset
    59
    const TInt ret = iBuffer->WriteToClient( aDestinationPointer, iCommitted );
hgs
parents:
diff changeset
    60
    Close();
hgs
parents:
diff changeset
    61
    //
hgs
parents:
diff changeset
    62
    return ret;
hgs
parents:
diff changeset
    63
    }
hgs
parents:
diff changeset
    64
hgs
parents:
diff changeset
    65
hgs
parents:
diff changeset
    66
TInt32* RMemSpyMemStreamWriter::WriteInt32( TInt32 aValue )
hgs
parents:
diff changeset
    67
    {
hgs
parents:
diff changeset
    68
    TInt32* ret = NULL;
hgs
parents:
diff changeset
    69
    //
hgs
parents:
diff changeset
    70
    __ASSERT_ALWAYS( IsOpen(), MemSpyDriverUtils::Fault( __LINE__ ) );
hgs
parents:
diff changeset
    71
    if  ( !IsFull() )
hgs
parents:
diff changeset
    72
        {
hgs
parents:
diff changeset
    73
        ret = (TInt32*) iCurrent;
hgs
parents:
diff changeset
    74
        *ret = aValue;
hgs
parents:
diff changeset
    75
        IncrementPos( sizeof( TInt32 ) );
hgs
parents:
diff changeset
    76
        }
hgs
parents:
diff changeset
    77
    else
hgs
parents:
diff changeset
    78
        {
54
hgs
parents: 51
diff changeset
    79
        TRACE( Kern::Printf( "RMemSpyMemStreamWriter::WriteInt32() - asked to write: 0x%08x from fn: 0x%08x BUT AM FULL", aValue, __RETURN_ADDRESS() ) );
51
hgs
parents:
diff changeset
    80
        }
hgs
parents:
diff changeset
    81
    //
hgs
parents:
diff changeset
    82
    return ret;
hgs
parents:
diff changeset
    83
    }
hgs
parents:
diff changeset
    84
hgs
parents:
diff changeset
    85
hgs
parents:
diff changeset
    86
TUint32* RMemSpyMemStreamWriter::WriteUint32( TUint32 aValue )
hgs
parents:
diff changeset
    87
    {
hgs
parents:
diff changeset
    88
    TUint32* ret = NULL;
hgs
parents:
diff changeset
    89
    //
hgs
parents:
diff changeset
    90
    __ASSERT_ALWAYS( IsOpen(), MemSpyDriverUtils::Fault( __LINE__ ) );
hgs
parents:
diff changeset
    91
    if  ( !IsFull() )
hgs
parents:
diff changeset
    92
        {
hgs
parents:
diff changeset
    93
        ret = (TUint32*) iCurrent;
hgs
parents:
diff changeset
    94
        *ret = aValue;
hgs
parents:
diff changeset
    95
        IncrementPos( sizeof( TUint32 ) );
hgs
parents:
diff changeset
    96
        }
hgs
parents:
diff changeset
    97
    else
hgs
parents:
diff changeset
    98
        {
54
hgs
parents: 51
diff changeset
    99
        TRACE( Kern::Printf( "RMemSpyMemStreamWriter::WriteUint32() - asked to write: 0x%08x from fn: 0x%08x BUT AM FULL", aValue, __RETURN_ADDRESS() ) );
51
hgs
parents:
diff changeset
   100
        }
hgs
parents:
diff changeset
   101
    //
hgs
parents:
diff changeset
   102
    return ret;
hgs
parents:
diff changeset
   103
    }
hgs
parents:
diff changeset
   104
hgs
parents:
diff changeset
   105
hgs
parents:
diff changeset
   106
TUint8* RMemSpyMemStreamWriter::Current() const
hgs
parents:
diff changeset
   107
    {
hgs
parents:
diff changeset
   108
    __ASSERT_ALWAYS( IsOpen(), MemSpyDriverUtils::Fault( __LINE__ ) );
hgs
parents:
diff changeset
   109
    return iCurrent;
hgs
parents:
diff changeset
   110
    }
hgs
parents:
diff changeset
   111
hgs
parents:
diff changeset
   112
hgs
parents:
diff changeset
   113
void RMemSpyMemStreamWriter::Seek( TInt aPosition )
hgs
parents:
diff changeset
   114
    {
hgs
parents:
diff changeset
   115
    __ASSERT_ALWAYS( IsOpen(), MemSpyDriverUtils::Fault( __LINE__ ) );
hgs
parents:
diff changeset
   116
    TUint8* pos = iBuffer->Ptr() + aPosition;
hgs
parents:
diff changeset
   117
    __ASSERT_ALWAYS( pos < iMax, MemSpyDriverUtils::Fault( __LINE__ ) );
hgs
parents:
diff changeset
   118
    iCurrent = pos;
hgs
parents:
diff changeset
   119
    }
hgs
parents:
diff changeset
   120
hgs
parents:
diff changeset
   121
hgs
parents:
diff changeset
   122
TUint32 RMemSpyMemStreamWriter::Remaining() const
hgs
parents:
diff changeset
   123
    {
hgs
parents:
diff changeset
   124
    __ASSERT_ALWAYS( IsOpen(), MemSpyDriverUtils::Fault( __LINE__ ) );
hgs
parents:
diff changeset
   125
    const TUint32 max = reinterpret_cast< TUint32 >( iMax );
hgs
parents:
diff changeset
   126
    const TUint32 cur = reinterpret_cast< TUint32 >( iCurrent );
hgs
parents:
diff changeset
   127
    TRACE( Kern::Printf("RMemSpyMemStreamWriter::Remaining() - current: 0x%08x, max: 0x%08x, ret: %d", cur, max, ( max - cur ) ) );
hgs
parents:
diff changeset
   128
    return ( max - cur );
hgs
parents:
diff changeset
   129
    }
hgs
parents:
diff changeset
   130
hgs
parents:
diff changeset
   131
hgs
parents:
diff changeset
   132
void RMemSpyMemStreamWriter::MarkSet()
hgs
parents:
diff changeset
   133
    {
hgs
parents:
diff changeset
   134
    __ASSERT_ALWAYS( iMark == NULL, MemSpyDriverUtils::Fault( __LINE__ ) );
hgs
parents:
diff changeset
   135
    iMark = iCurrent;
hgs
parents:
diff changeset
   136
    }
hgs
parents:
diff changeset
   137
hgs
parents:
diff changeset
   138
hgs
parents:
diff changeset
   139
void RMemSpyMemStreamWriter::MarkResume()
hgs
parents:
diff changeset
   140
    {
hgs
parents:
diff changeset
   141
    __ASSERT_ALWAYS( iMark != NULL, MemSpyDriverUtils::Fault( __LINE__ ) );
hgs
parents:
diff changeset
   142
    iCurrent = iMark;
hgs
parents:
diff changeset
   143
    iMark = NULL;
hgs
parents:
diff changeset
   144
    }
hgs
parents:
diff changeset
   145
hgs
parents:
diff changeset
   146
hgs
parents:
diff changeset
   147
TBool RMemSpyMemStreamWriter::IsFull() const
hgs
parents:
diff changeset
   148
    {
hgs
parents:
diff changeset
   149
    __ASSERT_ALWAYS( IsOpen(), MemSpyDriverUtils::Fault( __LINE__ ) );
hgs
parents:
diff changeset
   150
    const TBool ret = ( iCurrent >= iMax );
hgs
parents:
diff changeset
   151
    return ret;
hgs
parents:
diff changeset
   152
    }
hgs
parents:
diff changeset
   153
hgs
parents:
diff changeset
   154
hgs
parents:
diff changeset
   155
TBool RMemSpyMemStreamWriter::IsOpen() const
hgs
parents:
diff changeset
   156
    {
hgs
parents:
diff changeset
   157
    const TBool ret = ( iBuffer && iCurrent && iMax );
hgs
parents:
diff changeset
   158
    return ret;
hgs
parents:
diff changeset
   159
    }
hgs
parents:
diff changeset
   160
hgs
parents:
diff changeset
   161
hgs
parents:
diff changeset
   162
RMemSpyMemStreamWriter& RMemSpyMemStreamWriter::operator=( const RMemSpyMemStreamWriter& aCopy )
hgs
parents:
diff changeset
   163
    {
hgs
parents:
diff changeset
   164
    iBuffer = aCopy.iBuffer;
hgs
parents:
diff changeset
   165
    iMark = aCopy.iMark;
hgs
parents:
diff changeset
   166
    iCommitted = aCopy.iCommitted;
hgs
parents:
diff changeset
   167
    iCurrent = aCopy.iCurrent;
hgs
parents:
diff changeset
   168
    iMax = aCopy.iMax;
hgs
parents:
diff changeset
   169
    //
hgs
parents:
diff changeset
   170
    return *this;
hgs
parents:
diff changeset
   171
    }
hgs
parents:
diff changeset
   172
hgs
parents:
diff changeset
   173
hgs
parents:
diff changeset
   174
void RMemSpyMemStreamWriter::IncrementPos( TInt aAmount )
hgs
parents:
diff changeset
   175
    {
hgs
parents:
diff changeset
   176
    __ASSERT_ALWAYS( IsOpen(), MemSpyDriverUtils::Fault( __LINE__ ) );
hgs
parents:
diff changeset
   177
    if  ( iCurrent + aAmount > iMax )
hgs
parents:
diff changeset
   178
        {
hgs
parents:
diff changeset
   179
        Kern::Printf("RMemSpyMemStreamWriter::IncrementPos() - OVERFLOW - current: 0x%08x, max: 0x%08x, aAmount: %d", iCurrent, iMax, aAmount );
hgs
parents:
diff changeset
   180
        }
hgs
parents:
diff changeset
   181
hgs
parents:
diff changeset
   182
    iCurrent += aAmount;
hgs
parents:
diff changeset
   183
    iCommitted += aAmount;
hgs
parents:
diff changeset
   184
    }
hgs
parents:
diff changeset
   185
hgs
parents:
diff changeset
   186
hgs
parents:
diff changeset
   187