analyzetool/dynamicmemoryhook/src/customuser.cpp
author hgs
Mon, 23 Aug 2010 15:29:36 +0300
changeset 41 838cdffd57ce
parent 20 a71a3e32a2ae
child 49 7fdc9a71d314
permissions -rw-r--r--
201031
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
20
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:  Definitions for the class CustomUser.
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include <f32file.h>
hgs
parents:
diff changeset
    19
#include <utf.h>
hgs
parents:
diff changeset
    20
#include "customuser.h"
hgs
parents:
diff changeset
    21
#include "analyzetoolmainallocator.h"
hgs
parents:
diff changeset
    22
#include "analyzetoolallocator.h"
hgs
parents:
diff changeset
    23
#include "atlog.h"
hgs
parents:
diff changeset
    24
#include "analyzetoolmemoryallocator.h"
hgs
parents:
diff changeset
    25
#include "analyzetoolpanics.pan"
hgs
parents:
diff changeset
    26
#include "atstorageservercommon.h"
hgs
parents:
diff changeset
    27
#include "atdriveinfo.h"
hgs
parents:
diff changeset
    28
#include <analyzetool/analyzetooltraceconstants.h>
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
#ifdef USE_CLEANER_DLL
hgs
parents:
diff changeset
    31
// Global variable to detect dll attach & detach in process.
hgs
parents:
diff changeset
    32
// Note! This is initialized after SetupThreadHeap so its not usable there.
hgs
parents:
diff changeset
    33
// This is used to store the main thread id and track when the process ends
hgs
parents:
diff changeset
    34
// to load the cleaner dll with call back feature to cleanup allocator at the
hgs
parents:
diff changeset
    35
// last possible phase.
hgs
parents:
diff changeset
    36
#include <analyzetool/analyzetoolcleaner.h>
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
// CONSTANTS
hgs
parents:
diff changeset
    39
const TInt KAToolCleanerOrdinal = 1;
hgs
parents:
diff changeset
    40
hgs
parents:
diff changeset
    41
class TAnalyzeToolGlobalTracker : public TAnalyzeToolCleanerBase
hgs
parents:
diff changeset
    42
    {
hgs
parents:
diff changeset
    43
public:
hgs
parents:
diff changeset
    44
    /* Main thread id */
hgs
parents:
diff changeset
    45
    TThreadId iMainId;
hgs
parents:
diff changeset
    46
    
hgs
parents:
diff changeset
    47
    /* Inform if panic occured */
hgs
parents:
diff changeset
    48
    TBool iPanic;
hgs
parents:
diff changeset
    49
    
hgs
parents:
diff changeset
    50
    // -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    51
    // TAnalyzeToolGlobalTracker::TAnalyzeToolGlobalTracker()
hgs
parents:
diff changeset
    52
    // C++ default constructor 
hgs
parents:
diff changeset
    53
    // -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    54
    //
hgs
parents:
diff changeset
    55
    TAnalyzeToolGlobalTracker()
hgs
parents:
diff changeset
    56
        {
hgs
parents:
diff changeset
    57
        LOGSTR1( "ATMH TAnalyzeToolGlobalTracker::TAnalyzeToolGlobalTracker()" );
hgs
parents:
diff changeset
    58
        
hgs
parents:
diff changeset
    59
        iPanic = EFalse; // no panic occured
hgs
parents:
diff changeset
    60
        iMainId = RThread().Id(); // set main thread id
hgs
parents:
diff changeset
    61
        LOGSTR2( "ATMH TAnalyzeToolGlobalTracker() > Main id set: %d", 
hgs
parents:
diff changeset
    62
                iMainId.operator TUint() );
hgs
parents:
diff changeset
    63
        }
hgs
parents:
diff changeset
    64
    
hgs
parents:
diff changeset
    65
    // -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    66
    // TAnalyzeToolGlobalTracker::~TAnalyzeToolGlobalTracker()
hgs
parents:
diff changeset
    67
    // Destructor.
hgs
parents:
diff changeset
    68
    // -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    69
    //
hgs
parents:
diff changeset
    70
    ~TAnalyzeToolGlobalTracker()
hgs
parents:
diff changeset
    71
        {
hgs
parents:
diff changeset
    72
        LOGSTR1( "ATMH TAnalyzeToolGlobalTracker::~TAnalyzeToolGlobalTracker()" );
hgs
parents:
diff changeset
    73
        
hgs
parents:
diff changeset
    74
        // We dont load dll if panic has happened (uninstallation has been done).
hgs
parents:
diff changeset
    75
        if ( iPanic )
hgs
parents:
diff changeset
    76
            {
hgs
parents:
diff changeset
    77
            LOGSTR1( "ATMH ~TAnalyzeToolGlobalTracker > Panic set not loading cleaner dll." );
hgs
parents:
diff changeset
    78
            return;
hgs
parents:
diff changeset
    79
            }
hgs
parents:
diff changeset
    80
        
hgs
parents:
diff changeset
    81
        LOGSTR1( "ATMH ~TAnalyzeToolGlobalTracker > about to load cleaner dll" );
hgs
parents:
diff changeset
    82
        // Load cleaner library and set a call back to our cleanup
hgs
parents:
diff changeset
    83
        RLibrary lib;
hgs
parents:
diff changeset
    84
        TInt error( lib.Load( KATCleanerDllName ) );
hgs
parents:
diff changeset
    85
        if ( error == KErrNone )
hgs
parents:
diff changeset
    86
            {
hgs
parents:
diff changeset
    87
            // Set address to point to ourself
hgs
parents:
diff changeset
    88
            TLibraryFunction func = lib.Lookup( KAToolCleanerOrdinal ); // Ordinal 1 of the dll
hgs
parents:
diff changeset
    89
            ATCLEANERTABLE* cleaner = (ATCLEANERTABLE*) func(); // Use function to get address
hgs
parents:
diff changeset
    90
            cleaner->At( 0 ) = (TUint32) this; // Set address
hgs
parents:
diff changeset
    91
            LOGSTR1( "ATMH ~TAnalyzeToolGlobalTracker() > cleaner dll loaded and call back set" );
hgs
parents:
diff changeset
    92
            }
hgs
parents:
diff changeset
    93
        else
hgs
parents:
diff changeset
    94
            {
hgs
parents:
diff changeset
    95
            // Error loading cleanup dll
hgs
parents:
diff changeset
    96
            LOGSTR2( "ATMH ~TAnalyzeToolGlobalTracker() > cleaner dll load error(%i) uninstalling allocator now!", 
hgs
parents:
diff changeset
    97
                    error );
hgs
parents:
diff changeset
    98
            Cleanup();
hgs
parents:
diff changeset
    99
            }
hgs
parents:
diff changeset
   100
        }
hgs
parents:
diff changeset
   101
    
hgs
parents:
diff changeset
   102
    // -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   103
    // TAnalyzeToolGlobalTracker::Cleanup()
hgs
parents:
diff changeset
   104
    // 
hgs
parents:
diff changeset
   105
    // -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   106
    //
hgs
parents:
diff changeset
   107
    void Cleanup()
hgs
parents:
diff changeset
   108
        {
hgs
parents:
diff changeset
   109
        LOGSTR1( "ATMH TAnalyzeToolGlobalTracker::Cleanup() - allocator uninstall" );
hgs
parents:
diff changeset
   110
        
hgs
parents:
diff changeset
   111
        // Uninstall allocator
hgs
parents:
diff changeset
   112
        ( (RAnalyzeToolMemoryAllocator&) User::Allocator() ).Uninstall();
hgs
parents:
diff changeset
   113
        }
hgs
parents:
diff changeset
   114
    
hgs
parents:
diff changeset
   115
    };
