networkprotocolmodules/common/supldevlogger/src/suplmemlogger.cpp
changeset 0 9cfd9a3ee49c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networkprotocolmodules/common/supldevlogger/src/suplmemlogger.cpp	Tue Feb 02 01:50:39 2010 +0200
@@ -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 <e32base.h>
+#include <flogger.h>
+#include <hal.h>
+#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<CSuplMemoryUsageLogger*>(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<KSuplDevLogMaxBufSize> 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<KSuplDevLogMaxBufSize> logData;
+			logData.Format(KLogMaxHeapFormat, iMaxHeapTotal, iMaxChunkTotal);
+			iLogger.Write(logData);
+			iLogger.Write(KNullDesC8);
+			}
+		iLogger.Close();
+		}
+	}
+