perfsrv/memspy/Driver/Kernel/Source/MemSpyDriverXferBuffer.cpp
author hgs
Tue, 26 Oct 2010 16:20:32 +0300
changeset 62 1c2bb2fc7c87
parent 51 98307c651589
permissions -rw-r--r--
201043
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 "MemSpyDriverXferBuffer.h"
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
// System includes
hgs
parents:
diff changeset
    21
#include <u32hal.h>
hgs
parents:
diff changeset
    22
hgs
parents:
diff changeset
    23
// Shared includes
hgs
parents:
diff changeset
    24
#include <memspy/driver/memspydriverobjectsshared.h>
hgs
parents:
diff changeset
    25
#include "MemSpyDriverObjectsInternal.h"
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
// User includes
hgs
parents:
diff changeset
    28
#include "MemSpyDriverUtils.h"
hgs
parents:
diff changeset
    29
#include "MemSpyDriverDevice.h"
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
hgs
parents:
diff changeset
    33
DMemSpyDriverXferBuffer::DMemSpyDriverXferBuffer( DMemSpyDriverDevice& aDevice, DThread& aThread )
hgs
parents:
diff changeset
    34
:   iDevice( aDevice ), iClientThread( aThread )
hgs
parents:
diff changeset
    35
    {
hgs
parents:
diff changeset
    36
	TRACE( Kern::Printf("DMemSpyDriverXferBuffer::DMemSpyDriverXferBuffer() - this: 0x%08x", this ));
hgs
parents:
diff changeset
    37
    }
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
hgs
parents:
diff changeset
    40
DMemSpyDriverXferBuffer::~DMemSpyDriverXferBuffer()
hgs
parents:
diff changeset
    41
	{
hgs
parents:
diff changeset
    42
	TRACE( Kern::Printf("DMemSpyDriverXferBuffer::~DMemSpyDriverXferBuffer() - START - this: 0x%08x", this ));
hgs
parents:
diff changeset
    43
62
hgs
parents: 51
diff changeset
    44
    if (iBuffer) 
hgs
parents: 51
diff changeset
    45
        {
hgs
parents: 51
diff changeset
    46
        NKern::ThreadEnterCS();
hgs
parents: 51
diff changeset
    47
        delete iBuffer;
hgs
parents: 51
diff changeset
    48
        NKern::ThreadLeaveCS();
hgs
parents: 51
diff changeset
    49
        }
51
hgs
parents:
diff changeset
    50
hgs
parents:
diff changeset
    51
    TRACE( Kern::Printf("DMemSpyDriverXferBuffer::~DMemSpyDriverXferBuffer() - END - this: 0x%08x", this ));
hgs
parents:
diff changeset
    52
	}
hgs
parents:
diff changeset
    53
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
TInt DMemSpyDriverXferBuffer::Construct( TInt aSize )
hgs
parents:
diff changeset
    56
    {
hgs
parents:
diff changeset
    57
    TRACE( Kern::Printf("DMemSpyDriverXferBuffer::Construct() - START - this: 0x%08x, newSize: %d, iSize: %d", this, aSize, iSize ));
hgs
parents:
diff changeset
    58
    TInt ret = KErrNone;
hgs
parents:
diff changeset
    59
    //
hgs
parents:
diff changeset
    60
    iBuffer = Kern::AllocZ( aSize );
hgs
parents:
diff changeset
    61
    if  ( iBuffer == NULL )
hgs
parents:
diff changeset
    62
        {
hgs
parents:
diff changeset
    63
        ret = KErrNoMemory;
hgs
parents:
diff changeset
    64
        }
hgs
parents:
diff changeset
    65
    else
hgs
parents:
diff changeset
    66
        {
hgs
parents:
diff changeset
    67
        iSize = aSize;
hgs
parents:
diff changeset
    68
        }
hgs
parents:
diff changeset
    69
    //
hgs
parents:
diff changeset
    70
    TRACE( Kern::Printf("DMemSpyDriverXferBuffer::Construct() - END - this: 0x%08x, newSize: %d, iSize: %d", this, aSize, iSize ));
hgs
parents:
diff changeset
    71
    return ret;
hgs
parents:
diff changeset
    72
    }
hgs
parents:
diff changeset
    73
hgs
parents:
diff changeset
    74
hgs
parents:
diff changeset
    75