hgs
parents:
diff changeset
   116
hgs
parents:
diff changeset
   117
// Global variable definition.
hgs
parents:
diff changeset
   118
TAnalyzeToolGlobalTracker gGlobalTracker;
hgs
parents:
diff changeset
   119
#endif
hgs
parents:
diff changeset
   120
hgs
parents:
diff changeset
   121
// CONSTANTS
hgs
parents:
diff changeset
   122
// When needed, update the version number directly inside _LIT macro.
hgs
parents:
diff changeset
   123
// Constant for the atool API(staticlib) version.
hgs
parents:
diff changeset
   124
_LIT( KAtoolApiVersion, "1.7.5" );
hgs
parents:
diff changeset
   125
hgs
parents:
diff changeset
   126
// Version number buffer length
hgs
parents:
diff changeset
   127
const TInt KAtoolVersionNumberLength = 10;
hgs
parents:
diff changeset
   128
hgs
parents:
diff changeset
   129
// Wrong version error code
hgs
parents:
diff changeset
   130
const TInt KAtoolVersionError = -1999;
hgs
parents:
diff changeset
   131
hgs
parents:
diff changeset
   132
// Version number separator
hgs
parents:
diff changeset
   133
_LIT( KVersionSeparator, ";" );
hgs
parents:
diff changeset
   134
hgs
parents:
diff changeset
   135
// Incorrect version error strings 
hgs
parents:
diff changeset
   136
_LIT( KIncorrectText, "ERROR_OCCURED INCORRECT_ATOOL_VERSION [API v.%S][ATOOL v.%S]" );
hgs
parents:
diff changeset
   137
_LIT( KIncorrectTextTrace, "PCSS " );
hgs
parents:
diff changeset
   138
hgs
parents:
diff changeset
   139
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   140
// CustomUser::Panic()
hgs
parents:
diff changeset
   141
// Overloaded User::Panic() function
hgs
parents:
diff changeset
   142
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   143
//
hgs
parents:
diff changeset
   144
