libraries/qr3/src/threadListboxdata.cpp
changeset 0 7f656887cf89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libraries/qr3/src/threadListboxdata.cpp	Wed Jun 23 15:52:26 2010 +0100
@@ -0,0 +1,204 @@
+// threadListboxdata.cpp
+// 
+// Copyright (c) 2010 Accenture. All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the "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:
+// Accenture - Initial contribution
+//
+#include "KernLbxModel.h"
+#include "Utils.h"
+#include <fshell/clogger.h>
+#include <fshell/memoryaccess.h>
+#include <fshell/qr3dll.h>
+#include "QResources3.hrh"
+#include <fshell/heaputils.h>
+
+CThreadsListBoxData::CThreadsListBoxData(CKernListBoxModel* aModel)
+	: CKernListBoxData(aModel)
+	{
+	}
+
+void CThreadsListBoxData::DoFormatL(TObjectKernelInfo* aInfo, RBuf& name, RBuf& more, TInt& itemId)
+	{
+	TThreadKernelInfo& info = *(TThreadKernelInfo*)aInfo;
+	name.Copy(info.iFullName);
+	PrettyName(iType, name);
+
+	TUint tid = info.iThreadId;
+	TExitType exitType = EExitPending;
+	RThread thread;
+	if (Model().MemAccess().RThreadForceOpen(thread, tid) == KErrNone)
+		{
+		exitType = thread.ExitType();
+		}
+	if (exitType == EExitPending)
+		{
+		more.Format(_L("Tid %i"), tid);
+		}
+	else
+		{
+		TExitCategoryName cat = thread.ExitCategory();
+		more.Format(_L("Tid %i %S %i"), tid, &cat, thread.ExitReason());
+		}
+	thread.Close();
+	itemId = tid;
+	}
+
+void CThreadsListBoxData::DumpToCloggerL(RClogger& clogger, TInt i, TInt /*count*/)
+	{
+	_LIT8(KThreadDesc,"Thread;FullName;Tid;Priority;(PriorityHumanReadable);ParentPid;StackSize;(StackSizeHumanReadable);HeapSize;(HeapSizeHumanReadable);MinHeapSize;(MinHumanReadable);UnusedPages;LostBytes;(LostBytesHumanReadable);ExitStatus;ExitCategory;ExitReason;KernObjAddr");
+	_LIT8(KThreadFmt,"Thread;%S;%i;%i;(%S);%i;%i;(%S);%i;(%S);%i;(%S);%i;%i;(%S);%S;%S;%i;%x");
+	//                                                    ^ HeapSizeHumanReadable
+	if (i == 0) clogger.Log(KThreadDesc);
+	TThreadKernelInfo& info = *(TThreadKernelInfo*)iInfo;
+
+	TBuf<16> priority16 = ToString((TThreadPriority)info.iThreadPriority);
+	TPtr8 priority = priority16.Collapse();
+	
+	LtkUtils::RProxyAllocatorHelper allocHelper;
+	User::LeaveIfError(allocHelper.Open(Model().MemAccess(), info.iThreadId));
+	TBuf8<16> heapSize, minHeap, lostBytes, stackSize;
+	HR(heapSize, allocHelper.CommittedSize());
+	HR(stackSize, info.iUserStackSize);
+	HR(minHeap, allocHelper.MinCommittedSize());
+	TInt lostBytesCount = allocHelper.CommittedFreeSpace();
+	HR(lostBytes, lostBytesCount);
+	TInt parentPid = 0; //TODO
+	TPtrC exitStatus;
+	TInt exitReason = 0;
+	TExitCategoryName exitCategory;
+	RThread handle;
+	if (Model().MemAccess().RThreadForceOpen(handle, info.iThreadId) == KErrNone)
+		{
+		exitStatus.Set(ToString(handle.ExitType()));
+		exitCategory = handle.ExitCategory();
+		exitReason = handle.ExitReason();
+		handle.Close();
+		}
+	TBuf8<16> exitStatus8;
+	exitStatus8.Copy(exitStatus);
+	TPtrC8 exitCategory8 = exitCategory.Collapse();
+	clogger.Log(KThreadFmt, &info.iFullName, info.iThreadId, info.iThreadPriority, &priority, parentPid, info.iUserStackSize, &stackSize, allocHelper.CommittedSize(), &heapSize, allocHelper.MinCommittedSize(), &minHeap, allocHelper.CountUnusedPages(), lostBytesCount, &lostBytes, &exitStatus8, &exitCategory8, exitReason, info.iAddressOfKernelObject);
+	allocHelper.Close();
+	}
+
+void CThreadsListBoxData::DoInfoForDialogL(RBuf& aTitle, RBuf& inf, TDes* aTemp)
+	{
+	TThreadKernelInfo& info = *(TThreadKernelInfo*)iInfo;
+	RThread thread;
+	RProcess process;
+	TInt err = Model().MemAccess().RThreadForceOpen(thread, info.iThreadId);
+	if (!err)
+		{
+		err = thread.Process(process);
+		}
+	TUint processId = err;
+	if (!err)
+		{
+		processId = (TUint)process.Id();
+		}
+	CleanupClosePushL(thread);
+	CleanupClosePushL(process);
+
+	_LIT(KInfo, "Thread info");
+	aTitle.Copy(KInfo);
+	inf.Copy(iInfo->iFullName);
+	inf.Append(Klflf);
+	
+	_LIT(KThread, "Tid: %d Pid: %d Kern Priority: %d\nPriority: %d (%S)\nProc Priority: %d (%S)");
+	_LIT(KCritical, "\n%S");
+	_LIT(KCreator, "\nCreator thread id: %d (%S)");
+	_LIT(KKern, "\nKernel object address: 0x%08x");
+	_LIT(KStack, "\n\nUser stack size: %S");
+	_LIT(KHeap, "\nAllocator: 0x%08x\nHeap size: %S (%d)\nMin/Max: %S/%S\nUnused: %S Usable: %S");
+	_LIT(KDied, "\n\nDied with: %S %S %i");
+
+	TThreadPriority threadPriority = (TThreadPriority)err;
+	TProcessPriority processPriority = (TProcessPriority)err;
+	TPtrC priority = _L("?");
+	TPtrC priorityP = _L("?");
+	if (!err)
+		{
+		threadPriority = thread.Priority();
+		priority.Set(ToString(threadPriority));
+		processPriority = process.Priority();
+		priorityP.Set(ToString(processPriority));
+		}
+	LtkUtils::RProxyAllocatorHelper allocHelper;
+	User::LeaveIfError(allocHelper.Open(Model().MemAccess(), info.iThreadId));
+	TBuf<16> heapSize, minHeap, maxHeap, unusedMem, reclaimableMem, stackSize;
+	HR(heapSize, allocHelper.CommittedSize());
+	HR(stackSize, info.iUserStackSize);
+	HR(minHeap, allocHelper.MinCommittedSize());
+	HR(maxHeap, allocHelper.MaxCommittedSize());
+	HR(unusedMem, allocHelper.CommittedFreeSpace());
+	HR(reclaimableMem, allocHelper.CountUnusedPages() * 4096);
+	inf.AppendFormat(KThread, info.iThreadId, processId, info.iThreadPriority, threadPriority, &priority, processPriority, &priorityP);
+
+	TUint creatorTid = Model().MemAccess().GetThreadCreatorId(info.iThreadId);
+	if (creatorTid != 0)
+		{
+		RThread creator;
+		TInt err = Model().MemAccess().RThreadForceOpen(creator, creatorTid);
+		*aTemp = _L("?");
+		if (err == KErrNone)
+			{
+			*aTemp = creator.FullName();
+			PrettyName(iType, *aTemp);
+			creator.Close();
+			}
+		inf.AppendFormat(KCreator, creatorTid, aTemp);
+		}
+
+	User::TCritical crit = User::ENotCritical;
+	if (!err)
+		{
+		crit = User::Critical(thread);
+		}
+	if (crit != User::ENotCritical)
+		{
+		TPtrC critical = ToString(crit);
+		inf.AppendFormat(KCritical, &critical);
+		}
+	inf.AppendFormat(KKern, info.iAddressOfKernelObject);
+
+	inf.AppendFormat(KStack, &stackSize);
+	inf.AppendFormat(KHeap, allocHelper.AllocatorAddress(), &heapSize, allocHelper.CommittedSize(), &minHeap, &maxHeap, &unusedMem, &reclaimableMem);
+	allocHelper.Close();
+	if (err == KErrNone && thread.ExitType() != EExitPending)
+		{
+		TPtrC exitStatus;
+		TInt exitReason = 0;
+		TExitCategoryName exitCategory;
+		exitStatus.Set(ToString(thread.ExitType()));
+		if (thread.ExitType() == EExitPanic)
+			{
+			exitCategory = thread.ExitCategory();
+			}
+		exitReason = thread.ExitReason();
+		inf.AppendFormat(KDied, &exitStatus, &exitCategory, exitReason);
+		}
+	CleanupStack::PopAndDestroy(2, &thread);
+	}
+
+TBool CThreadsListBoxData::SupportsCommand(TInt aCommand)
+	{
+	switch (aCommand)
+		{
+		case ECmdHandleInfo:
+		case ECmdKill:
+		case ECmdDumpHeap:
+		case ECmdSetCritical:
+		case ECmdSetPriority:
+		case ECmdPoll:
+			return ETrue;
+		default:
+			return EFalse;
+		}
+	}
+
+