diff -r 87622fad6b51 -r a796fdeeb33c networkprotocolmodules/common/supldevlogger/src/suplmemlogger.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/networkprotocolmodules/common/supldevlogger/src/suplmemlogger.cpp Wed Oct 13 16:07:50 2010 +0300 @@ -0,0 +1,209 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +/** + @file + @internalTechnology + +*/ + +#include +#include +#include +#include "suplmemlogger.h" + + +/** Time interval between the first and second updates. */ +const TInt KTimerInitialDelay = 1000000; + +/** Time interval between the second and third and all the other updates. */ +const TInt KTimerInitialInterval = 2000000; + +const TInt KSuplDevLogMaxBufSize = 256; + +_LIT(KSuplDevLogFolder, "lbs"); +_LIT(KHeader, "TIME\tUID\tSTACK SIZE\tHEAP TOTAL\tHEAP AVAIL\tCHUNK TOTAL\tCHUNK AVAIL\tCELLS TOTAL\tCELLS AVAIL\tH/S TOTAL\tRAM TOTAL\tRAM AVAIL"); +_LIT(KLogFormat, "%d\t%x\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d"); + +EXPORT_C CSuplMemoryUsageLogger* CSuplMemoryUsageLogger::NewLC() + { + CSuplMemoryUsageLogger* self = new (ELeave) CSuplMemoryUsageLogger(); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +CSuplMemoryUsageLogger::CSuplMemoryUsageLogger() : + iHeap(User::Heap()) + { + } + +CSuplMemoryUsageLogger::~CSuplMemoryUsageLogger() + { + // Cancel and delete periodic timer + iPeriodic->Cancel(); + delete iPeriodic; + + // Close iLogger handle + iLogger.Write(KNullDesC8); + iLogger.Close(); + + // Write the max params to a separate file + WriteMaxHeapToLog(); + + // Close RProcess handle + iProcess.Close(); + } + +void CSuplMemoryUsageLogger::ConstructL() + { + //create periodic timer object + iPeriodic = CPeriodic::NewL(CActive::EPriorityHigh); + + //get process name + TFileName processFilename(iProcess.FileName()); + + //create log file name out of process name + TInt pos = processFilename.LocateReverse(TChar('\\')); + iFileName = processFilename.Mid(pos + 1); + iFileName = iFileName.Mid(0, iFileName.Length() - 3); + iFileName.Append(_L("txt")); + + //connect to file iLogger + User::LeaveIfError(iLogger.Connect()); + + //get total stack size + RThread currentThread; + TThreadStackInfo stackInfo; + currentThread.StackInfo(stackInfo); + iStackSize = stackInfo.iBase - stackInfo.iLimit; + + //create log file + iLogger.CreateLog(KSuplDevLogFolder, iFileName, EFileLoggingModeAppend); + + //write header to log file + iLogger.SetDateAndTime(ETrue, ETrue); + iLogger.Write(KNullDesC8); + iLogger.SetDateAndTime(EFalse, EFalse); + iLogger.WriteFormat(KHeader); + + //setup time stamp for calculating time passed + iStartTime.UniversalTime(); + + //first write to log file + WriteToLog(); + + //start periodic timer + iPeriodic->Start(KTimerInitialDelay, KTimerInitialInterval, TCallBack(PeriodicCallback, this)); + } + +EXPORT_C void CSuplMemoryUsageLogger::Cancel() + { + iPeriodic->Cancel(); + } + +TInt CSuplMemoryUsageLogger::PeriodicCallback(TAny* aSelf) + { + CSuplMemoryUsageLogger* self = static_cast(aSelf); + self->WriteToLog(); + return KErrNone; + } + +void CSuplMemoryUsageLogger::WriteToLog() + { + //seconds passed since start of application + TTime currentTime; + TTimeIntervalSeconds seconds; + currentTime.UniversalTime(); + currentTime.SecondsFrom(iStartTime, seconds); + + if (seconds.Int() <= 60) + { + TInt heapTotal = 0; + TInt heapAvail = 0; + TInt chunkTotal = 0; + TInt chunkAvail = 0; + TInt cellsTotal = 0; + TInt cellsAvail = 0; + TInt heapStackTotal = 0; + TInt ramTotal = 0; + TInt ramAvail = 0; + + //get system memory info from hardware abstraction layer + HAL::Get(HAL::EMemoryRAM, ramTotal); + HAL::Get(HAL::EMemoryRAMFree, ramAvail); + + //get process UID + TSecureId processUid(iProcess.SecureId()); + + //get various heap and chunk memory sizes + iHeap.AllocSize(heapTotal); + if (heapTotal > iMaxHeapTotal) + { + iMaxHeapTotal = heapTotal; + } + iHeap.Available(heapAvail); + chunkTotal = iHeap.Size(); + chunkAvail = chunkTotal - heapTotal; + if (chunkTotal > iMaxChunkTotal) + { + iMaxChunkTotal = chunkTotal; + } + + //get cells info + cellsTotal = iHeap.Count(cellsAvail); + + //sum up the total heap and stack sizes + heapStackTotal = heapTotal + iStackSize; + + //create log text and write to log file + TBuf16 logData; + logData.Format(KLogFormat, seconds.Int(), processUid.iId, iStackSize, heapTotal, heapAvail, chunkTotal, chunkAvail, cellsTotal, cellsAvail, heapStackTotal, ramTotal, ramAvail); + iLogger.Write(logData); + } + } + +void CSuplMemoryUsageLogger::WriteMaxHeapToLog() + { + _LIT(KLogMaxHeapFormat, "%d, %d"); + + //connect to file iLogger + TInt err = iLogger.Connect(); + if (KErrNone == err) + { + //create new log file name out of existing + TInt pos = iFileName.LocateReverse(TChar('.')); + if (KErrNotFound != pos) + { + iFileName.Insert(pos, _L("_max_ram")); + + //create log file + iLogger.CreateLog(KSuplDevLogFolder, iFileName, EFileLoggingModeOverwrite); + + //write header to log file +// iLogger.SetDateAndTime(ETrue, ETrue); +// iLogger.Write(KNullDesC8); + iLogger.SetDateAndTime(EFalse, EFalse); + + //create log text and write to log file + TBuf16 logData; + logData.Format(KLogMaxHeapFormat, iMaxHeapTotal, iMaxChunkTotal); + iLogger.Write(logData); + iLogger.Write(KNullDesC8); + } + iLogger.Close(); + } + } +