EXPORT_C void CustomUser::Panic( const TDesC& aCategory, TInt aReason )
hgs
parents:
diff changeset
   145
    {
hgs
parents:
diff changeset
   146
    LOGSTR3( "ATMH CustomUser::Panic() %S %i", &aCategory, aReason );
hgs
parents:
diff changeset
   147
    
hgs
parents:
diff changeset
   148
#ifdef USE_CLEANER_DLL
hgs
parents:
diff changeset
   149
    // Set global tracker that panic has happened.
hgs
parents:
diff changeset
   150
    gGlobalTracker.iPanic = ETrue;
hgs
parents:
diff changeset
   151
#endif
hgs
parents:
diff changeset
   152
    
hgs
parents:
diff changeset
   153
    // Uninstall thread's RAllocator
hgs
parents:
diff changeset
   154
    ( (RAnalyzeToolMemoryAllocator&) User::Allocator() ).Uninstall();
hgs
parents:
diff changeset
   155
       
hgs
parents:
diff changeset
   156
    // Call the "real" User::Panic()
hgs
parents:
diff changeset
   157
    User::Panic( aCategory, aReason );
hgs
parents:
diff changeset
   158
    }
hgs
parents:
diff changeset
   159
hgs
parents:
diff changeset
   160
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   161
// CustomUser::Exit()
hgs
parents:
diff changeset
   162
// Overloaded User::Exit() function
hgs
parents:
diff changeset
   163
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   164
//
hgs
parents:
diff changeset
   165
EXPORT_C void CustomUser::Exit( TInt aReason )
hgs
parents:
diff changeset
   166
    {
hgs
parents:
diff changeset
   167
    LOGSTR3( "ATMH CustomUser::Exit() %i %i", aReason, RThread().Id().Id() );
hgs
parents:
diff changeset
   168
    
hgs
parents:
diff changeset
   169
    if ( aReason != KAtoolVersionError )
hgs
parents:
diff changeset
   170
    	{
hgs
parents:
diff changeset
   171
#ifdef USE_CLEANER_DLL
hgs
parents:
diff changeset
   172
        // Only uninstall allocator if its not the process main/first thread.
hgs
parents:
diff changeset
   173
        LOGSTR3( "ATMH CustomUser::Exit() - Thread id: %d - Main Id: %d",
hgs
parents:
diff changeset
   174
                RThread().Id().operator TUint(), gGlobalTracker.iMainId.operator TUint() );
hgs
parents:
diff changeset
   175
        
hgs
parents:
diff changeset
   176
        if ( RThread().Id() != gGlobalTracker.iMainId )
hgs
parents:
diff changeset
   177
            {
hgs
parents:
diff changeset
   178
            LOGSTR2("ATMH CustomUser::Exit() - Calling allocator uninstall in thread: %d" , RThread().Id().operator TUint() );
hgs
parents:
diff changeset
   179
            ( (RAnalyzeToolMemoryAllocator&) User::Allocator() ).Uninstall();
hgs
parents:
diff changeset
   180
            }
hgs
parents:
diff changeset
   181
#else
hgs
parents:
diff changeset
   182
    	// Uninstall thread's RAllocator
hgs
parents:
diff changeset
   183
    	( (RAnalyzeToolMemoryAllocator&) User::Allocator() ).Uninstall();
hgs
parents:
diff changeset
   184
    	LOGSTR1( "ATMH CustomUser::Exit() - about to User::Exit" );
hgs
parents:
diff changeset
   185
#endif
hgs
parents:
diff changeset
   186
    	}
hgs
parents:
diff changeset
   187
    
hgs
parents:
diff changeset
   188
    // Call the "real" User::Exit()
hgs
parents:
diff changeset
   189
    User::Exit( aReason );
hgs
parents:
diff changeset
   190
    }
hgs
parents:
diff changeset
   191
hgs
parents:
diff changeset
   192
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   193
// CustomUser::SetCritical()
hgs
parents:
diff changeset
   194
// Overloaded User::SetCritical() function which returns
hgs
parents:
diff changeset
   195
// KErrNone, if successful; KErrArgument, if EAllThreadsCritical is 
hgs
parents:
diff changeset
   196
// passed - this is a state associated with a process, and you use 
hgs
parents:
diff changeset
   197
// User::SetProcessCritical() to set it.
hgs
parents:
diff changeset
   198
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   199
//
hgs
parents:
diff changeset
   200
EXPORT_C TInt CustomUser::SetCritical( User::TCritical aCritical )
hgs
parents:
diff changeset
   201
    {
hgs
parents:
diff changeset
   202
    LOGSTR1( "ATMH CustomUser::SetCritical()" );
hgs
parents:
diff changeset
   203
    // Check the given User::TCritical type
hgs
parents:
diff changeset
   204
    if ( aCritical == User::EAllThreadsCritical )
hgs
parents:
diff changeset
   205
        {
hgs
parents:
diff changeset
   206
        return KErrArgument;
hgs
parents:
diff changeset
   207
        }
hgs
parents:
diff changeset
   208
    else
hgs
parents:
diff changeset
   209
        {
hgs
parents:
diff changeset
   210
        return KErrNone;
hgs
parents:
diff changeset
   211
        }
hgs
parents:
diff changeset
   212
    }