hgs
parents:
diff changeset
    76
TInt DMemSpyDriverXferBuffer::Size() const
hgs
parents:
diff changeset
    77
    {
hgs
parents:
diff changeset
    78
    return iSize;
hgs
parents:
diff changeset
    79
    }
hgs
parents:
diff changeset
    80
hgs
parents:
diff changeset
    81
hgs
parents:
diff changeset
    82
TInt DMemSpyDriverXferBuffer::GrowBy( TInt aSize )
hgs
parents:
diff changeset
    83
    {
hgs
parents:
diff changeset
    84
    TRACE( Kern::Printf("DMemSpyDriverXferBuffer::GrowBy() - START - this: 0x%08x, newSize: %d, iSize: %d", this, iSize + aSize, iSize ));
hgs
parents:
diff changeset
    85
    //
hgs
parents:
diff changeset
    86
    TInt ret = KErrNone;
hgs
parents:
diff changeset
    87
    const TInt newSize = iSize + aSize;
hgs
parents:
diff changeset
    88
    if  ( newSize > iSize )
hgs
parents:
diff changeset
    89
        {
hgs
parents:
diff changeset
    90
        NKern::ThreadEnterCS();
hgs
parents:
diff changeset
    91
        ret = Kern::SafeReAlloc( iBuffer, iSize, newSize );
hgs
parents:
diff changeset
    92
        if  ( ret == KErrNone )
hgs
parents:
diff changeset
    93
            {
hgs
parents:
diff changeset
    94
            iSize = newSize;
hgs
parents:
diff changeset
    95
            }
hgs
parents:
diff changeset
    96
	    NKern::ThreadLeaveCS();
hgs
parents:
diff changeset
    97
        }
hgs
parents:
diff changeset
    98
    else
hgs
parents:
diff changeset
    99
        {
hgs
parents:
diff changeset
   100
        TRACE( Kern::Printf("DMemSpyDriverXferBuffer::GrowBy() - WARNING - new size would shrink buffer (or have no effect)!" ));
hgs
parents:
diff changeset
   101
        }
hgs
parents:
diff changeset
   102
    //
hgs
parents:
diff changeset
   103
    TRACE( Kern::Printf("DMemSpyDriverXferBuffer::GrowBy() - END - this: 0x%08x, err: %d, iSize: %d", this, ret, iSize ));
hgs
parents:
diff changeset
   104
    return ret;
hgs
parents:
diff changeset
   105
    }
hgs
parents:
diff changeset
   106
hgs
parents:
diff changeset
   107
hgs
parents:
diff changeset
   108
TInt DMemSpyDriverXferBuffer::EnsureCapacity( TInt aSize )
hgs
parents:
diff changeset
   109
    {
hgs
parents:
diff changeset
   110
    TRACE( Kern::Printf("DMemSpyDriverXferBuffer::EnsureCapacity() - START - this: 0x%08x, aSize: %d, iSize: %d", this, aSize, iSize ));
hgs
parents:
diff changeset
   111
    //
hgs
parents:
diff changeset
   112
    TInt ret = KErrNone;
hgs
parents:
diff changeset
   113
    if  ( aSize > iSize )
hgs
parents:
diff changeset
   114
        {
hgs
parents:
diff changeset
   115
        const TInt newSize = aSize;
hgs
parents:
diff changeset
   116
        //
hgs
parents:
diff changeset
   117
        NKern::ThreadEnterCS();
hgs
parents:
diff changeset
   118
        ret = Kern::SafeReAlloc( iBuffer, iSize, newSize );
hgs
parents:
diff changeset
   119
        if  ( ret == KErrNone )
hgs
parents:
diff changeset
   120
            {
hgs
parents:
diff changeset
   121
            iSize = newSize;
hgs
parents:
diff changeset
   122
            }
hgs
parents:
diff changeset
   123
	    NKern::ThreadLeaveCS();
hgs
parents:
diff changeset
   124
        }
hgs
parents:
diff changeset
   125
    else
hgs
parents:
diff changeset
   126
        {
hgs
parents:
diff changeset
   127
        TRACE( Kern::Printf("DMemSpyDriverXferBuffer::EnsureCapacity() - WARNING - new size would shrink buffer (or have no effect)!" ));
hgs
parents:
diff changeset
   128
        }
hgs
parents:
diff changeset
   129
    //
hgs
parents:
diff changeset
   130
    TRACE( Kern::Printf("DMemSpyDriverXferBuffer::EnsureCapacity() - END - this: 0x%08x, err: %d, iSize: %d", this, ret, iSize ));
hgs
parents:
diff changeset
   131
    return ret;
hgs
parents:
diff changeset
   132
    }
