perfapps/perfmon/engine/src/perfmon_engine.cpp
author hgs
Fri, 17 Sep 2010 14:22:55 +0300
changeset 52 36d60d12b4af
parent 51 b048e15729d6
child 53 819e59dfc032
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
// INCLUDE FILES
hgs
parents:
diff changeset
    18
#include "perfmon_engine.h"
hgs
parents:
diff changeset
    19
#include "perfmon_powerlistener.h"
hgs
parents:
diff changeset
    20
#include <coeutils.h>
hgs
parents:
diff changeset
    21
#include <bautils.h>
hgs
parents:
diff changeset
    22
#include <eikenv.h>
hgs
parents:
diff changeset
    23
#include <e32hal.h>
hgs
parents:
diff changeset
    24
#include <u32std.h>
hgs
parents:
diff changeset
    25
#include <s32file.h>
hgs
parents:
diff changeset
    26
#include <akntitle.h> 
hgs
parents:
diff changeset
    27
#include <eikspane.h>
hgs
parents:
diff changeset
    28
#include <aknnotewrappers.h>
hgs
parents:
diff changeset
    29
_LIT(KDefaultLogFilePath, "c:\\data\\PerfMon.log");
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
const TInt KCalibrationLength = 2;
hgs
parents:
diff changeset
    32
const TInt KMinimumSamplesLength = 16;
hgs
parents:
diff changeset
    33
const TInt KCPUTimeMultiplier = 1000000; // used to avoid TReal conversions
hgs
parents:
diff changeset
    34
hgs
parents:
diff changeset
    35
const TInt KSettingsDrive = EDriveC;
hgs
parents:
diff changeset
    36
_LIT(KSettingsFileName, "perfmon_settings.ini");
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
    39
hgs
parents:
diff changeset
    40
TInt CPULoadCount(TAny* aPtr)
hgs
parents:
diff changeset
    41
    {
hgs
parents:
diff changeset
    42
    TPerfMonNOPCounter& atts = *((TPerfMonNOPCounter*) aPtr);
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
    // increase the counter
hgs
parents:
diff changeset
    45
    atts.iCounterValue++;
hgs
parents:
diff changeset
    46
    return 1;
hgs
parents:
diff changeset
    47
    }
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
TInt CPULoadNOPThread(TAny* aPtr)
hgs
parents:
diff changeset
    50
    {
hgs
parents:
diff changeset
    51
    // set the thread running in correct CPU
hgs
parents:
diff changeset
    52
    TPerfMonNOPCounter& atts = *((TPerfMonNOPCounter*) aPtr);
hgs
parents:
diff changeset
    53
    
hgs
parents:
diff changeset
    54
    if (atts.iAmountOfCPUs > 1)
hgs
parents:
diff changeset
    55
        {
hgs
parents:
diff changeset
    56
        // request via HAL that the current thread will run in CPU defined in atts.iCPUNumber
hgs
parents:
diff changeset
    57
        TInt err = UserSvr::HalFunction(EHalGroupKernel, 19 /*EKernelHalLockThreadToCpu*/, (TAny*) atts.iCPUNumber, 0);
hgs
parents:
diff changeset
    58
hgs
parents:
diff changeset
    59
        if (err != KErrNone)
hgs
parents:
diff changeset
    60
            {
hgs
parents:
diff changeset
    61
            // error, stop this thread
hgs
parents:
diff changeset
    62
            return err;
hgs
parents:
diff changeset
    63
            }
hgs
parents:
diff changeset
    64
        }
hgs
parents:
diff changeset
    65
hgs
parents:
diff changeset
    66
    // init trap clean and install active scheduler
hgs
parents:
diff changeset
    67
    CTrapCleanup* pC = CTrapCleanup::New();
hgs
parents:
diff changeset
    68
    CActiveScheduler* pS = new CActiveScheduler;
hgs
parents:
diff changeset
    69
    CActiveScheduler::Install(pS);
hgs
parents:
diff changeset
    70
hgs
parents:
diff changeset
    71
    // call the counter to simulate polling the null thread for cpu time
hgs
parents:
diff changeset
    72
    CIdle* idle = CIdle::NewL(CActive::EPriorityStandard);
hgs
parents:
diff changeset
    73
    TCallBack cb(CPULoadCount, aPtr);
hgs
parents:
diff changeset
    74
    idle->Start(cb);
hgs
parents:
diff changeset
    75
hgs
parents:
diff changeset
    76
    pS->Start();
hgs
parents:
diff changeset
    77
hgs
parents:
diff changeset
    78
    delete idle;
hgs
parents:
diff changeset
    79
    delete pS;
hgs
parents:
diff changeset
    80
    delete pC;
hgs
parents:
diff changeset
    81
hgs
parents:
diff changeset
    82
    return KErrNone;
hgs
parents:
diff changeset
    83
    }
hgs
parents:
diff changeset
    84
hgs
parents:
diff changeset
    85
// ===================================== MEMBER FUNCTIONS =====================================
hgs
parents:
diff changeset
    86
hgs
parents:
diff changeset
    87
CPerfMonEngine::CPerfMonEngine() :
hgs
parents:
diff changeset
    88
    CActive(EPriorityUserInput),
hgs
parents:
diff changeset
    89
    iPowerClient(0)
hgs
parents:
diff changeset
    90
    {
hgs
parents:
diff changeset
    91
    }
hgs
parents:
diff changeset
    92
hgs
parents:
diff changeset
    93
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
    94
hgs
parents:
diff changeset
    95
void CPerfMonEngine::ConstructL()
hgs
parents:
diff changeset
    96
    {
hgs
parents:
diff changeset
    97
    iCurrentCPUMode = ECPUModeNotSet;
hgs
parents:
diff changeset
    98
    iLogFileInitialized = EFalse;
hgs
parents:
diff changeset
    99
    iAmountOfCPUs = 1;
hgs
parents:
diff changeset
   100
hgs
parents:
diff changeset
   101
    iEnv = CEikonEnv::Static();
hgs
parents:
diff changeset
   102
    User::LeaveIfError(iLs.Connect());
hgs
parents:
diff changeset
   103
hgs
parents:
diff changeset
   104
    User::LeaveIfError(iTimer.CreateLocal());
hgs
parents:
diff changeset
   105
    CActiveScheduler::Add(this);
hgs
parents:
diff changeset
   106
    }
hgs
parents:
diff changeset
   107
hgs
parents:
diff changeset
   108
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
   109
hgs
parents:
diff changeset
   110
void CPerfMonEngine::ActivateEngineL()
hgs
parents:
diff changeset
   111
    {
hgs
parents:
diff changeset
   112
    // load settings
hgs
parents:
diff changeset
   113
    TRAP_IGNORE(LoadSettingsL());
hgs
parents:
diff changeset
   114
hgs
parents:
diff changeset
   115
    // create data storages for the samples
hgs
parents:
diff changeset
   116
    CreateSamplesDataArrayL();
hgs
parents:
diff changeset
   117
hgs
parents:
diff changeset
   118
    // set default modes
hgs
parents:
diff changeset
   119
    HandleSettingsChangeL();
hgs
parents:
diff changeset
   120
hgs
parents:
diff changeset
   121
    // start sampling data immediately (jump to RunL)    
hgs
parents:
diff changeset
   122
    iTimer.After(iStatus, 100);
hgs
parents:
diff changeset
   123
    SetActive();
hgs
parents:
diff changeset
   124
    }
hgs
parents:
diff changeset
   125
hgs
parents:
diff changeset
   126
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
   127
hgs
parents:
diff changeset
   128