hgs
parents:
diff changeset
   213
  
hgs
parents:
diff changeset
   214
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   215
// CustomUser::SetProcessCritical()
hgs
parents:
diff changeset
   216
// Overloaded User::SetProcessCritical() function
hgs
parents:
diff changeset
   217
// KErrNone, if successful; KErrArgument, if either EProcessCritical or 
hgs
parents:
diff changeset
   218
// EProcessPermanent is passed - these are states associated with a 
hgs
parents:
diff changeset
   219
// thread, and you use User::SetCritical() to set them.
hgs
parents:
diff changeset
   220
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   221
//
hgs
parents:
diff changeset
   222
EXPORT_C TInt CustomUser::SetProcessCritical( User::TCritical aCritical )
hgs
parents:
diff changeset
   223
    {
hgs
parents:
diff changeset
   224
    LOGSTR1( "ATMH CustomUser::SetProcessCritical()" );
hgs
parents:
diff changeset
   225
     // Check the given User::TCritical type 
hgs
parents:
diff changeset
   226
    if ( aCritical == User::EProcessCritical || 
hgs
parents:
diff changeset
   227
         User::EProcessPermanent == aCritical )
hgs
parents:
diff changeset
   228
        {
hgs
parents:
diff changeset
   229
        return KErrArgument;
hgs
parents:
diff changeset
   230
        }
hgs
parents:
diff changeset
   231
    else
hgs
parents:
diff changeset
   232
        {
hgs
parents:
diff changeset
   233
        return KErrNone;
hgs
parents:
diff changeset
   234
        }
hgs
parents:
diff changeset
   235
    }
hgs
parents:
diff changeset
   236
hgs
parents:
diff changeset
   237
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   238
// CustomUser::SetupThreadHeap()
hgs
parents:
diff changeset
   239
// Overloaded UserHeap::SetupThreadHeap function
hgs
parents:
diff changeset
   240
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   241
//
hgs
parents:
diff changeset
   242
EXPORT_C TInt CustomUser::SetupThreadHeap( TBool aNotFirst, 
hgs
parents:
diff changeset
   243
    SStdEpocThreadCreateInfo& aInfo, const TFileName& aFileName,
hgs
parents:
diff changeset
   244
    TUint32 aLogOption, TUint32 aIsDebug, const TATVersion& aVersion,
hgs
parents:
diff changeset
   245
    TUint32 aAllocCallStackSize, TUint32 aFreeCallStackSize,
hgs
parents:
diff changeset
   246
    TRefByValue<const TDesC> aFmt, ... )
