perfsrv/analyzetool/dynamicmemoryhook/inc/analyzetoolallocator.h
author hgs
Mon, 06 Sep 2010 15:00:47 +0300
changeset 51 98307c651589
permissions -rw-r--r--
201035
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:  Declaration of the class RAnalyzeToolAllocator.
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
#ifndef ANALYZETOOLALLOCATOR_H
hgs
parents:
diff changeset
    20
#define ANALYZETOOLALLOCATOR_H
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
// INCLUDES
hgs
parents:
diff changeset
    23
#include <u32std.h>
hgs
parents:
diff changeset
    24
#include "codeblock.h"
hgs
parents:
diff changeset
    25
#include "threadstack.h"
hgs
parents:
diff changeset
    26
#include "analyzetoolmemoryallocator.h"
hgs
parents:
diff changeset
    27
#include <analyzetool/analyzetool.h>
hgs
parents:
diff changeset
    28
#include <analyzetool/atcommon.h>
hgs
parents:
diff changeset
    29
#include "analyzetoolfilelog.h"
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
// CLASS DECLARATION
hgs
parents:
diff changeset
    32
hgs
parents:
diff changeset
    33
/**
hgs
parents:
diff changeset
    34
*  Class which overloads the RAlloctor functions and provides access to 
hgs
parents:
diff changeset
    35
*  the overloaded functions  
hgs
parents:
diff changeset
    36
*/
hgs
parents:
diff changeset
    37