hgs
parents:
diff changeset
   133
hgs
parents:
diff changeset
   134
hgs
parents:
diff changeset
   135
void DMemSpyDriverXferBuffer::Reset()
hgs
parents:
diff changeset
   136
    {
hgs
parents:
diff changeset
   137
    memclr( iBuffer, iSize );
hgs
parents:
diff changeset
   138
    }
hgs
parents:
diff changeset
   139
hgs
parents:
diff changeset
   140
hgs
parents:
diff changeset
   141
hgs
parents:
diff changeset
   142
hgs
parents:
diff changeset
   143
hgs
parents:
diff changeset
   144
hgs
parents:
diff changeset
   145
hgs
parents:
diff changeset
   146
hgs
parents:
diff changeset
   147
hgs
parents:
diff changeset
   148
hgs
parents:
diff changeset
   149
TInt DMemSpyDriverXferBuffer::WriteToClient( TDes8* aDestinationPointer, TInt aLength )
hgs
parents:
diff changeset
   150
    {
hgs
parents:
diff changeset
   151
    // Check the client has enough space
hgs
parents:
diff changeset
   152
    TInt err = Kern::ThreadGetDesMaxLength( &iClientThread, aDestinationPointer );
hgs
parents:
diff changeset
   153
    if  ( err >= 0 )
hgs
parents:
diff changeset
   154
        {
hgs
parents:
diff changeset
   155
        if  ( aLength > err )
hgs
parents:
diff changeset
   156
            {
hgs
parents:
diff changeset
   157
            Kern::Printf("DMemSpyDriverXferBuffer::WriteToClient() - client descriptor max len: %d, amount to write: %d => KErrOverflow", err, aLength );
hgs
parents:
diff changeset
   158
            err = KErrOverflow;
hgs
parents:
diff changeset
   159
            }
hgs
parents:
diff changeset
   160
        else
hgs
parents:
diff changeset
   161
            {
hgs
parents:
diff changeset
   162
            const TPtrC8 pData( (const TUint8*) iBuffer, aLength );
hgs
parents:
diff changeset
   163
            err = Kern::ThreadDesWrite( &iClientThread, aDestinationPointer, pData, 0, KChunkShiftBy0 | KTruncateToMaxLength, &iClientThread );
hgs
parents:
diff changeset
   164
            }
hgs
parents:
diff changeset
   165
        }
hgs
parents:
diff changeset
   166
hgs
parents:
diff changeset
   167
    // Check for bad descriptor and panic the client
hgs
parents:
diff changeset
   168
    if  ( err == KErrBadDescriptor )
hgs
parents:
diff changeset
   169
        {
hgs
parents:
diff changeset
   170
        MemSpyDriverUtils::PanicThread( iClientThread, EPanicBadDescriptor );
hgs
parents:
diff changeset
   171
        }
hgs
parents:
diff changeset
   172
    //
hgs
parents:
diff changeset
   173
    return err;
hgs
parents:
diff changeset
   174
    }
hgs
parents:
diff changeset
   175
hgs
parents:
diff changeset
   176
hgs
parents:
diff changeset
   177
DThread& DMemSpyDriverXferBuffer::ClientThread()
hgs
parents:
diff changeset
   178
    {
hgs
parents:
diff changeset
   179
    return iClientThread;
hgs
parents:
diff changeset
   180
    }
hgs
parents:
diff changeset
   181
hgs
parents:
diff changeset
   182
hgs
parents:
diff changeset
   183
TUint8* DMemSpyDriverXferBuffer::Ptr()
hgs
parents:
diff changeset
   184
    {
hgs
parents:
diff changeset
   185
    return (TUint8*) iBuffer;
hgs
parents:
diff changeset
   186
    }
hgs
parents:
diff changeset
   187
hgs
parents:
diff changeset
   188
hgs
parents:
diff changeset
   189
hgs
parents:
diff changeset
   190
hgs
parents:
diff changeset
   191
hgs
parents:
diff changeset
   192