hgs
parents:
diff changeset
   247
    {
hgs
parents:
diff changeset
   248
    LOGSTR1( "ATMH CustomUser::SetupThreadHeap()" );
hgs
parents:
diff changeset
   249
    LOGSTR2( "ATMH > Thread id(%d)", RThread().Id().operator TUint() );
hgs
parents:
diff changeset
   250
    
hgs
parents:
diff changeset
   251
    // Add handling of the argument list here.
hgs
parents:
diff changeset
   252
        
hgs
parents:
diff changeset
   253
    TInt ret( KErrNone );    
hgs
parents:
diff changeset
   254
    // Check version number
hgs
parents:
diff changeset
   255
    TBuf<KAtoolVersionNumberLength> atoolVer;
hgs
parents:
diff changeset
   256
    if ( CheckVersion( aVersion, atoolVer ) != KErrNone )
hgs
parents:
diff changeset
   257
    	{
hgs
parents:
diff changeset
   258
    	LOGSTR1( "ATMH > Wrong API version > Inform user and Exit." );
hgs
parents:
diff changeset
   259
    	ReportIncorrectVersion( aLogOption, aFileName, atoolVer );
hgs
parents:
diff changeset
   260
    	return KAtoolVersionError;
hgs
parents:
diff changeset
   261
    	}
hgs
parents:
diff changeset
   262
    
hgs
parents:
diff changeset
   263
    // Check is this shared heap
hgs
parents:
diff changeset
   264
    if ( aInfo.iAllocator == NULL )
hgs
parents:
diff changeset
   265
        {
hgs
parents:
diff changeset
   266
        LOGSTR1( "ATMH creating a new heap" );
hgs
parents:
diff changeset
   267
        // RAllocator is NULL so heap is not shared, creating a new heap
hgs
parents:
diff changeset
   268
        ret = UserHeap::SetupThreadHeap( aNotFirst, aInfo );
hgs
parents:
diff changeset
   269
        __ASSERT_ALWAYS( KErrNone == ret, AssertPanic( EFailedToCreateHeap ) );
hgs
parents:
diff changeset
   270
        
hgs
parents:
diff changeset
   271
#if ( SYMBIAN_VERSION_SUPPORT >= SYMBIAN_3 )
hgs
parents:
diff changeset
   272
    #ifndef __WINS__
hgs
parents:
diff changeset
   273
        // Set dummy Tls value
hgs
parents:
diff changeset
   274
        TAny* dummyPtr( NULL );
hgs
parents:
diff changeset
   275
        TInt setErr( UserSvr::DllSetTls( KDummyHandle, dummyPtr ) );
hgs
parents:
diff changeset
   276
        LOGSTR2( "ATMH > Set Tls err(%i)", setErr );
hgs
parents:
diff changeset
   277
    #endif
hgs
parents:
diff changeset
   278
#endif
hgs
parents:
diff changeset
   279
        // Install the RAllocator
hgs
parents:
diff changeset
   280
        aInfo.iAllocator = &InstallAllocator( aNotFirst, aFileName, aLogOption, aIsDebug,
hgs
parents:
diff changeset
   281
                aAllocCallStackSize, aFreeCallStackSize );
hgs
parents:
diff changeset
   282
        }
hgs
parents:
diff changeset
   283
    else
hgs
parents:
diff changeset
   284
        {
hgs
parents:
diff changeset
   285
        LOGSTR1( "ATMH sharing the heap" );
hgs
parents:
diff changeset
   286
        // The heap is shared. Acquire pointer to the original heap
hgs
parents:
diff changeset
   287
        RAnalyzeToolMemoryAllocator* allocator = 
hgs
parents:
diff changeset
   288
			(RAnalyzeToolMemoryAllocator*) aInfo.iAllocator;
hgs
parents:
diff changeset
   289
        // Share the heap
hgs
parents:
diff changeset
   290
        allocator->ShareHeap();
hgs
parents:
diff changeset
   291
        // Switch thread heap 
hgs
parents:
diff changeset
   292
        User::SwitchAllocator( allocator );
hgs
parents:
diff changeset
   293
        }
hgs
parents:
diff changeset
   294
    return ret;
hgs
parents:
diff changeset
   295
    }
hgs
parents:
diff changeset
   296
hgs
parents:
diff changeset
   297
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   298
// CustomUser::InstallAllocator
hgs
parents:
diff changeset
   299
// Installs the RAllocator
hgs
parents:
diff changeset
   300
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   301
//
hgs
parents:
diff changeset
   302
//lint -e{429} suppress "Custodial pointer 'allocator' has not been freed or returned"
hgs
parents:
diff changeset
   303
EXPORT_C RAllocator& CustomUser::InstallAllocator( TBool aNotFirst, 
hgs
parents:
diff changeset
   304
	const TFileName& aFileName, TUint32 aLogOption, TUint32 aIsDebug,
hgs
parents:
diff changeset
   305
	TUint32 aAllocCallStackSize, TUint32 aFreeCallStackSize )