class RAnalyzeToolAllocator : public RAnalyzeToolMemoryAllocator
hgs
parents:
diff changeset
    38
    {
hgs
parents:
diff changeset
    39
hgs
parents:
diff changeset
    40
    public:
hgs
parents:
diff changeset
    41
hgs
parents:
diff changeset
    42
        /**
hgs
parents:
diff changeset
    43
        * C++ default constructor.
hgs
parents:
diff changeset
    44
        * @param aNotFirst Is this first thread using this heap
hgs
parents:
diff changeset
    45
        * @param aCodeblocks A reference to array of code segments
hgs
parents:
diff changeset
    46
        * @param aMutex A reference to mutex for schedule access to the 
hgs
parents:
diff changeset
    47
        *                   shared resources
hgs
parents:
diff changeset
    48
        * @param aProcessId A reference to the observed process id
hgs
parents:
diff changeset
    49
        * @param aAnalyzeTool Reference to device driver
hgs
parents:
diff changeset
    50
        * @param aLogOption The logging option
hgs
parents:
diff changeset
    51
        * @param aAllocCallStackSize Max number of stored callstack items when memory allocated
hgs
parents:
diff changeset
    52
        * @param aFreeCallStackSize Max number of stored callstack items when memory freed
hgs
parents:
diff changeset
    53
        */
hgs
parents:
diff changeset
    54
        RAnalyzeToolAllocator( TBool aNotFirst,
hgs
parents:
diff changeset
    55
                               RArray<TCodeblock>& aCodeblocks, 
hgs
parents:
diff changeset
    56
                               RMutex& aMutex, 
hgs
parents:
diff changeset
    57
                               TUint aProcessId,
hgs
parents:
diff changeset
    58
                               RAnalyzeTool& aAnalyzeTool,
hgs
parents:
diff changeset
    59
                               TUint32 aLogOption,
hgs
parents:
diff changeset
    60
                               TUint32 aAllocCallStackSize,
hgs
parents:
diff changeset
    61
                               TUint32 aFreeCallStackSize,
hgs
parents:
diff changeset
    62
                               RATFileLog& iLogFile );
hgs
parents:
diff changeset
    63
        /**
hgs
parents:
diff changeset
    64
        * Destructor.
hgs
parents:
diff changeset
    65
        */                     
hgs
parents:
diff changeset
    66
        ~RAnalyzeToolAllocator();
hgs
parents:
diff changeset
    67
hgs
parents:
diff changeset
    68
        /**
hgs
parents:
diff changeset
    69
        * Allocates a cell of specified size from the heap.
hgs
parents:
diff changeset
    70
        * @param aSize The size of the cell to be allocated from the heap. 
hgs
parents:
diff changeset
    71
        * @return TAny* A pointer to the allocated cell.
hgs
parents:
diff changeset
    72
        */
hgs
parents:
diff changeset
    73
        TAny* Alloc( TInt aSize );
hgs
parents:
diff changeset
    74
hgs
parents:
diff changeset
    75
        /**
hgs
parents:
diff changeset
    76
        * Frees the specified cell and returns it to the heap.
hgs
parents:
diff changeset
    77
        * @param aPtr A pointer to a cell to be freed.
hgs
parents:
diff changeset
    78
        */
hgs
parents:
diff changeset
    79
        void Free( TAny* aPtr );
hgs
parents:
diff changeset
    80
hgs
parents:
diff changeset
    81
        /**
hgs
parents:
diff changeset
    82
        * Increases or decreases the size of an existing cell.
hgs
parents:
diff changeset
    83
        * @param aPtr A pointer to the cell to be reallocated.
hgs
parents:
diff changeset
    84
        * @param aSize The new size of the cell. This may be bigger 
hgs
parents:
diff changeset
    85
        *              or smaller than the size of the original cell.
hgs
parents:
diff changeset
    86
        * @param aMode Flags controlling the reallocation.
hgs
parents:
diff changeset
    87
        * @return TAny* A pointer to the reallocated cell. This may be the 
hgs
parents:
diff changeset
    88
        *               same as the original pointer supplied through aCell.
hgs
parents:
diff changeset
    89
        */
hgs
parents:
diff changeset
    90
        //lint --e{1735} suppress "Virtual function has default parameter"
hgs
parents:
diff changeset
    91
        TAny* ReAlloc( TAny* aPtr, TInt aSize, TInt aMode = 0 );
hgs
parents:
diff changeset
    92
        
hgs
parents:
diff changeset
    93
        /**
hgs
parents:
diff changeset
    94
        * Gets the length of the available space in the specified 
hgs
parents:
diff changeset
    95
        * allocated cell.
hgs
parents:
diff changeset
    96
        * @param aCell A pointer to the allocated cell.
hgs
parents:
diff changeset
    97
        * @return TInt The length of the available space in the allocated cell.
hgs
parents:
diff changeset
    98
        */
hgs
parents:
diff changeset
    99
        TInt AllocLen( const TAny* aCell ) const;
hgs
parents:
diff changeset
   100
hgs
parents:
diff changeset
   101
    #ifndef __KERNEL_MODE__
hgs
parents:
diff changeset
   102
hgs
parents:
diff changeset
   103
        /**
hgs
parents:
diff changeset
   104
        * Opens this heap for shared access. Opening the heap increases 
hgs
parents:
diff changeset
   105
        * the heap's access count by one.
hgs
parents:
diff changeset
   106
        */
hgs
parents:
diff changeset
   107
        TInt Open();
hgs
parents:
diff changeset
   108
        
hgs
parents:
diff changeset
   109
        /**
hgs
parents:
diff changeset
   110
        * Closes this shared heap. Closing the heap decreases the heap's 
hgs
parents:
diff changeset
   111
        * access count by one.
hgs
parents:
diff changeset
   112
        */
hgs
parents:
diff changeset
   113
        void Close();
hgs
parents:
diff changeset
   114
hgs
parents:
diff changeset
   115
        /**
hgs
parents:
diff changeset
   116
        * The function frees excess committed space from the top of the heap.
hgs
parents:
diff changeset
   117
        * The size of the heap is never reduced below the minimum size 
hgs
parents:
diff changeset
   118
        * specified during creation of the heap.
hgs
parents:
diff changeset
   119
        * @return TInt The space reclaimed. If no space can be reclaimed, 
hgs
parents:
diff changeset
   120
                       then this value is zero.
hgs
parents:
diff changeset
   121
        */
hgs
parents:
diff changeset
   122
        TInt Compress();
hgs
parents:
diff changeset
   123
hgs
parents:
diff changeset
   124
        /**
hgs
parents:
diff changeset
   125
        * Frees all allocated cells on this heap. 
hgs
parents:
diff changeset
   126
        */
hgs
parents:
diff changeset
   127
        void Reset();
hgs
parents:
diff changeset
   128
hgs
parents:
diff changeset
   129
        /**
hgs
parents:
diff changeset
   130
        * Gets the number of cells allocated on this heap, and 
hgs
parents:
diff changeset
   131
        * the total space allocated to them.
hgs
parents:
diff changeset
   132
        * @param aTotalAllocSize On return, contains the total 
hgs
parents:
diff changeset
   133
        *                        space allocated to the cells.
hgs
parents:
diff changeset
   134
        * @return TInt The number of cells allocated on this heap.
hgs
parents:
diff changeset
   135
        */
hgs
parents:
diff changeset
   136
        TInt AllocSize( TInt& aTotalAllocSize ) const;
hgs
parents:
diff changeset
   137
        
hgs
parents:
diff changeset
   138
        /**
hgs
parents:
diff changeset
   139
        * Gets the total free space currently available on the heap and the 
hgs
parents:
diff changeset
   140
        * space available in the largest free block. The space available 
hgs
parents:
diff changeset
   141
        * represents the total space which can be allocated. Note that 
hgs
parents:
diff changeset
   142
        * compressing the heap may reduce the total free space available 
hgs
parents:
diff changeset
   143
        * and the space available in the largest free block.
hgs
parents:
diff changeset
   144
        * @param aBiggestBlock On return, contains the space available 
hgs
parents:
diff changeset
   145
        *                      in the largest free block on the heap.
hgs
parents:
diff changeset
   146
 
hgs
parents:
diff changeset
   147
        * @return TInt The total free space currently available on the heap.
hgs
parents:
diff changeset
   148
hgs
parents:
diff changeset
   149
        */
hgs
parents:
diff changeset
   150
        TInt Available( TInt& aBiggestBlock ) const;
hgs
parents:
diff changeset
   151
        
hgs
parents:
diff changeset
   152
    #endif
hgs
parents:
diff changeset
   153
hgs
parents:
diff changeset
   154
        /**
hgs
parents:
diff changeset
   155
        * Invocates specified debug funtionality.
hgs
parents:
diff changeset
   156
        * @param aFunc The debug function
hgs
parents:
diff changeset
   157
        * @param a1 Debug function specific paramenter.
hgs
parents:
diff changeset
   158
        * @param a2 Debug function specific paramenter.
hgs
parents:
diff changeset
   159
        * @return TInt Returns KErrNone, if successful otherwise one 
hgs
parents:
diff changeset
   160
        *              of the other system-wide error codes.
hgs
parents:
diff changeset
   161
        */
hgs
parents:
diff changeset
   162
        //lint --e{1735} suppress "Virtual function has default parameter"
hgs
parents:
diff changeset
   163
        TInt DebugFunction( TInt aFunc, TAny* a1 = NULL, TAny* a2 = NULL );
hgs
parents:
diff changeset
   164
hgs
parents:
diff changeset
   165
    protected:
hgs
parents:
diff changeset
   166
hgs
parents:
diff changeset
   167
        /**
hgs
parents:
diff changeset
   168
        * Extension function
hgs
parents:
diff changeset
   169
        * @param aExtensionId The extension id
hgs
parents:
diff changeset
   170
        * @param a0 Extension specific paramenter.
hgs
parents:
diff changeset
   171
        * @param a1 Extension specific paramenter.
hgs
parents:
diff changeset
   172
        * @return TInt Returns KErrNone, if successful otherwise one 
hgs
parents:
diff changeset
   173
        *              of the other system-wide error codes. 
hgs
parents:
diff changeset
   174
        */
hgs
parents:
diff changeset
   175
        TInt Extension_( TUint aExtensionId, TAny*& a0, TAny* a1 );
hgs
parents:
diff changeset
   176
hgs
parents:
diff changeset
   177
    public: // from RAnalyzeToolMemoryAllocator
hgs
parents:
diff changeset
   178
        
hgs
parents:
diff changeset
   179
        /**
hgs
parents:
diff changeset
   180
        * Installs the RTraceAllocator allocator
hgs
parents:
diff changeset
   181
        */
hgs
parents:
diff changeset
   182
        void Uninstall();
hgs
parents:
diff changeset
   183
        
hgs
parents:
diff changeset
   184
        /**
hgs
parents:
diff changeset
   185
        * Shares the heap
hgs
parents:
diff changeset
   186
        */
hgs
parents:
diff changeset
   187
        void ShareHeap();
hgs
parents:
diff changeset
   188
hgs
parents:
diff changeset
   189
    private:
hgs
parents:
diff changeset
   190
    
hgs
parents:
diff changeset
   191
        /**
hgs
parents:
diff changeset
   192
        * Find the current thread which is using the heap
hgs
parents:
diff changeset
   193
        * @param aStackStart A reference where the stack start is stored
hgs
parents:
diff changeset
   194
        * @return TBool ETrue if a thread can be found, EFalse otherwise
hgs
parents:
diff changeset
   195
        */
hgs
parents:
diff changeset
   196
        TBool FindCurrentThreadStack( TUint32& aStackStart );
hgs
parents:
diff changeset
   197
hgs
parents:
diff changeset
   198
    private: 
hgs
parents:
diff changeset
   199
    
hgs
parents:
diff changeset
   200
        /* A reference to codeblocks of the observed process */            
hgs
parents:
diff changeset
   201
        RArray<TCodeblock>& iCodeblocks;
hgs
parents:
diff changeset
   202
hgs
parents:
diff changeset
   203
        /* The mutex for serializing access to the shared resources */
hgs
parents:
diff changeset
   204
        RMutex& iMutex;
hgs
parents:
diff changeset
   205
hgs
parents:
diff changeset
   206
        /* The process id */
hgs
parents:
diff changeset
   207
        TUint iProcessId;
hgs
parents:
diff changeset
   208
hgs
parents:
diff changeset
   209
        /* Array for storing the callstack */
hgs
parents:
diff changeset
   210
        TFixedArray<TUint32, KATMaxCallstackLength> iCallStack;
hgs
parents:
diff changeset
   211
hgs
parents:
diff changeset
   212
        /* Array for storing the reallocation callstack */
hgs
parents:
diff changeset
   213
        TFixedArray <TUint32, KATMaxCallstackLength> iReCallStack;
hgs
parents:
diff changeset
   214
hgs
parents:
diff changeset
   215
        /* Array for storing the reallocation callstack */	
hgs
parents:
diff changeset
   216
        TFixedArray<TUint32, KATMaxFreeCallstackLength> iFreeCallStack;
hgs
parents:
diff changeset
   217
                
hgs
parents:
diff changeset
   218
        /* Array of threads using this heap */
hgs
parents:
diff changeset
   219
        RArray<TThreadStack> iThreadArray;
hgs
parents:
diff changeset
   220
hgs
parents:
diff changeset
   221
        RAnalyzeTool& iAnalyzeTool;
hgs
parents:
diff changeset
   222
hgs
parents:
diff changeset
   223
        /* Log option */
hgs
parents:
diff changeset
   224
        TUint32 iLogOption;
hgs
parents:
diff changeset
   225
        
hgs
parents:
diff changeset
   226
        /* Max items on stored call stack when memory allocated */
hgs
parents:
diff changeset
   227
        TUint32 iAllocMaxCallStack;
hgs
parents:
diff changeset
   228
        
hgs
parents:
diff changeset
   229
        /* Max items on stored call stack when memory freed */
hgs
parents:
diff changeset
   230
        TUint32 iFreeMaxCallStack;
hgs
parents:
diff changeset
   231
        
hgs
parents:
diff changeset
   232
        /* Binary log file */
hgs
parents:
diff changeset
   233
        RATFileLog& iLogFile;
hgs
parents:
diff changeset
   234
        
hgs
parents:
diff changeset
   235
    };
hgs
parents:
diff changeset
   236
hgs
parents:
diff changeset
   237
#endif // ANALYZETOOLALLOCATOR_H
hgs
parents:
diff changeset
   238
hgs
parents:
diff changeset
   239
// End of File