void CPerfMonEngine::DeActivateEngineL()
hgs
parents:
diff changeset
   129
    {
hgs
parents:
diff changeset
   130
    Cancel();
hgs
parents:
diff changeset
   131
hgs
parents:
diff changeset
   132
    DeActivatePowerMonitoring();
hgs
parents:
diff changeset
   133
    DeActivateCPUMonitoring();
hgs
parents:
diff changeset
   134
hgs
parents:
diff changeset
   135
    // close log file
hgs
parents:
diff changeset
   136
    OpenLogFile(EFalse);
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
CPerfMonEngine::~CPerfMonEngine()
hgs
parents:
diff changeset
   142
    {
hgs
parents:
diff changeset
   143
    DeActivatePowerMonitoring();
hgs
parents:
diff changeset
   144
hgs
parents:
diff changeset
   145
    if (iPowerClient)
hgs
parents:
diff changeset
   146
        {
hgs
parents:
diff changeset
   147
        delete iPowerClient;
hgs
parents:
diff changeset
   148
        iPowerClient = 0;
hgs
parents:
diff changeset
   149
        }
hgs
parents:
diff changeset
   150
hgs
parents:
diff changeset
   151
    iTimer.Close();
hgs
parents:
diff changeset
   152
hgs
parents:
diff changeset
   153
    // clear data storages
hgs
parents:
diff changeset
   154
    if (iSampleEntryArray)
hgs
parents:
diff changeset
   155
        {
hgs
parents:
diff changeset
   156
        for (TInt i = 0; i < iSampleEntryArray->Count(); i++)
hgs
parents:
diff changeset
   157
            {
hgs
parents:
diff changeset
   158
            delete iSampleEntryArray->At(i).iSampleDataArray;
hgs
parents:
diff changeset
   159
            }
hgs
parents:
diff changeset
   160
hgs
parents:
diff changeset
   161
        delete iSampleEntryArray;
hgs
parents:
diff changeset
   162
        }
hgs
parents:
diff changeset
   163
hgs
parents:
diff changeset
   164
    iLs.Close();
hgs
parents:
diff changeset
   165
    }
hgs
parents:
diff changeset
   166
hgs
parents:
diff changeset
   167
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
   168
hgs
parents:
diff changeset
   169
void CPerfMonEngine::DoCancel()
hgs
parents:
diff changeset
   170
    {
hgs
parents:
diff changeset
   171
    iTimer.Cancel();
hgs
parents:
diff changeset
   172
    }
hgs
parents:
diff changeset
   173
hgs
parents:
diff changeset
   174
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
   175
hgs
parents:
diff changeset
   176
void CPerfMonEngine::RunL()
hgs
parents:
diff changeset
   177
    {
hgs
parents:
diff changeset
   178
    // calculate new values 
hgs
parents:
diff changeset
   179
    UpdateSamplesDataL();
hgs
parents:
diff changeset
   180
hgs
parents:
diff changeset
   181
    // log changes
hgs
parents:
diff changeset
   182
    AppendLatestSamplesToLogsL();
hgs
parents:
diff changeset
   183
hgs
parents:
diff changeset
   184
    // redraw views
hgs
parents:
diff changeset
   185
    SendDrawEventToContainersL();
hgs
parents:
diff changeset
   186
hgs
parents:
diff changeset
   187
    // continue
hgs
parents:
diff changeset
   188
    iTimer.After(iStatus, iSettings.iHeartBeat * 1000); // convert from milliseconds to microseconds
hgs
parents:
diff changeset
   189
    SetActive();
hgs
parents:
diff changeset
   190
    }
hgs
parents:
diff changeset
   191
hgs
parents:
diff changeset
   192
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
   193
hgs
parents:
diff changeset
   194
void CPerfMonEngine::HandleSettingsChangeL()
hgs
parents:
diff changeset
   195
    {
hgs
parents:
diff changeset
   196
    // set priority of the thread
hgs
parents:
diff changeset
   197
    RThread().SetPriority(SettingItemToThreadPriority(iSettings.iPriority));
hgs
parents:
diff changeset
   198
hgs
parents:
diff changeset
   199
    // init cpu monitor if setting has been changed
hgs
parents:
diff changeset
   200
    if (iCurrentCPUMode != iSettings.iCPUMode)
hgs
parents:
diff changeset
   201
        {
hgs
parents:
diff changeset
   202
        DeActivateCPUMonitoring();
hgs
parents:
diff changeset
   203
        ActivateCPUMonitoringL();
hgs
parents:
diff changeset
   204
        }
hgs
parents:
diff changeset
   205
hgs
parents:
diff changeset
   206
    // Check for power setting changes every time
hgs
parents:
diff changeset
   207
    if (iSettings.iPowerMonitoringEnabled)
hgs
parents:
diff changeset
   208
        {
hgs
parents:
diff changeset
   209
        ActivatePowerMonitoringL();
hgs
parents:
diff changeset
   210
        }
hgs
parents:
diff changeset
   211
    else
hgs
parents:
diff changeset
   212
        {
hgs
parents:
diff changeset
   213
        DeActivatePowerMonitoring();
hgs
parents:
diff changeset
   214
        }
hgs
parents:
diff changeset
   215
hgs
parents:
diff changeset
   216
    // close log file
hgs
parents:
diff changeset
   217
    OpenLogFile(EFalse);
hgs
parents:
diff changeset
   218
hgs
parents:
diff changeset
   219
    // enable log file
hgs
parents:
diff changeset
   220
    if (iSettings.iLoggingEnabled && (iSettings.iLoggingMode
hgs
parents:
diff changeset
   221
            == ELoggingModeLogFile || iSettings.iLoggingMode
hgs
parents:
diff changeset
   222
            == ELoggingModeRDebugLogFile))
hgs
parents:
diff changeset
   223
        OpenLogFile(ETrue);
hgs
parents:
diff changeset
   224
    }
hgs
parents:
diff changeset
   225
hgs
parents:
diff changeset
   226
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
   227
hgs
parents:
diff changeset
   228
void CPerfMonEngine::EnableLogging(TBool aEnable)
hgs
parents:
diff changeset
   229
    {
hgs
parents:
diff changeset
   230
    if (aEnable)
hgs
parents:
diff changeset
   231
        {
hgs
parents:
diff changeset
   232
        if (iSettings.iLoggingMode == ELoggingModeLogFile
hgs
parents:
diff changeset
   233
                || iSettings.iLoggingMode == ELoggingModeRDebugLogFile)
hgs
parents:
diff changeset
   234
            OpenLogFile(ETrue);
hgs
parents:
diff changeset
   235
hgs
parents:
diff changeset
   236
        iSettings.iLoggingEnabled = ETrue;
hgs
parents:
diff changeset
   237
        }
hgs
parents:
diff changeset
   238
    else // disable
hgs
parents:
diff changeset
   239
        {
hgs
parents:
diff changeset
   240
        iSettings.iLoggingEnabled = EFalse;
hgs
parents:
diff changeset
   241
        OpenLogFile(EFalse);
hgs
parents:
diff changeset
   242
        }
hgs
parents:
diff changeset
   243
    }
hgs
parents:
diff changeset
   244
hgs
parents:
diff changeset
   245
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
   246
hgs
parents:
diff changeset
   247
void CPerfMonEngine::OpenLogFile(TBool aOpen)
hgs
parents:
diff changeset
   248
    {
hgs
parents:
diff changeset
   249
    // open log file for writing
hgs
parents:
diff changeset
   250
    if (aOpen)
hgs
parents:
diff changeset
   251
        {
hgs
parents:
diff changeset
   252
        if (!iLogFileInitialized)
hgs
parents:
diff changeset
   253
            {
hgs
parents:
diff changeset
   254
            TInt err(KErrNone);
hgs
parents:
diff changeset
   255
hgs
parents:
diff changeset
   256
            // open the log file for writing
hgs
parents:
diff changeset
   257
            if (iLogFile.Open(iEnv->FsSession(), iSettings.iLoggingFilePath,
hgs
parents:
diff changeset
   258
                    EFileWrite) != KErrNone)
hgs
parents:
diff changeset
   259
                {
hgs
parents:
diff changeset
   260
                iEnv->FsSession().MkDirAll(iSettings.iLoggingFilePath);
hgs
parents:
diff changeset
   261
                err = iLogFile.Replace(iEnv->FsSession(),
hgs
parents:
diff changeset
   262
                        iSettings.iLoggingFilePath, EFileWrite);
hgs
parents:
diff changeset
   263
                }
hgs
parents:
diff changeset
   264
            else
hgs
parents:
diff changeset
   265
                {
hgs
parents:
diff changeset
   266
                // file opens correctly, seek to the end
hgs
parents:
diff changeset
   267
                TInt fileSize = 0;
hgs
parents:
diff changeset
   268
                iLogFile.Size(fileSize);
hgs
parents:
diff changeset
   269
                err = iLogFile.Seek(ESeekCurrent, fileSize);
hgs
parents:
diff changeset
   270
                }
hgs
parents:
diff changeset
   271
hgs
parents:
diff changeset
   272
            if (err == KErrNone)
hgs
parents:
diff changeset
   273
                {
hgs
parents:
diff changeset
   274
                iLogFileInitialized = ETrue;
hgs
parents:
diff changeset
   275
                }
hgs
parents:
diff changeset
   276
            else
hgs
parents:
diff changeset
   277
                {
hgs
parents:
diff changeset
   278
                // show error
hgs
parents:
diff changeset
   279
                CAknErrorNote* note = new (ELeave) CAknErrorNote();
hgs
parents:
diff changeset
   280
                note->ExecuteLD(_L("Unable to create log file, check settings"));
hgs
parents:
diff changeset
   281
                }
hgs
parents:
diff changeset
   282
            }
hgs
parents:
diff changeset
   283
        }
hgs
parents:
diff changeset
   284
hgs
parents:
diff changeset
   285
    // close handle to log file
hgs
parents:
diff changeset
   286
    else
hgs
parents:
diff changeset
   287
        {
hgs
parents:
diff changeset
   288
        if (iLogFileInitialized)
hgs
parents:
diff changeset
   289
            {
hgs
parents:
diff changeset
   290
            iLogFile.Flush();
hgs
parents:
diff changeset
   291
            iLogFile.Close();
hgs
parents:
diff changeset
   292
hgs
parents:
diff changeset
   293
            iLogFileInitialized = EFalse;
hgs
parents:
diff changeset
   294
            }
hgs
parents:
diff changeset
   295
        }
hgs
parents:
diff changeset
   296
    }
hgs
parents:
diff changeset
   297
hgs
parents:
diff changeset
   298
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
   299
hgs
parents:
diff changeset
   300
void CPerfMonEngine::ActivateCPUMonitoringL()
hgs
parents:
diff changeset
   301
    {
hgs
parents:
diff changeset
   302
    // reset counter variables
hgs
parents:
diff changeset
   303
    iCPULoadCalibrating = ETrue;
hgs
parents:
diff changeset
   304
    iCPULoadCalibrationCounter = 0;
hgs
parents:
diff changeset
   305
    iCPULoadMaxValue = 999999999;
hgs
parents:
diff changeset
   306
hgs
parents:
diff changeset
   307
    for (TInt i=0; i<KMaxCPUs; i++)
hgs
parents:
diff changeset
   308
        {
hgs
parents:
diff changeset
   309
        iCPULoadPreviousValue[i] = 1;
hgs
parents:
diff changeset
   310
        }
hgs
parents:
diff changeset
   311
hgs
parents:
diff changeset
   312
    // use null thread is cpu time is supported and the setting is on
hgs
parents:
diff changeset
   313
    if (CPUTimeSupported() && iSettings.iCPUMode == ECPUModeCPUTime)
hgs
parents:
diff changeset
   314
        {
hgs
parents:
diff changeset
   315
        // try to open handle to null thread
hgs
parents:
diff changeset
   316
        if (OpenHandleToNullThread())
hgs
parents:
diff changeset
   317
            {
hgs
parents:
diff changeset
   318
            // handle is open, get initial value for each CPU
hgs
parents:
diff changeset
   319
            for (TInt i=0; i<iAmountOfCPUs; i++)
hgs
parents:
diff changeset
   320
                {
hgs
parents:
diff changeset
   321
                TTimeIntervalMicroSeconds time;
hgs
parents:
diff changeset
   322
                iNullThreads[i].GetCpuTime(time);
hgs
parents:
diff changeset
   323
                iCPULoadPreviousValue[i] = time.Int64();
hgs
parents:
diff changeset
   324
                }
hgs
parents:
diff changeset
   325
hgs
parents:
diff changeset
   326
            iPreviousTime.HomeTime();
hgs
parents:
diff changeset
   327
hgs
parents:
diff changeset
   328
            iCurrentCPUMode = ECPUModeCPUTime;
hgs
parents:
diff changeset
   329
            return; // cpu time is succesfully in use
hgs
parents:
diff changeset
   330
            }
hgs
parents:
diff changeset
   331
        }
hgs
parents:
diff changeset
   332
hgs
parents:
diff changeset
   333
    // otherwise use normal sampling with nops
hgs
parents:
diff changeset
   334
    iCurrentCPUMode = ECPUModeNotSet;
hgs
parents:
diff changeset
   335
hgs
parents:
diff changeset
   336
    // show a warning if cpu time cannot be taken in use
hgs
parents:
diff changeset
   337
    if (iSettings.iCPUMode == ECPUModeCPUTime)
hgs
parents:
diff changeset
   338
        {
hgs
parents:
diff changeset
   339
        CAknInformationNote* note = new (ELeave) CAknInformationNote();
hgs
parents:
diff changeset
   340
        note->ExecuteLD(
hgs
parents:
diff changeset
   341
                _L("CPU Time not supported in this system, using NOPs sampling"));
hgs
parents:
diff changeset
   342
        }
hgs
parents:
diff changeset
   343
hgs
parents:
diff changeset
   344
    // get the amount of CPUs
hgs
parents:
diff changeset
   345
    iAmountOfCPUs = GetAmountOfCPUs();
hgs
parents:
diff changeset
   346
hgs
parents:
diff changeset
   347
    // create a thread for CPU load monitoring
hgs
parents:
diff changeset
   348
    for (TInt i=0; i<iAmountOfCPUs; i++)
hgs
parents:
diff changeset
   349
        {
hgs
parents:
diff changeset
   350
        // initialize the NOP counter variables
hgs
parents:
diff changeset
   351
        iCPULoadNOPCounter[i].iCounterValue = 0;
hgs
parents:
diff changeset
   352
        iCPULoadNOPCounter[i].iCPUNumber = i;
hgs
parents:
diff changeset
   353
        iCPULoadNOPCounter[i].iAmountOfCPUs = iAmountOfCPUs;
hgs
parents:
diff changeset
   354
hgs
parents:
diff changeset
   355
        // create a name for the thread
hgs
parents:
diff changeset
   356
        TFileName cpuLoadThreadName;
hgs
parents:
diff changeset
   357
        cpuLoadThreadName.Copy(_L("PerfMonCPULoadNOPThread"));
hgs
parents:
diff changeset
   358
        cpuLoadThreadName.AppendNum(i);
hgs
parents:
diff changeset
   359
        
hgs
parents:
diff changeset
   360
        // create the thread and resume it
hgs
parents:
diff changeset
   361
        User::LeaveIfError(iCPULoadNOPThread[i].Create(cpuLoadThreadName,
hgs
parents:
diff changeset
   362
                CPULoadNOPThread, 0x1000, 0x1000, 0x100000, &iCPULoadNOPCounter[i]));
hgs
parents:
diff changeset
   363
        iCPULoadNOPThread[i].SetPriority(EPriorityLess);
hgs
parents:
diff changeset
   364
        iCPULoadNOPThread[i].Resume();
hgs
parents:
diff changeset
   365
        }
hgs
parents:
diff changeset
   366
hgs
parents:
diff changeset
   367
    iCurrentCPUMode = ECPUModeNOPs; // NOPs taken succesfully in use
hgs
parents:
diff changeset
   368
    }
hgs
parents:
diff changeset
   369
hgs
parents:
diff changeset
   370
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
   371
hgs
parents:
diff changeset
   372
TBool CPerfMonEngine::OpenHandleToNullThread()
hgs
parents:
diff changeset
   373
    {
hgs
parents:
diff changeset
   374
    // find the kernel process and then the null thread
hgs
parents:
diff changeset
   375
    TFindProcess fp(_L("ekern.exe*"));
hgs
parents:
diff changeset
   376
hgs
parents:
diff changeset
   377
    TFullName kernelName;
hgs
parents:
diff changeset
   378
    if (fp.Next(kernelName) == KErrNone)
hgs
parents:
diff changeset
   379
        {
hgs
parents:
diff changeset
   380
        iAmountOfCPUs = 0;
hgs
parents:
diff changeset
   381
hgs
parents:
diff changeset
   382
        // find all null threads in the system by following the order ie "Null", "Null1", "Null2", "Null3"
hgs
parents:
diff changeset
   383
        for (TInt i(0); i<KMaxCPUs; i++)
hgs
parents:
diff changeset
   384
            {
hgs
parents:
diff changeset
   385
            // construct name of the null thread from the process name
hgs
parents:
diff changeset
   386
            TFullName nullThreadName(kernelName);
hgs
parents:
diff changeset
   387
            nullThreadName.Append(_L("::Null"));
hgs
parents:
diff changeset
   388
            
hgs
parents:
diff changeset
   389
            if (i >= 1) // add identifier for CPUs higher than zero
hgs
parents:
diff changeset
   390
                nullThreadName.AppendNum(i);
hgs
parents:
diff changeset
   391
hgs
parents:
diff changeset
   392
            TFindThread ft(nullThreadName);
hgs
parents:
diff changeset
   393
            TFullName threadName;
hgs
parents:
diff changeset
   394
hgs
parents:
diff changeset
   395
            if (ft.Next(threadName) == KErrNone)
hgs
parents:
diff changeset
   396
                {
hgs
parents:
diff changeset
   397
                if (iNullThreads[i].Open(threadName) != KErrNone)
hgs
parents:
diff changeset
   398
                    return EFalse;
hgs
parents:
diff changeset
   399
                
hgs
parents:
diff changeset
   400
                iAmountOfCPUs++;
hgs
parents:
diff changeset
   401
                }
hgs
parents:
diff changeset
   402
            else
hgs
parents:
diff changeset
   403
                {
hgs
parents:
diff changeset
   404
                break;  // break the loop, no more matches can be found
hgs
parents:
diff changeset
   405
                }
hgs
parents:
diff changeset
   406
            }
hgs
parents:
diff changeset
   407
        }
hgs
parents:
diff changeset
   408
hgs
parents:
diff changeset
   409
    // process not found
hgs
parents:
diff changeset
   410
    else
hgs
parents:
diff changeset
   411
        return EFalse;
hgs
parents:
diff changeset
   412
hgs
parents:
diff changeset
   413
    // success!
hgs
parents:
diff changeset
   414
    return ETrue;
hgs
parents:
diff changeset
   415
    }
hgs
parents:
diff changeset
   416
hgs
parents:
diff changeset
   417
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
   418
hgs
parents:
diff changeset
   419
void CPerfMonEngine::DeActivateCPUMonitoring()
hgs
parents:
diff changeset
   420
    {
hgs
parents:
diff changeset
   421
    if (iCurrentCPUMode == ECPUModeCPUTime)
hgs
parents:
diff changeset
   422
        {
hgs
parents:
diff changeset
   423
        // close handles to null threads
hgs
parents:
diff changeset
   424
        for (TInt i=0;i<iAmountOfCPUs;i++)
hgs
parents:
diff changeset
   425
            {
hgs
parents:
diff changeset
   426
            iNullThreads[i].Close();
hgs
parents:
diff changeset
   427
            }
hgs
parents:
diff changeset
   428
        }
hgs
parents:
diff changeset
   429
hgs
parents:
diff changeset
   430
    else if (iCurrentCPUMode == ECPUModeNOPs)
hgs
parents:
diff changeset
   431
        {
hgs
parents:
diff changeset
   432
        // kill the cpu load thread
hgs
parents:
diff changeset
   433
        for (TInt i=0;i<iAmountOfCPUs;i++)
hgs
parents:
diff changeset
   434
            {
hgs
parents:
diff changeset
   435
            iCPULoadNOPThread[i].Kill(0);
hgs
parents:
diff changeset
   436
            iCPULoadNOPThread[i].Close();
hgs
parents:
diff changeset
   437
            }
hgs
parents:
diff changeset
   438
        }
hgs
parents:
diff changeset
   439
    }
hgs
parents:
diff changeset
   440
hgs
parents:
diff changeset
   441
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
   442
hgs
parents:
diff changeset
   443
TBool CPerfMonEngine::CPUTimeSupported()
hgs
parents:
diff changeset
   444
    {
hgs
parents:
diff changeset
   445
    TTimeIntervalMicroSeconds time;
hgs
parents:
diff changeset
   446
    TInt err = RThread().GetCpuTime(time);
hgs
parents:
diff changeset
   447
hgs
parents:
diff changeset
   448
    if (err == KErrNone && time.Int64() > 0)
hgs
parents:
diff changeset
   449
        return ETrue;
hgs
parents:
diff changeset
   450
    else
hgs
parents:
diff changeset
   451
        return EFalse;
hgs
parents:
diff changeset
   452
    }
hgs
parents:
diff changeset
   453
hgs
parents:
diff changeset
   454
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
   455
hgs
parents:
diff changeset
   456
TInt CPerfMonEngine::GetAmountOfCPUs()
hgs
parents:
diff changeset
   457
    {
hgs
parents:
diff changeset
   458
    // query from HAL the amount of CPUs and then check it returns a valid value
hgs
parents:
diff changeset
   459
    TInt amountOfCPUs = UserSvr::HalFunction(EHalGroupKernel, 16 /*EKernelHalNumLogicalCpus*/, 0, 0);
hgs
parents:
diff changeset
   460
    
hgs
parents:
diff changeset
   461
    if (amountOfCPUs >= 1 && amountOfCPUs <= KMaxCPUs)
hgs
parents:
diff changeset
   462
        return amountOfCPUs;
hgs
parents:
diff changeset
   463
    else
hgs
parents:
diff changeset
   464
        return 1; // HAL may not support this feature, so just return one CPU
hgs
parents:
diff changeset
   465
    }
hgs
parents:
diff changeset
   466
hgs
parents:
diff changeset
   467
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
   468
hgs
parents:
diff changeset
   469
TThreadPriority CPerfMonEngine::SettingItemToThreadPriority(TInt aIndex)
hgs
parents:
diff changeset
   470
    {
hgs
parents:
diff changeset
   471
    TThreadPriority threadPriority = EPriorityNull;
hgs
parents:
diff changeset
   472
hgs
parents:
diff changeset
   473
    switch (aIndex)
hgs
parents:
diff changeset
   474
        {
hgs
parents:
diff changeset
   475
        case EThreadPriorityTypeMuchLess:
hgs
parents:
diff changeset
   476
            {
hgs
parents:
diff changeset
   477
            threadPriority = EPriorityMuchLess;
hgs
parents:
diff changeset
   478
            break;
hgs
parents:
diff changeset
   479
            }
hgs
parents:
diff changeset
   480
        case EThreadPriorityTypeLess:
hgs
parents:
diff changeset
   481
            {
hgs
parents:
diff changeset
   482
            threadPriority = EPriorityLess;
hgs
parents:
diff changeset
   483
            break;
hgs
parents:
diff changeset
   484
            }
hgs
parents:
diff changeset
   485
        case EThreadPriorityTypeNormal:
hgs
parents:
diff changeset
   486
            {
hgs
parents:
diff changeset
   487
            threadPriority = EPriorityNormal;
hgs
parents:
diff changeset
   488
            break;
hgs
parents:
diff changeset
   489
            }
hgs
parents:
diff changeset
   490
        case EThreadPriorityTypeMore:
hgs
parents:
diff changeset
   491
            {
hgs
parents:
diff changeset
   492
            threadPriority = EPriorityMore;
hgs
parents:
diff changeset
   493
            break;
hgs
parents:
diff changeset
   494
            }
hgs
parents:
diff changeset
   495
        case EThreadPriorityTypeMuchMore:
hgs
parents:
diff changeset
   496
            {
hgs
parents:
diff changeset
   497
            threadPriority = EPriorityMuchMore;
hgs
parents:
diff changeset
   498
            break;
hgs
parents:
diff changeset
   499
            }
hgs
parents:
diff changeset
   500
        case EThreadPriorityTypeRealTime:
hgs
parents:
diff changeset
   501
            {
hgs
parents:
diff changeset
   502
            threadPriority = EPriorityRealTime;
hgs
parents:
diff changeset
   503
            break;
hgs
parents:
diff changeset
   504
            }
hgs
parents:
diff changeset
   505
        case EThreadPriorityTypeAbsoluteVeryLow:
hgs
parents:
diff changeset
   506
            {
hgs
parents:
diff changeset
   507
            threadPriority = EPriorityAbsoluteVeryLow;
hgs
parents:
diff changeset
   508
            break;
hgs
parents:
diff changeset
   509
            }
hgs
parents:
diff changeset
   510
        case EThreadPriorityTypeAbsoluteLow:
hgs
parents:
diff changeset
   511
            {
hgs
parents:
diff changeset
   512
            threadPriority = EPriorityAbsoluteLow;
hgs
parents:
diff changeset
   513
            break;
hgs
parents:
diff changeset
   514
            }
hgs
parents:
diff changeset
   515
        case EThreadPriorityTypeAbsoluteBackground:
hgs
parents:
diff changeset
   516
            {
hgs
parents:
diff changeset
   517
            threadPriority = EPriorityAbsoluteBackground;
hgs
parents:
diff changeset
   518
            break;
hgs
parents:
diff changeset
   519
            }
hgs
parents:
diff changeset
   520
        case EThreadPriorityTypeAbsoluteForeground:
hgs
parents:
diff changeset
   521
            {
hgs
parents:
diff changeset
   522
            threadPriority = EPriorityAbsoluteForeground;
hgs
parents:
diff changeset
   523
            break;
hgs
parents:
diff changeset
   524
            }
hgs
parents:
diff changeset
   525
        case EThreadPriorityTypeAbsoluteHigh:
hgs
parents:
diff changeset
   526
            {
hgs
parents:
diff changeset
   527
            threadPriority = EPriorityAbsoluteHigh;
hgs
parents:
diff changeset
   528
            break;
hgs
parents:
diff changeset
   529
            }
hgs
parents:
diff changeset
   530
hgs
parents:
diff changeset
   531
        default:
hgs
parents:
diff changeset
   532
            {
hgs
parents:
diff changeset
   533
            User::Panic(_L("Wrong tp index"), 276);
hgs
parents:
diff changeset
   534
            break;
hgs
parents:
diff changeset
   535
            }
hgs
parents:
diff changeset
   536
        }
hgs
parents:
diff changeset
   537
hgs
parents:
diff changeset
   538
    return threadPriority;
hgs
parents:
diff changeset
   539
    }
hgs
parents:
diff changeset
   540
hgs
parents:
diff changeset
   541
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
   542
hgs
parents:
diff changeset
   543
void CPerfMonEngine::CreateSamplesDataArrayL()
hgs
parents:
diff changeset
   544
    {
hgs
parents:
diff changeset
   545
    TInt maxSamples =
hgs
parents:
diff changeset
   546
            iSettings.iMaxSamples >= KMinimumSamplesLength ? iSettings.iMaxSamples
hgs
parents:
diff changeset
   547
                    : KMinimumSamplesLength;
hgs
parents:
diff changeset
   548
hgs
parents:
diff changeset
   549
    // create the data structure to store all samples
hgs
parents:
diff changeset
   550
    iSampleEntryArray = new (ELeave) CSampleEntryArray(16);
hgs
parents:
diff changeset
   551
hgs
parents:
diff changeset
   552
    // set sample data array positions for each type
hgs
parents:
diff changeset
   553
    iCPU0PositionInSamples = 0;
hgs
parents:
diff changeset
   554
    iRAMPositionInSamples = KMaxCPUs;
hgs
parents:
diff changeset
   555
    iCDrivePositionInSamples = KMaxCPUs+1;
hgs
parents:
diff changeset
   556
    iPowerPositionInSamples = iCDrivePositionInSamples + ( ESourceI - ESourceC ) + 1;
hgs
parents:
diff changeset
   557
hgs
parents:
diff changeset
   558
    // add all CPU source entries
hgs
parents:
diff changeset
   559
    for (TInt i=0; i<KMaxCPUs; i++)
hgs
parents:
diff changeset
   560
        {
hgs
parents:
diff changeset
   561
        TSampleEntry newSampleEntry;
hgs
parents:
diff changeset
   562
hgs
parents:
diff changeset
   563
        newSampleEntry.iDescription.Copy(_L("CPU"));
hgs
parents:
diff changeset
   564
        newSampleEntry.iDescription.AppendNum(i);
hgs
parents:
diff changeset
   565
hgs
parents:
diff changeset
   566
        newSampleEntry.iUnitTypeShort.Copy(KNullDesC);
hgs
parents:
diff changeset
   567
        newSampleEntry.iUnitTypeLong.Copy(KNullDesC);
hgs
parents:
diff changeset
   568
        newSampleEntry.iDriveNumber = -1;
hgs
parents:
diff changeset
   569
        newSampleEntry.iGraphColor = KRgbYellow;
hgs
parents:
diff changeset
   570
        newSampleEntry.iGraphColor.SetGreen(255-i*75);
hgs
parents:
diff changeset
   571
        newSampleEntry.iGraphColor.SetBlue(i*75);
hgs
parents:
diff changeset
   572
hgs
parents:
diff changeset
   573
        newSampleEntry.iSampleDataArray = new(ELeave) CSampleDataArray(maxSamples);
hgs
parents:
diff changeset
   574
        iSampleEntryArray->AppendL(newSampleEntry);
hgs
parents:
diff changeset
   575
        }
hgs
parents:
diff changeset
   576
hgs
parents:
diff changeset
   577
    // add RAM entry
hgs
parents:
diff changeset
   578
    {
hgs
parents:
diff changeset
   579
    TSampleEntry newSampleEntry;
hgs
parents:
diff changeset
   580
hgs
parents:
diff changeset
   581
    newSampleEntry.iDescription.Copy(_L("RAM"));
hgs
parents:
diff changeset
   582
    newSampleEntry.iUnitTypeShort.Copy(_L("b"));
hgs
parents:
diff changeset
   583
    newSampleEntry.iUnitTypeLong.Copy(_L("bytes"));
hgs
parents:
diff changeset
   584
    newSampleEntry.iDriveNumber = -1;
hgs
parents:
diff changeset
   585
    newSampleEntry.iGraphColor = KRgbGreen;
hgs
parents:
diff changeset
   586
hgs
parents:
diff changeset
   587
    newSampleEntry.iSampleDataArray = new(ELeave) CSampleDataArray(maxSamples);
hgs
parents:
diff changeset
   588
    iSampleEntryArray->AppendL(newSampleEntry);
hgs
parents:
diff changeset
   589
    }
hgs
parents:
diff changeset
   590
hgs
parents:
diff changeset
   591
    // add all disk drives
hgs
parents:
diff changeset
   592
    for (TInt i=0; i<ESourceI-ESourceC+1; i++)
hgs
parents:
diff changeset
   593
        {
hgs
parents:
diff changeset
   594
        TSampleEntry newSampleEntry;
hgs
parents:
diff changeset
   595
hgs
parents:
diff changeset
   596
        TChar driveLetter = 'C' + i; // C is the first drive
hgs
parents:
diff changeset
   597
hgs
parents:
diff changeset
   598
        newSampleEntry.iDescription.Append(driveLetter);
hgs
parents:
diff changeset
   599
        newSampleEntry.iDescription.Append(_L(":"));
hgs
parents:
diff changeset
   600
        newSampleEntry.iUnitTypeShort.Copy(_L("b"));
hgs
parents:
diff changeset
   601
        newSampleEntry.iUnitTypeLong.Copy(_L("bytes"));
hgs
parents:
diff changeset
   602
hgs
parents:
diff changeset
   603
        iEnv->FsSession().CharToDrive(driveLetter,
hgs
parents:
diff changeset
   604
                newSampleEntry.iDriveNumber);
hgs
parents:
diff changeset
   605
hgs
parents:
diff changeset
   606
        newSampleEntry.iGraphColor = KRgbCyan;
hgs
parents:
diff changeset
   607
        newSampleEntry.iGraphColor.SetGreen(255 - (i - ESourceC) * 30);
hgs
parents:
diff changeset
   608
        newSampleEntry.iGraphColor.SetRed(i * 30);
hgs
parents:
diff changeset
   609
hgs
parents:
diff changeset
   610
        newSampleEntry.iSampleDataArray = new (ELeave) CSampleDataArray(
hgs
parents:
diff changeset
   611
                maxSamples);
hgs
parents:
diff changeset
   612
hgs
parents:
diff changeset
   613
        iSampleEntryArray->AppendL(newSampleEntry);
hgs
parents:
diff changeset
   614
        }
hgs
parents:
diff changeset
   615
hgs
parents:
diff changeset
   616
    // add power entry
hgs
parents:
diff changeset
   617
    {
hgs
parents:
diff changeset
   618
    TSampleEntry newSampleEntry;
hgs
parents:
diff changeset
   619
hgs
parents:
diff changeset
   620
    newSampleEntry.iDescription.Copy(_L("Power"));
hgs
parents:
diff changeset
   621
    newSampleEntry.iUnitTypeShort.Copy(_L("mW"));
hgs
parents:
diff changeset
   622
    newSampleEntry.iUnitTypeLong.Copy(_L("milliwatts"));
hgs
parents:
diff changeset
   623
    newSampleEntry.iDriveNumber = -1;
hgs
parents:
diff changeset
   624
    newSampleEntry.iGraphColor = KRgbRed;
hgs
parents:
diff changeset
   625
hgs
parents:
diff changeset
   626
    newSampleEntry.iSampleDataArray = new(ELeave) CSampleDataArray(maxSamples);
hgs
parents:
diff changeset
   627
    iSampleEntryArray->AppendL(newSampleEntry);
hgs
parents:
diff changeset
   628
    }
hgs
parents:
diff changeset
   629
hgs
parents:
diff changeset
   630
    // save current time as start time
hgs
parents:
diff changeset
   631
    iStartTime.HomeTime();
hgs
parents:
diff changeset
   632
    }
hgs
parents:
diff changeset
   633
hgs
parents:
diff changeset
   634
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
   635
hgs
parents:
diff changeset
   636
void CPerfMonEngine::UpdateSamplesDataL()
hgs
parents:
diff changeset
   637
    {
hgs
parents:
diff changeset
   638
    // reset inactivity timers
hgs
parents:
diff changeset
   639
    if (iSettings.iKeepBacklightOn)
hgs
parents:
diff changeset
   640
        User::ResetInactivityTime();
hgs
parents:
diff changeset
   641
hgs
parents:
diff changeset
   642
    // get current time
hgs
parents:
diff changeset
   643
    TTime currentTime;
hgs
parents:
diff changeset
   644
    currentTime.HomeTime();
hgs
parents:
diff changeset
   645
hgs
parents:
diff changeset
   646
    // calculate time difference
hgs
parents:
diff changeset
   647
    TTimeIntervalMicroSeconds timeDeltaFromPreviousSample =
hgs
parents:
diff changeset
   648
            currentTime.MicroSecondsFrom(iPreviousTime);
hgs
parents:
diff changeset
   649
hgs
parents:
diff changeset
   650
    // remember current time as previous
hgs
parents:
diff changeset
   651
    iPreviousTime = currentTime;
hgs
parents:
diff changeset
   652
hgs
parents:
diff changeset
   653
    // get CPU load value for each CPU
hgs
parents:
diff changeset
   654
    for (TInt i=0;i<iAmountOfCPUs;i++)
hgs
parents:
diff changeset
   655
        {
hgs
parents:
diff changeset
   656
        TInt64 cpuLoadDelta(0);
hgs
parents:
diff changeset
   657
        TInt64 cpuLoadFree(0);
hgs
parents:
diff changeset
   658
        TInt64 currentCPUValue(0);
hgs
parents:
diff changeset
   659
        
hgs
parents:
diff changeset
   660
        if (iCurrentCPUMode == ECPUModeCPUTime || iCurrentCPUMode == ECPUModeNOPs)
hgs
parents:
diff changeset
   661
            {
hgs
parents:
diff changeset
   662
            if (iCurrentCPUMode == ECPUModeCPUTime)
hgs
parents:
diff changeset
   663
                {
hgs
parents:
diff changeset
   664
                // get CPU time of null thread
hgs
parents:
diff changeset
   665
                TTimeIntervalMicroSeconds time;
hgs
parents:
diff changeset
   666
                iNullThreads[i].GetCpuTime(time);
hgs
parents:
diff changeset
   667
                currentCPUValue = time.Int64();
hgs
parents:
diff changeset
   668
                }
hgs
parents:
diff changeset
   669
            else if (iCurrentCPUMode == ECPUModeNOPs)
hgs
parents:
diff changeset
   670
                {
hgs
parents:
diff changeset
   671
                // get CPU time from sampler
hgs
parents:
diff changeset
   672
                currentCPUValue = iCPULoadNOPCounter[i].iCounterValue;
hgs
parents:
diff changeset
   673
                }
hgs
parents:
diff changeset
   674
hgs
parents:
diff changeset
   675
            // get delta and store the previous value
hgs
parents:
diff changeset
   676
            cpuLoadDelta = currentCPUValue - iCPULoadPreviousValue[i];
hgs
parents:
diff changeset
   677
            iCPULoadPreviousValue[i] = currentCPUValue;
hgs
parents:
diff changeset
   678
            
hgs
parents:
diff changeset
   679
            // velocity = distance / time
hgs
parents:
diff changeset
   680
            cpuLoadFree = cpuLoadDelta * KCPUTimeMultiplier / timeDeltaFromPreviousSample.Int64();
hgs
parents:
diff changeset
   681
hgs
parents:
diff changeset
   682
            // detect maximum value (this is common to all CPUs)
hgs
parents:
diff changeset
   683
            if (cpuLoadFree > iCPULoadMaxValue)
hgs
parents:
diff changeset
   684
                {
hgs
parents:
diff changeset
   685
                iCPULoadMaxValue = cpuLoadFree;
hgs
parents:
diff changeset
   686
                }
hgs
parents:
diff changeset
   687
            }
hgs
parents:
diff changeset
   688
hgs
parents:
diff changeset
   689
        // save cpu sample data
hgs
parents:
diff changeset
   690
        TSampleData cpuSample;
hgs
parents:
diff changeset
   691
        cpuSample.iFree = cpuLoadFree;
hgs
parents:
diff changeset
   692
        cpuSample.iSize = iCPULoadCalibrating ? cpuLoadFree : iCPULoadMaxValue;  // if calibrating, size==free, otherwise store the correct size value
hgs
parents:
diff changeset
   693
        cpuSample.iTimeFromStart = currentTime.MicroSecondsFrom(iStartTime);
hgs
parents:
diff changeset
   694
hgs
parents:
diff changeset
   695
        iSampleEntryArray->At(i).iSampleDataArray->InsertL(0, cpuSample);
hgs
parents:
diff changeset
   696
        }
hgs
parents:
diff changeset
   697
        
hgs
parents:
diff changeset
   698
    // check calibration status, the calibration will be only done against CPU0
hgs
parents:
diff changeset
   699
    if (iCPULoadCalibrating)
hgs
parents:
diff changeset
   700
        {
hgs
parents:
diff changeset
   701
        iCPULoadCalibrationCounter++;
hgs
parents:
diff changeset
   702
        TInt64 cpuLoadSize = iSampleEntryArray->At(iCPU0PositionInSamples).iSampleDataArray->At(0).iSize;
hgs
parents:
diff changeset
   703
        
hgs
parents:
diff changeset
   704
        // check if need to calibrate anymore
hgs
parents:
diff changeset
   705
        if (iCPULoadCalibrationCounter > KCalibrationLength)
hgs
parents:
diff changeset
   706
            {
hgs
parents:
diff changeset
   707
            iCPULoadCalibrating = EFalse;
hgs
parents:
diff changeset
   708
            
hgs
parents:
diff changeset
   709
            // from the samples, get the minimum value, and let it be the max value
hgs
parents:
diff changeset
   710
            for (TInt i=0; i<iSampleEntryArray->At(0).iSampleDataArray->Count(); i++)
hgs
parents:
diff changeset
   711
                {
hgs
parents:
diff changeset
   712
                TInt64 newCPULoadMaxValue = iCPULoadMaxValue;
hgs
parents:
diff changeset
   713
                
hgs
parents:
diff changeset
   714
                if (iSampleEntryArray->At(0).iSampleDataArray->At(i).iFree < newCPULoadMaxValue)
hgs
parents:
diff changeset
   715
                    {
hgs
parents:
diff changeset
   716
                    newCPULoadMaxValue = iSampleEntryArray->At(0).iSampleDataArray->At(i).iFree;
hgs
parents:
diff changeset
   717
                    }
hgs
parents:
diff changeset
   718
                
hgs
parents:
diff changeset
   719
                iCPULoadMaxValue = newCPULoadMaxValue;
hgs
parents:
diff changeset
   720
                }
hgs
parents:
diff changeset
   721
            
hgs
parents:
diff changeset
   722
            // adjust priority of the poller thread
hgs
parents:
diff changeset
   723
            if (iCurrentCPUMode == ECPUModeNOPs)
hgs
parents:
diff changeset
   724
                {
hgs
parents:
diff changeset
   725
                for (TInt i=0; i<iAmountOfCPUs; i++)
hgs
parents:
diff changeset
   726
                    {
hgs
parents:
diff changeset
   727
                    iCPULoadNOPThread[i].SetPriority(EPriorityAbsoluteVeryLow);
hgs
parents:
diff changeset
   728
                    }
hgs
parents:
diff changeset
   729
                }
hgs
parents:
diff changeset
   730
hgs
parents:
diff changeset
   731
            }
hgs
parents:
diff changeset
   732
        }
hgs
parents:
diff changeset
   733
hgs
parents:
diff changeset
   734
    // get ram memory
hgs
parents:
diff changeset
   735
    TMemoryInfoV1Buf ramMemory;
hgs
parents:
diff changeset
   736
    UserHal::MemoryInfo(ramMemory);
hgs
parents:
diff changeset
   737
hgs
parents:
diff changeset
   738
    TSampleData memorySample;
hgs
parents:
diff changeset
   739
    memorySample.iFree = ramMemory().iFreeRamInBytes;
hgs
parents:
diff changeset
   740
    memorySample.iSize = ramMemory().iMaxFreeRamInBytes;
hgs
parents:
diff changeset
   741
    memorySample.iTimeFromStart = currentTime.MicroSecondsFrom(iStartTime);
hgs
parents:
diff changeset
   742
hgs
parents:
diff changeset
   743
    iSampleEntryArray->At(iRAMPositionInSamples).iSampleDataArray->InsertL(0, memorySample);
hgs
parents:
diff changeset
   744
    
hgs
parents:
diff changeset
   745
    // all drives
hgs
parents:
diff changeset
   746
    for (TInt i = iCDrivePositionInSamples; i < iPowerPositionInSamples; i++)
hgs
parents:
diff changeset
   747
        {
hgs
parents:
diff changeset
   748
        TSampleData driveSample;
hgs
parents:
diff changeset
   749
hgs
parents:
diff changeset
   750
        // get volume info from RFs
hgs
parents:
diff changeset
   751
        TVolumeInfo volumeInfo;
hgs
parents:
diff changeset
   752
        if (iEnv->FsSession().Volume(volumeInfo,
hgs
parents:
diff changeset
   753
                iSampleEntryArray->At(i).iDriveNumber) == KErrNone)
hgs
parents:
diff changeset
   754
            {
hgs
parents:
diff changeset
   755
            driveSample.iFree = volumeInfo.iFree;
hgs
parents:
diff changeset
   756
            driveSample.iSize = volumeInfo.iSize;
hgs
parents:
diff changeset
   757
            }
hgs
parents:
diff changeset
   758
        else
hgs
parents:
diff changeset
   759
            {
hgs
parents:
diff changeset
   760
            driveSample.iFree = 0;
hgs
parents:
diff changeset
   761
            driveSample.iSize = 0;
hgs
parents:
diff changeset
   762
            }
hgs
parents:
diff changeset
   763
hgs
parents:
diff changeset
   764
        driveSample.iTimeFromStart = currentTime.MicroSecondsFrom(iStartTime);
hgs
parents:
diff changeset
   765
hgs
parents:
diff changeset
   766
        iSampleEntryArray->At(i).iSampleDataArray->InsertL(0, driveSample);
hgs
parents:
diff changeset
   767
        }
hgs
parents:
diff changeset
   768
hgs
parents:
diff changeset
   769
    // Power data
hgs
parents:
diff changeset
   770
    TSampleData powerSample;
hgs
parents:
diff changeset
   771
    if (iSettings.iPowerMonitoringEnabled)
hgs
parents:
diff changeset
   772
        {
hgs
parents:
diff changeset
   773
        // Values in milliwatts
hgs
parents:
diff changeset
   774
        powerSample.iFree = ( iPowerClient->GetMaxPower() - iPowerClient->GetPower() ) / 1000;
hgs
parents:
diff changeset
   775
        powerSample.iSize = iPowerClient->GetMaxPower() / 1000;
hgs
parents:
diff changeset
   776
        }
hgs
parents:
diff changeset
   777
    else
hgs
parents:
diff changeset
   778
        {
hgs
parents:
diff changeset
   779
        powerSample.iFree = 0;
hgs
parents:
diff changeset
   780
        powerSample.iSize = 0;
hgs
parents:
diff changeset
   781
        }
hgs
parents:
diff changeset
   782
hgs
parents:
diff changeset
   783
    powerSample.iTimeFromStart = currentTime.MicroSecondsFrom(iStartTime);
hgs
parents:
diff changeset
   784
hgs
parents:
diff changeset
   785
    iSampleEntryArray->At(iPowerPositionInSamples).iSampleDataArray->InsertL(0, powerSample);
hgs
parents:
diff changeset
   786
hgs
parents:
diff changeset
   787
    // compress sample data arrays to save memory
hgs
parents:
diff changeset
   788
    TInt curLength(iSampleEntryArray->At(0).iSampleDataArray->Count());
hgs
parents:
diff changeset
   789
hgs
parents:
diff changeset
   790
    TInt maxSamples =
hgs
parents:
diff changeset
   791
            iSettings.iMaxSamples >= KMinimumSamplesLength ? iSettings.iMaxSamples
hgs
parents:
diff changeset
   792
                    : KMinimumSamplesLength;
hgs
parents:
diff changeset
   793
hgs
parents:
diff changeset
   794
    if (curLength > maxSamples && curLength % 5 == 0)
hgs
parents:
diff changeset
   795
        {
hgs
parents:
diff changeset
   796
        for (TInt i = 0; i < iSampleEntryArray->Count(); i++)
hgs
parents:
diff changeset
   797
            {
hgs
parents:
diff changeset
   798
            if (SampleEntryArray()->At(i).iSampleDataArray->Count() > 0)
hgs
parents:
diff changeset
   799
                {
hgs
parents:
diff changeset
   800
                iSampleEntryArray->At(i).iSampleDataArray->ResizeL(maxSamples); // looses old samples
hgs
parents:
diff changeset
   801
                iSampleEntryArray->At(i).iSampleDataArray->Compress();
hgs
parents:
diff changeset
   802
                }
hgs
parents:
diff changeset
   803
            }
hgs
parents:
diff changeset
   804
        }
hgs
parents:
diff changeset
   805
    }
hgs
parents:
diff changeset
   806
hgs
parents:
diff changeset
   807
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
   808
hgs
parents:
diff changeset
   809
void CPerfMonEngine::AppendLatestSamplesToLogsL()
hgs
parents:
diff changeset
   810
    {
hgs
parents:
diff changeset
   811
    if (iSettings.iLoggingEnabled && SampleEntryArray())
hgs
parents:
diff changeset
   812
        {
hgs
parents:
diff changeset
   813
        // loop all sources
hgs
parents:
diff changeset
   814
        for (TInt i = 0; i < SampleEntryArray()->Count(); i++)
hgs
parents:
diff changeset
   815
            {
hgs
parents:
diff changeset
   816
            // check if this setting has been enabled and it has some data
hgs
parents:
diff changeset
   817
            if (iSettings.iLoggingSources.iSrcEnabled[SampleEntryPosToSettingPos(i)]
hgs
parents:
diff changeset
   818
                    && SampleEntryArray()->At(i).iSampleDataArray->Count() > 0)
hgs
parents:
diff changeset
   819
                {
hgs
parents:
diff changeset
   820
                // get current sample
hgs
parents:
diff changeset
   821
                TSampleData& currentSample =
hgs
parents:
diff changeset
   822
                        SampleEntryArray()->At(i).iSampleDataArray->At(0);
hgs
parents:
diff changeset
   823
hgs
parents:
diff changeset
   824
                TBuf<128> buf;
hgs
parents:
diff changeset
   825
                buf.Append(_L("PERFMON;"));
hgs
parents:
diff changeset
   826
                buf.Append(SampleEntryArray()->At(i).iDescription);
hgs
parents:
diff changeset
   827
                buf.Append(_L(";"));
hgs
parents:
diff changeset
   828
                buf.AppendNum(currentSample.iTimeFromStart.Int64());
hgs
parents:
diff changeset
   829
                buf.Append(_L(";"));
hgs
parents:
diff changeset
   830
                buf.AppendNum(currentSample.iFree);
hgs
parents:
diff changeset
   831
                buf.Append(_L(";"));
hgs
parents:
diff changeset
   832
                buf.AppendNum(currentSample.iSize);
hgs
parents:
diff changeset
   833
hgs
parents:
diff changeset
   834
                // print to RDebug
hgs
parents:
diff changeset
   835
                if (iSettings.iLoggingMode == ELoggingModeRDebug
hgs
parents:
diff changeset
   836
                        || iSettings.iLoggingMode == ELoggingModeRDebugLogFile)
hgs
parents:
diff changeset
   837
                    {
hgs
parents:
diff changeset
   838
                    RDebug::Print(buf);
hgs
parents:
diff changeset
   839
                    }
hgs
parents:
diff changeset
   840
hgs
parents:
diff changeset
   841
                // print to log file
hgs
parents:
diff changeset
   842
                if (iSettings.iLoggingMode == ELoggingModeLogFile
hgs
parents:
diff changeset
   843
                        || iSettings.iLoggingMode == ELoggingModeRDebugLogFile)
hgs
parents:
diff changeset
   844
                    {
hgs
parents:
diff changeset
   845
                    buf.Append(_L("\r\n"));
hgs
parents:
diff changeset
   846
hgs
parents:
diff changeset
   847
                    TBuf8<128> buf8;
hgs
parents:
diff changeset
   848
                    buf8.Copy(buf);
hgs
parents:
diff changeset
   849
hgs
parents:
diff changeset
   850
                    iLogFile.Write(buf8);
hgs
parents:
diff changeset
   851
                    }
hgs
parents:
diff changeset
   852
                }
hgs
parents:
diff changeset
   853
            }
hgs
parents:
diff changeset
   854
        }
hgs
parents:
diff changeset
   855
    }
hgs
parents:
diff changeset
   856
hgs
parents:
diff changeset
   857
void CPerfMonEngine::LoadSettingsL()
hgs
parents:
diff changeset
   858
    {
hgs
parents:
diff changeset
   859
    // set defaults
hgs
parents:
diff changeset
   860
    iSettings.iHeartBeat = 600;
hgs
parents:
diff changeset
   861
    iSettings.iMaxSamples = 64;
hgs
parents:
diff changeset
   862
    iSettings.iPriority = EThreadPriorityTypeNormal;
hgs
parents:
diff changeset
   863
    iSettings.iCPUMode = ECPUModeCPUTime;
hgs
parents:
diff changeset
   864
    iSettings.iKeepBacklightOn = ETrue;
hgs
parents:
diff changeset
   865
52
hgs
parents: 51
diff changeset
   866
    iSettings.iDataPopupVisibility = EDataPopupVisbilityAlwaysAlwaysOff;
51
hgs
parents:
diff changeset
   867
    iSettings.iDataPopupLocation = EDataPopupLocationTopRight;
hgs
parents:
diff changeset
   868
    iSettings.iDataPopupSources.SetDefaults1();
hgs
parents:
diff changeset
   869
hgs
parents:
diff changeset
   870
    iSettings.iGraphsVerticalBarPeriod = 5;
hgs
parents:
diff changeset
   871
    iSettings.iGraphsSources.SetDefaults2();
hgs
parents:
diff changeset
   872
hgs
parents:
diff changeset
   873
    iSettings.iLoggingMode = ELoggingModeRDebug;
hgs
parents:
diff changeset
   874
    iSettings.iLoggingFilePath.Copy(KDefaultLogFilePath);
hgs
parents:
diff changeset
   875
    iSettings.iLoggingSources.SetDefaults2();
hgs
parents:
diff changeset
   876
hgs
parents:
diff changeset
   877
    iSettings.iLoggingEnabled = EFalse;
hgs
parents:
diff changeset
   878
hgs
parents:
diff changeset
   879
    iSettings.iPowerMonitoringEnabled = ETrue;
hgs
parents:
diff changeset
   880
hgs
parents:
diff changeset
   881
    // make sure that the private path of this app in c-drive exists
hgs
parents:
diff changeset
   882
    iEnv->FsSession().CreatePrivatePath(KSettingsDrive); // c:\\private\\20011385\\
hgs
parents:
diff changeset
   883
    
hgs
parents:
diff changeset
   884
    // handle settings always in the private directory 
hgs
parents:
diff changeset
   885
    if (iEnv->FsSession().SetSessionToPrivate(KSettingsDrive) == KErrNone)
hgs
parents:
diff changeset
   886
        {
hgs
parents:
diff changeset
   887
        const TUid KUidPerfMon =
hgs
parents:
diff changeset
   888
            {
hgs
parents:
diff changeset
   889
            0x20011385
hgs
parents:
diff changeset
   890
            };
hgs
parents:
diff changeset
   891
        // open or create a dictionary file store
hgs
parents:
diff changeset
   892
        CDictionaryFileStore* settingsStore = CDictionaryFileStore::OpenLC(
hgs
parents:
diff changeset
   893
                iEnv->FsSession(), KSettingsFileName, KUidPerfMon);
hgs
parents:
diff changeset
   894
hgs
parents:
diff changeset
   895
        LoadDFSValueL(settingsStore, KPMSettingHeartBeat, iSettings.iHeartBeat);
hgs
parents:
diff changeset
   896
        LoadDFSValueL(settingsStore, KPMSettingMaxSamples,
hgs
parents:
diff changeset
   897
                iSettings.iMaxSamples);
hgs
parents:
diff changeset
   898
        LoadDFSValueL(settingsStore, KPMSettingPriority, iSettings.iPriority);
hgs
parents:
diff changeset
   899
        
hgs
parents:
diff changeset
   900
        LoadDFSValueL(settingsStore, KPMSettingCPUMode, iSettings.iCPUMode);
hgs
parents:
diff changeset
   901
        
hgs
parents:
diff changeset
   902
        LoadDFSValueL(settingsStore, KPMSettingKeepBackLightOn,
hgs
parents:
diff changeset
   903
                iSettings.iKeepBacklightOn);
hgs
parents:
diff changeset
   904
hgs
parents:
diff changeset
   905
        LoadDFSValueL(settingsStore, KPMSettingDataPopupVisbility,
hgs
parents:
diff changeset
   906
                iSettings.iDataPopupVisibility);
hgs
parents:
diff changeset
   907
        LoadDFSValueL(settingsStore, KPMSettingDataPopupLocation,
hgs
parents:
diff changeset
   908
                iSettings.iDataPopupLocation);
hgs
parents:
diff changeset
   909
        LoadDFSValueL(settingsStore, KPMSettingDataPopupSources,
hgs
parents:
diff changeset
   910
                iSettings.iDataPopupSources);
hgs
parents:
diff changeset
   911
hgs
parents:
diff changeset
   912
        LoadDFSValueL(settingsStore, KPMSettingGraphsVerticalBarPeriod,
hgs
parents:
diff changeset
   913
                iSettings.iGraphsVerticalBarPeriod);
hgs
parents:
diff changeset
   914
        LoadDFSValueL(settingsStore, KPMSettingGraphsSources,
hgs
parents:
diff changeset
   915
                iSettings.iGraphsSources);
hgs
parents:
diff changeset
   916
hgs
parents:
diff changeset
   917
        LoadDFSValueL(settingsStore, KPMSettingLoggingMode,
hgs
parents:
diff changeset
   918
                iSettings.iLoggingMode);
hgs
parents:
diff changeset
   919
        LoadDFSValueL(settingsStore, KPMSettingLoggingFilePath,
hgs
parents:
diff changeset
   920
                iSettings.iLoggingFilePath);
hgs
parents:
diff changeset
   921
        LoadDFSValueL(settingsStore, KPMSettingLoggingSources,
hgs
parents:
diff changeset
   922
                iSettings.iLoggingSources);
hgs
parents:
diff changeset
   923
hgs
parents:
diff changeset
   924
        LoadDFSValueL(settingsStore, KPMSettingPowerMonitoringEnabled,
hgs
parents:
diff changeset
   925
                iSettings.iPowerMonitoringEnabled);
hgs
parents:
diff changeset
   926
hgs
parents:
diff changeset
   927
        CleanupStack::PopAndDestroy(); // settingsStore
hgs
parents:
diff changeset
   928
        }
hgs
parents:
diff changeset
   929
    }
hgs
parents:
diff changeset
   930
hgs
parents:
diff changeset
   931
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
   932
hgs
parents:
diff changeset
   933
void CPerfMonEngine::SaveSettingsL()
hgs
parents:
diff changeset
   934
    {
hgs
parents:
diff changeset
   935
    // handle settings always in c:\\private\\20011385\\ 
hgs
parents:
diff changeset
   936
    if (iEnv->FsSession().SetSessionToPrivate( KSettingsDrive ) == KErrNone)
hgs
parents:
diff changeset
   937
        {
hgs
parents:
diff changeset
   938
        // delete existing store to make sure that it is clean and not eg corrupted
hgs
parents:
diff changeset
   939
        if (BaflUtils::FileExists(iEnv->FsSession(), KSettingsFileName))
hgs
parents:
diff changeset
   940
            {
hgs
parents:
diff changeset
   941
            iEnv->FsSession().Delete(KSettingsFileName);
hgs
parents:
diff changeset
   942
            }
hgs
parents:
diff changeset
   943
        const TUid KUidPerfMon =
hgs
parents:
diff changeset
   944
            {
hgs
parents:
diff changeset
   945
            0x20011385
hgs
parents:
diff changeset
   946
            };
hgs
parents:
diff changeset
   947
        // create a dictionary file store
hgs
parents:
diff changeset
   948
        CDictionaryFileStore* settingsStore = CDictionaryFileStore::OpenLC(
hgs
parents:
diff changeset
   949
                iEnv->FsSession(), KSettingsFileName, KUidPerfMon);
hgs
parents:
diff changeset
   950
hgs
parents:
diff changeset
   951
        SaveDFSValueL(settingsStore, KPMSettingHeartBeat, iSettings.iHeartBeat);
hgs
parents:
diff changeset
   952
        SaveDFSValueL(settingsStore, KPMSettingMaxSamples,
hgs
parents:
diff changeset
   953
                iSettings.iMaxSamples);
hgs
parents:
diff changeset
   954
        SaveDFSValueL(settingsStore, KPMSettingPriority, iSettings.iPriority);
hgs
parents:
diff changeset
   955
        SaveDFSValueL(settingsStore, KPMSettingCPUMode, iSettings.iCPUMode);
hgs
parents:
diff changeset
   956
        SaveDFSValueL(settingsStore, KPMSettingKeepBackLightOn,
hgs
parents:
diff changeset
   957
                iSettings.iKeepBacklightOn);
hgs
parents:
diff changeset
   958
hgs
parents:
diff changeset
   959
        SaveDFSValueL(settingsStore, KPMSettingDataPopupVisbility,
hgs
parents:
diff changeset
   960
                iSettings.iDataPopupVisibility);
hgs
parents:
diff changeset
   961
        SaveDFSValueL(settingsStore, KPMSettingDataPopupLocation,
hgs
parents:
diff changeset
   962
                iSettings.iDataPopupLocation);
hgs
parents:
diff changeset
   963
        SaveDFSValueL(settingsStore, KPMSettingDataPopupSources,
hgs
parents:
diff changeset
   964
                iSettings.iDataPopupSources);
hgs
parents:
diff changeset
   965
hgs
parents:
diff changeset
   966
        SaveDFSValueL(settingsStore, KPMSettingGraphsVerticalBarPeriod,
hgs
parents:
diff changeset
   967
                iSettings.iGraphsVerticalBarPeriod);
hgs
parents:
diff changeset
   968
        SaveDFSValueL(settingsStore, KPMSettingGraphsSources,
hgs
parents:
diff changeset
   969
                iSettings.iGraphsSources);
hgs
parents:
diff changeset
   970
hgs
parents:
diff changeset
   971
        SaveDFSValueL(settingsStore, KPMSettingLoggingMode,
hgs
parents:
diff changeset
   972
                iSettings.iLoggingMode);
hgs
parents:
diff changeset
   973
        SaveDFSValueL(settingsStore, KPMSettingLoggingFilePath,
hgs
parents:
diff changeset
   974
                iSettings.iLoggingFilePath);
hgs
parents:
diff changeset
   975
        SaveDFSValueL(settingsStore, KPMSettingLoggingSources,
hgs
parents:
diff changeset
   976
                iSettings.iLoggingSources);
hgs
parents:
diff changeset
   977
hgs
parents:
diff changeset
   978
        SaveDFSValueL(settingsStore, KPMSettingPowerMonitoringEnabled,
hgs
parents:
diff changeset
   979
                iSettings.iPowerMonitoringEnabled);
hgs
parents:
diff changeset
   980
hgs
parents:
diff changeset
   981
        settingsStore->CommitL();
hgs
parents:
diff changeset
   982
        CleanupStack::PopAndDestroy(); // settingsStore
hgs
parents:
diff changeset
   983
        }
hgs
parents:
diff changeset
   984
    }
hgs
parents:
diff changeset
   985
hgs
parents:
diff changeset
   986
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   987
hgs
parents:
diff changeset
   988
void CPerfMonEngine::LoadDFSValueL(CDictionaryFileStore* aDicFS,
hgs
parents:
diff changeset
   989
        const TUid& aUid, TInt& aValue)
hgs
parents:
diff changeset
   990
    {
hgs
parents:
diff changeset
   991
    if (aDicFS->IsPresentL(aUid))
hgs
parents:
diff changeset
   992
        {
hgs
parents:
diff changeset
   993
        RDictionaryReadStream in;
hgs
parents:
diff changeset
   994
        in.OpenLC(*aDicFS, aUid);
hgs
parents:
diff changeset
   995
        aValue = in.ReadInt16L();
hgs
parents:
diff changeset
   996
        CleanupStack::PopAndDestroy(); // in        
hgs
parents:
diff changeset
   997
        }
hgs
parents:
diff changeset
   998
    }
hgs
parents:
diff changeset
   999
hgs
parents:
diff changeset
  1000
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1001
hgs
parents:
diff changeset
  1002
void CPerfMonEngine::LoadDFSValueL(CDictionaryFileStore* aDicFS,
hgs
parents:
diff changeset
  1003
        const TUid& aUid, TDes& aValue)
hgs
parents:
diff changeset
  1004
    {
hgs
parents:
diff changeset
  1005
    if (aDicFS->IsPresentL(aUid))
hgs
parents:
diff changeset
  1006
        {
hgs
parents:
diff changeset
  1007
        RDictionaryReadStream in;
hgs
parents:
diff changeset
  1008
        in.OpenLC(*aDicFS, aUid);
hgs
parents:
diff changeset
  1009
        TInt bufLength = in.ReadInt16L(); // get length of descriptor
hgs
parents:
diff changeset
  1010
        in.ReadL(aValue, bufLength); // get the descriptor itself
hgs
parents:
diff changeset
  1011
        CleanupStack::PopAndDestroy(); // in
hgs
parents:
diff changeset
  1012
        }
hgs
parents:
diff changeset
  1013
    }
hgs
parents:
diff changeset
  1014
hgs
parents:
diff changeset
  1015
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1016
hgs
parents:
diff changeset
  1017
void CPerfMonEngine::LoadDFSValueL(CDictionaryFileStore* aDicFS,
hgs
parents:
diff changeset
  1018
        const TUid& aUid, TPerfMonSources& aValue)
hgs
parents:
diff changeset
  1019
    {
hgs
parents:
diff changeset
  1020
    if (aDicFS->IsPresentL(aUid))
hgs
parents:
diff changeset
  1021
        {
hgs
parents:
diff changeset
  1022
        RDictionaryReadStream in;
hgs
parents:
diff changeset
  1023
        in.OpenLC(*aDicFS, aUid);
hgs
parents:
diff changeset
  1024
        TInt bufLength = in.ReadInt16L(); // get length of the array
hgs
parents:
diff changeset
  1025
hgs
parents:
diff changeset
  1026
        if (bufLength < 0 || bufLength > ESourcesLength) // check for validaty
hgs
parents:
diff changeset
  1027
            User::Leave(KErrNotSupported);
hgs
parents:
diff changeset
  1028
hgs
parents:
diff changeset
  1029
        for (TInt i = 0; i < bufLength; i++) // get all items
hgs
parents:
diff changeset
  1030
            aValue.iSrcEnabled[i] = in.ReadInt16L();
hgs
parents:
diff changeset
  1031
hgs
parents:
diff changeset
  1032
        CleanupStack::PopAndDestroy(); // in
hgs
parents:
diff changeset
  1033
        }
hgs
parents:
diff changeset
  1034
    }
hgs
parents:
diff changeset
  1035
hgs
parents:
diff changeset
  1036
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1037
hgs
parents:
diff changeset
  1038
void CPerfMonEngine::SaveDFSValueL(CDictionaryFileStore* aDicFS,
hgs
parents:
diff changeset
  1039
        const TUid& aUid, const TInt& aValue)
hgs
parents:
diff changeset
  1040
    {
hgs
parents:
diff changeset
  1041
    RDictionaryWriteStream out;
hgs
parents:
diff changeset
  1042
    out.AssignLC(*aDicFS, aUid);
hgs
parents:
diff changeset
  1043
    out.WriteInt16L(aValue);
hgs
parents:
diff changeset
  1044
    out.CommitL();
hgs
parents:
diff changeset
  1045
    CleanupStack::PopAndDestroy(); // out
hgs
parents:
diff changeset
  1046
    }
hgs
parents:
diff changeset
  1047
hgs
parents:
diff changeset
  1048
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1049
hgs
parents:
diff changeset
  1050
void CPerfMonEngine::SaveDFSValueL(CDictionaryFileStore* aDicFS,
hgs
parents:
diff changeset
  1051
        const TUid& aUid, const TDes& aValue)
hgs
parents:
diff changeset
  1052
    {
hgs
parents:
diff changeset
  1053
    RDictionaryWriteStream out;
hgs
parents:
diff changeset
  1054
    out.AssignLC(*aDicFS, aUid);
hgs
parents:
diff changeset
  1055
    out.WriteInt16L(aValue.Length()); // write length of the descriptor
hgs
parents:
diff changeset
  1056
    out.WriteL(aValue, aValue.Length()); // write the descriptor itself
hgs
parents:
diff changeset
  1057
    out.CommitL();
hgs
parents:
diff changeset
  1058
    CleanupStack::PopAndDestroy(); // out
hgs
parents:
diff changeset
  1059
    }
hgs
parents:
diff changeset
  1060
hgs
parents:
diff changeset
  1061
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1062
hgs
parents:
diff changeset
  1063
void CPerfMonEngine::SaveDFSValueL(CDictionaryFileStore* aDicFS,
hgs
parents:
diff changeset
  1064
        const TUid& aUid, const TPerfMonSources& aValue)
hgs
parents:
diff changeset
  1065
    {
hgs
parents:
diff changeset
  1066
    RDictionaryWriteStream out;
hgs
parents:
diff changeset
  1067
    out.AssignLC(*aDicFS, aUid);
hgs
parents:
diff changeset
  1068
hgs
parents:
diff changeset
  1069
    out.WriteInt16L(ESourcesLength); // write length of the array
hgs
parents:
diff changeset
  1070
hgs
parents:
diff changeset
  1071
    for (TInt i = 0; i < ESourcesLength; i++) // write all items
hgs
parents:
diff changeset
  1072
        out.WriteInt16L(aValue.iSrcEnabled[i]);
hgs
parents:
diff changeset
  1073
hgs
parents:
diff changeset
  1074
    out.CommitL();
hgs
parents:
diff changeset
  1075
    CleanupStack::PopAndDestroy(); // out
hgs
parents:
diff changeset
  1076
    }
hgs
parents:
diff changeset
  1077
hgs
parents:
diff changeset
  1078
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1079
hgs
parents:
diff changeset
  1080
void CPerfMonEngine::ActivatePowerMonitoringL()
hgs
parents:
diff changeset
  1081
    {
hgs
parents:
diff changeset
  1082
    if (!iPowerClient)
hgs
parents:
diff changeset
  1083
        {
hgs
parents:
diff changeset
  1084
        iPowerClient = CPerfMonPowerListener::NewL();
hgs
parents:
diff changeset
  1085
        }
hgs
parents:
diff changeset
  1086
hgs
parents:
diff changeset
  1087
    // disable power monitoring if initialization fails
hgs
parents:
diff changeset
  1088
    TInt err = iPowerClient->Activate();
hgs
parents:
diff changeset
  1089
    if (err != KErrNone )
hgs
parents:
diff changeset
  1090
        {
hgs
parents:
diff changeset
  1091
        DeActivatePowerMonitoring();
hgs
parents:
diff changeset
  1092
hgs
parents:
diff changeset
  1093
        iSettings.iPowerMonitoringEnabled = EFalse;
hgs
parents:
diff changeset
  1094
        }
hgs
parents:
diff changeset
  1095
    }
hgs
parents:
diff changeset
  1096
hgs
parents:
diff changeset
  1097
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1098
hgs
parents:
diff changeset
  1099
void CPerfMonEngine::DeActivatePowerMonitoring()
hgs
parents:
diff changeset
  1100
    {
hgs
parents:
diff changeset
  1101
    if (iPowerClient)
hgs
parents:
diff changeset
  1102
        {
hgs
parents:
diff changeset
  1103
        iPowerClient->DeActivate();
hgs
parents:
diff changeset
  1104
        }
hgs
parents:
diff changeset
  1105
    }
hgs
parents:
diff changeset
  1106
hgs
parents:
diff changeset
  1107
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1108
hgs
parents:
diff changeset
  1109
TInt CPerfMonEngine::SampleEntryPosToSettingPos(TInt aSampleEntryPos)
hgs
parents:
diff changeset
  1110
    {
hgs
parents:
diff changeset
  1111
    TInt settingPos(0); // return position of aSampleEntryPos in settings
hgs
parents:
diff changeset
  1112
    
hgs
parents:
diff changeset
  1113
    if (aSampleEntryPos >= iCPU0PositionInSamples && aSampleEntryPos < iRAMPositionInSamples)
hgs
parents:
diff changeset
  1114
        {
hgs
parents:
diff changeset
  1115
        settingPos = ESourceCPU;
hgs
parents:
diff changeset
  1116
        }
hgs
parents:
diff changeset
  1117
    else if (aSampleEntryPos == iRAMPositionInSamples)
hgs
parents:
diff changeset
  1118
        {
hgs
parents:
diff changeset
  1119
        settingPos = ESourceRAM;
hgs
parents:
diff changeset
  1120
        }
hgs
parents:
diff changeset
  1121
    else
hgs
parents:
diff changeset
  1122
        {
hgs
parents:
diff changeset
  1123
        settingPos = ESourceC + (aSampleEntryPos-iCDrivePositionInSamples);
hgs
parents:
diff changeset
  1124
        }
hgs
parents:
diff changeset
  1125
    
hgs
parents:
diff changeset
  1126
    return settingPos;
hgs
parents:
diff changeset
  1127
    }
hgs
parents:
diff changeset
  1128
hgs
parents:
diff changeset
  1129
// End of File