hgs
parents:
diff changeset
   306
    {
hgs
parents:
diff changeset
   307
    LOGSTR1( "ATMH CustomUser::InstallAllocator()" );
hgs
parents:
diff changeset
   308
    
hgs
parents:
diff changeset
   309
    // Open handle to the device driver
hgs
parents:
diff changeset
   310
    RAnalyzeTool analyzetool;
hgs
parents:
diff changeset
   311
    TInt error = analyzetool.Open();
hgs
parents:
diff changeset
   312
    
hgs
parents:
diff changeset
   313
    // Check if the device driver has already loaded
hgs
parents:
diff changeset
   314
    if ( KErrNone == error )
hgs
parents:
diff changeset
   315
        {
hgs
parents:
diff changeset
   316
        LOGSTR1( "ATMH CustomUser::InstallAllocator() - analyzetool.Open() returned KErrNone" );
hgs
parents:
diff changeset
   317
        // The device driver has already loaded
hgs
parents:
diff changeset
   318
        // Get pointer to the main thread allocator
hgs
parents:
diff changeset
   319
        TMainThreadParamsBuf params;
hgs
parents:
diff changeset
   320
        params().iProcessId = RProcess().Id().operator TUint();
hgs
parents:
diff changeset
   321
        error = analyzetool.MainThreadAlloctor( params );
hgs
parents:
diff changeset
   322
hgs
parents:
diff changeset
   323
        __ASSERT_ALWAYS( KErrNone == error, AssertPanic( ECantOpenHandle ) );
hgs
parents:
diff changeset
   324
        
hgs
parents:
diff changeset
   325
        // Close handle to the device driver
hgs
parents:
diff changeset
   326
        analyzetool.Close();
hgs
parents:
diff changeset
   327
        
hgs
parents:
diff changeset
   328
        // Is this the first thread of the program
hgs
parents:
diff changeset
   329
        if ( params().iAlone )
hgs
parents:
diff changeset
   330
            {
hgs
parents:
diff changeset
   331
            LOGSTR1( "ATMH CustomUser::InstallAllocator() - first thread of the program" );
hgs
parents:
diff changeset
   332
            // Only one thread in the program. Must be main thread
hgs
parents:
diff changeset
   333
            RAnalyzeToolMainAllocator* allocator = 
hgs
parents:
diff changeset
   334
				new RAnalyzeToolMainAllocator( aNotFirst, aFileName, aLogOption,
hgs
parents:
diff changeset
   335
				                               aIsDebug, aAllocCallStackSize, aFreeCallStackSize );
hgs
parents:
diff changeset
   336
            
hgs
parents:
diff changeset
   337
            __ASSERT_ALWAYS( allocator != NULL, AssertPanic( ENoMemory ) );
hgs
parents:
diff changeset
   338
            
hgs
parents:
diff changeset
   339
            // Change threads allocator
hgs
parents:
diff changeset
   340
            User::SwitchAllocator( allocator );
hgs
parents:
diff changeset
   341
            
hgs
parents:
diff changeset
   342
            // Return reference to the RAllocator
hgs
parents:
diff changeset
   343
            return *allocator;
hgs
parents:
diff changeset
   344
            }
hgs
parents:
diff changeset
   345
        // This is not the first thread. A new thread with a new heap created
hgs
parents:
diff changeset
   346
        else
hgs
parents:
diff changeset
   347
            {
hgs
parents:
diff changeset
   348
            LOGSTR1( "ATMH CustomUser::InstallAllocator() - create a new allocator for the new thread" );
hgs
parents:
diff changeset
   349
            // Create new RAllocator with handles from the main thread
hgs
parents:
diff changeset
   350
            RAnalyzeToolAllocator* allocator = new RAnalyzeToolAllocator( 
hgs
parents:
diff changeset
   351
                    aNotFirst,
hgs
parents:
diff changeset
   352
                    ((RAnalyzeToolMainAllocator*)params().iAllocator)->StorageServer(), 
hgs
parents:
diff changeset
   353
                    ((RAnalyzeToolMainAllocator*)params().iAllocator)->Codeblocks(), 
hgs
parents:
diff changeset
   354
                    ((RAnalyzeToolMainAllocator*)params().iAllocator)->Mutex(), 
hgs
parents:
diff changeset
   355
                    ((RAnalyzeToolMainAllocator*)params().iAllocator)->ProcessId(), 
hgs
parents:
diff changeset
   356
                    ((RAnalyzeToolMainAllocator*)params().iAllocator)->AnalyzeTool(),
hgs
parents:
diff changeset
   357
                    ((RAnalyzeToolMainAllocator*)params().iAllocator)->StorageServerOpen(),
hgs
parents:
diff changeset
   358
                    ((RAnalyzeToolMainAllocator*)params().iAllocator)->LogOption(),
hgs
parents:
diff changeset
   359
                    ((RAnalyzeToolMainAllocator*)params().iAllocator)->AllocMaxCallStack(),
hgs
parents:
diff changeset
   360
                    ((RAnalyzeToolMainAllocator*)params().iAllocator)->FreeMaxCallStack() );
hgs
parents:
diff changeset
   361
hgs
parents:
diff changeset
   362
            __ASSERT_ALWAYS( allocator != NULL, AssertPanic( ENoMemory ) );
hgs
parents:
diff changeset
   363
            
hgs
parents:
diff changeset
   364
            // Change threads allocator
hgs
parents:
diff changeset
   365
            User::SwitchAllocator( allocator );
hgs
parents:
diff changeset
   366
            
hgs
parents:
diff changeset
   367
            // Return reference to the RAllocator
hgs
parents:
diff changeset
   368
            return *allocator;
hgs
parents:
diff changeset
   369
            }
hgs
parents:
diff changeset
   370
        }
hgs
parents:
diff changeset
   371
    // The device driver does not exists so this must be the first thread
hgs
parents:
diff changeset
   372
    else
hgs
parents:
diff changeset
   373
        {
hgs
parents:
diff changeset
   374
        LOGSTR1( "ATMH CustomUser::InstallAllocator() - analyzetool.Open() returned error, creating DD" );
hgs
parents:
diff changeset
   375
        RAnalyzeToolMainAllocator* allocator = 
hgs
parents:
diff changeset
   376
			new RAnalyzeToolMainAllocator( aNotFirst, aFileName, aLogOption, aIsDebug,
hgs
parents:
diff changeset
   377
			        aAllocCallStackSize, aFreeCallStackSize );
hgs
parents:
diff changeset
   378
        
hgs
parents:
diff changeset
   379
        __ASSERT_ALWAYS( allocator != NULL, AssertPanic( ENoMemory ) );
hgs
parents:
diff changeset
   380
        
hgs
parents:
diff changeset
   381
        // Change threads allocator
hgs
parents:
diff changeset
   382
        User::SwitchAllocator( allocator );
hgs
parents:
diff changeset
   383
hgs
parents:
diff changeset
   384
        // Return reference to the RAllocator
hgs
parents:
diff changeset
   385
        return *allocator;
hgs
parents:
diff changeset
   386
        }
hgs
parents:
diff changeset
   387
    } 
