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