hgs
parents:
diff changeset
   388
    
hgs
parents:
diff changeset
   389
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   390
// CustomUser::CheckVersion
hgs
parents:
diff changeset
   391
// Check atool version
hgs
parents:
diff changeset
   392
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   393
//
hgs
parents:
diff changeset
   394
TInt CustomUser::CheckVersion( const TATVersion& aVersion, TDes& aToolVersion )
hgs
parents:
diff changeset
   395
    { 
hgs
parents:
diff changeset
   396
    LOGSTR2( "ATMH CustomUser::CheckVersion(), aVersion( %S )", &aVersion );
hgs
parents:
diff changeset
   397
    
hgs
parents:
diff changeset
   398
    TFileName version;
hgs
parents:
diff changeset
   399
    version.Copy( aVersion );
hgs
parents:
diff changeset
   400
    TBuf<KAtoolVersionNumberLength> apiVer;
hgs
parents:
diff changeset
   401
    	
hgs
parents:
diff changeset
   402
    // Find separator place
hgs
parents:
diff changeset
   403
    TInt findplace( version.Find( KVersionSeparator() ) );
hgs
parents:
diff changeset
   404
    // Parse API version first [x.x.x;x.x.x]
hgs
parents:
diff changeset
   405
    if ( findplace >= 0 && findplace <= apiVer.MaxLength() )
hgs
parents:
diff changeset
   406
		{
hgs
parents:
diff changeset
   407
		apiVer.Copy( version.Mid( 0, findplace ) ); 
hgs
parents:
diff changeset
   408
		version.Delete( 0, findplace + KVersionSeparator().Length() );
hgs
parents:
diff changeset
   409
		}
hgs
parents:
diff changeset
   410
 
hgs
parents:
diff changeset
   411
    if ( version.Length() <= aToolVersion.MaxLength() )
hgs
parents:
diff changeset
   412
    	{
hgs
parents:
diff changeset
   413
    	aToolVersion.Copy( version );
hgs
parents:
diff changeset
   414
    	if ( aToolVersion.Compare( KAtoolApiVersion ) == KErrNone &&
hgs
parents:
diff changeset
   415
    		 apiVer.Length() == 0 )
hgs
parents:
diff changeset
   416
    		{
hgs
parents:
diff changeset
   417
    		// Support 1.5.0 version (Version info: [1.5.0])
hgs
parents:
diff changeset
   418
    		apiVer.Copy( version );
hgs
parents:
diff changeset
   419
    		}
hgs
parents:
diff changeset
   420
    	}
hgs
parents:
diff changeset
   421
    
hgs
parents:
diff changeset
   422
    LOGSTR3( "ATMH > API version( %S ), ATOOL version( %S )", 
hgs
parents:
diff changeset
   423
    		&apiVer, &aToolVersion );
hgs
parents:
diff changeset
   424
        
hgs
parents:
diff changeset
   425
    // Check version numbers 
hgs
parents:
diff changeset
   426
    if ( apiVer.Compare( KAtoolApiVersion ) == KErrNone )
hgs
parents:
diff changeset
   427
    	{
hgs
parents:
diff changeset
   428
    	return KErrNone;
hgs
parents:
diff changeset
   429
    	}
hgs
parents:
diff changeset
   430
    return KErrCancel;    
hgs
parents:
diff changeset
   431
    }
hgs
parents:
diff changeset
   432
hgs
parents:
diff changeset
   433
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   434
// CustomUser::ReportIncorrectVersion
hgs
parents:
diff changeset
   435
// Function for showing incorrect version information
hgs
parents:
diff changeset
   436
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   437
//
hgs
parents:
diff changeset
   438
void CustomUser::ReportIncorrectVersion( const TUint32 aLogOption,
hgs
parents:
diff changeset
   439
	const TFileName& aFileName, const TDes& aToolVersion )
hgs
parents:
diff changeset
   440
	{
hgs
parents:
diff changeset
   441
	LOGSTR2( "ATMH CustomUser::ReportIncorrectVersion(), aFileName( %S )", 
hgs
parents:
diff changeset
   442
			&aFileName );
hgs
parents:
diff changeset
   443
	
hgs
parents:
diff changeset
   444
	switch ( aLogOption )
hgs
parents:
diff changeset
   445
		{
hgs
parents:
diff changeset
   446
		case EATLogToFile:
hgs
parents:
diff changeset
   447
			{
hgs
parents:
diff changeset
   448
			LOGSTR1( "ATMH ReportIncorrectVersion > EATLogToFile" );			
hgs
parents:
diff changeset
   449
			
hgs
parents:
diff changeset
   450
			// A handle to a file server session.
hgs
parents:
diff changeset
   451
			RFs fs;
hgs
parents:
diff changeset
   452
			// Creates and opens a file, 
hgs
parents:
diff changeset
   453
			// and performs all operations on a single open file.
hgs
parents:
diff changeset
   454
			RFile file;	
hgs
parents:
diff changeset
   455
			// Create full path buffer
hgs
parents:
diff changeset
   456
			TBuf<KMaxFileName> logFileBuf;
hgs
parents:
diff changeset
   457
			// Connects a client to the file server.
hgs
parents:
diff changeset
   458
			TInt err( fs.Connect() );
hgs
parents:
diff changeset
   459
			
hgs
parents:
diff changeset
   460
			if ( !err )
hgs
parents:
diff changeset
   461
				{				
hgs
parents:
diff changeset
   462
                err = TATDriveInfo::CreatePath( logFileBuf, aFileName, fs );
hgs
parents:
diff changeset
   463
			    
hgs
parents:
diff changeset
   464
				// Replace file if exists
hgs
parents:
diff changeset
   465
				if ( err && err != KErrAlreadyExists )
hgs
parents:
diff changeset
   466
					{
hgs
parents:
diff changeset
   467
					LOGSTR2( "ATMH > TATDriveInfo::CreatePath() err( %i )", err );
hgs
parents:
diff changeset
   468
					return;
hgs
parents:
diff changeset
   469
					}
hgs
parents:
diff changeset
   470
				
hgs
parents:
diff changeset
   471
				// Replace file if exists (drive C)
hgs
parents:
diff changeset
   472
				err = file.Replace( fs, logFileBuf, EFileWrite );
hgs
parents:
diff changeset
   473
										
hgs
parents:
diff changeset
   474
				// Write to file
hgs
parents:
diff changeset
   475
				if ( !err )
hgs
parents:
diff changeset
   476
					{
hgs
parents:
diff changeset
   477
					err = file.Write( KDataFileVersion );
hgs
parents:
diff changeset
   478
					// Error msg buffer
hgs
parents:
diff changeset
   479
					TBuf8<KMaxFileName> msg;				     
hgs
parents:
diff changeset
   480
					// Write the error code to the buffer  
hgs
parents:
diff changeset
   481
					logFileBuf.Format( KIncorrectText, &KAtoolApiVersion, &aToolVersion );	
hgs
parents:
diff changeset
   482
					CnvUtfConverter::ConvertFromUnicodeToUtf8( msg, logFileBuf );
hgs
parents:
diff changeset
   483
					err = file.Write( msg );
hgs
parents:
diff changeset
   484
					}
hgs
parents:
diff changeset
   485
				// Closes the file.
hgs
parents:
diff changeset
   486
				file.Close();
hgs
parents:
diff changeset
   487
				}
hgs
parents:
diff changeset
   488
			
hgs
parents:
diff changeset
   489
			LOGSTR2( "ATMH > File err( %i )", err );			
hgs
parents:
diff changeset
   490
			// Closes the handle.
hgs
parents:
diff changeset
   491
			fs.Close();
hgs
parents:
diff changeset
   492
			}
hgs
parents:
diff changeset
   493
			break;
hgs
parents:
diff changeset
   494
			
hgs
parents:
diff changeset
   495
		case EATUseDefault:
hgs
parents:
diff changeset
   496
		case EATLogToTrace:
hgs
parents:
diff changeset
   497
			{
hgs
parents:
diff changeset
   498
			LOGSTR1( "ATMH > ReportIncorrectVersion > EATLogToTrace" );
hgs
parents:
diff changeset
   499
			// Error msg buffer
hgs
parents:
diff changeset
   500
			TBuf<KMaxFileName> msg;	
hgs
parents:
diff changeset
   501
			msg.Copy( KIncorrectTextTrace );
hgs
parents:
diff changeset
   502
			msg.Append( KIncorrectText );
hgs
parents:
diff changeset
   503
			TBuf<KMaxFileName> traceMsg;	
hgs
parents:
diff changeset
   504
			// Write the error code to the buffer  
hgs
parents:
diff changeset
   505
			traceMsg.Format( msg, &KAtoolApiVersion, &aToolVersion );
hgs
parents:
diff changeset
   506
			RDebug::Print( traceMsg );
hgs
parents:
diff changeset
   507
			}
hgs
parents:
diff changeset
   508
			break;
hgs
parents:
diff changeset
   509
		
hgs
parents:
diff changeset
   510
		default:
hgs
parents:
diff changeset
   511
			{
hgs
parents:
diff changeset
   512
			LOGSTR1( "ATMH > ReportIncorrectVersion > default" );
hgs
parents:
diff changeset
   513
			}
hgs
parents:
diff changeset
   514
			break;
hgs
parents:
diff changeset
   515
		}	
hgs
parents:
diff changeset
   516
	}
hgs
parents:
diff changeset
   517
hgs
parents:
diff changeset
   518
// End of File