persistentstorage/centralrepository/cenrepsrv/srvperf.cpp
changeset 0 08ec8eefde2f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/persistentstorage/centralrepository/cenrepsrv/srvperf.cpp	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,149 @@
+// Copyright (c) 2005-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:
+//
+
+#include "srvPerf.h"
+
+#ifdef __CENTREP_SERVER_PERFTEST__
+
+#include "srvreqs.h"
+#include "srvsubsess.h"
+
+// SessionClose
+// Decrement reference count. If no more active sessions
+// then advance iLastCompleteAccess
+void TCentRepPerfTest::SessionClose()
+	{
+	iActiveSessionCount--;
+	// There are clients who never close their sessions. Hence
+	// cannot use iActiveSessionCount == 0 as indication to copy
+	// iCount to iLastCompleteAccess.
+
+	if (!IsFinished())
+		{
+		iLastCompleteAccess = iCount;
+		}
+	}
+
+// Append
+// Add the integer if iEntries array is not full yet.
+TInt TCentRepPerfTest::Append(TUint32 aEntry)
+	{
+	if (iCount < KCentRepPerfTestArraySize)
+		{
+		iEntries[iCount++] = aEntry;
+		return KErrNone;
+		}
+	return KErrOverflow;
+	}
+	
+// Function EncodeEventAndData
+// Put event Id in upper 8 bit and data in lower 24 bit.
+inline
+TUint32 EncodeEventAndData(TUint aEventId, TUint32 aData)
+	{
+	return ((aEventId & KEventIdMask) << KEventIdShiftBits) |
+		   (aData & KDataMask);
+	}
+
+// Save initial values of timer
+void TCentRepPerfTest::DoEventStart(CServerSubSession* aSubSession, const TClientRequest& /*aMessage*/)
+	{
+	if(IsFinished())
+		{
+		return;
+		}
+	
+	//set the uid of the repository that this operation will be 
+	//performed on as the current repository
+	if(aSubSession) //aSubSession would be NULL in the case of EInitialise and EClose operations
+		{
+		SetCurrentRepositoryUid(aSubSession->RepositoryUid().iUid);
+		}
+	
+	iStartTick = User::FastCounter();
+	}
+
+// Save initial values of timer
+void TCentRepPerfTest::DoServerStart()
+	{
+	iStartTick = User::FastCounter();
+	}	
+	
+// store time of event, etc. in performance array
+void TCentRepPerfTest::DoServerEnd()
+	{
+	TUint32 endTick = User::FastCounter();
+
+	TServerRequest fn = EInitialiseServer;
+	TUint32 entry = EncodeEventAndData(fn, endTick - iStartTick);
+	Append(entry);
+	}
+
+// store time of event, etc. in performance array
+void TCentRepPerfTest::DoEventEnd(CServerSubSession* /*aSubSession*/, const TClientRequest& aMessage)
+	{
+	TUint32 endTick = User::FastCounter();
+
+	if (IsFinished())
+		{
+		return;
+		}
+
+	TServerRequest fn = static_cast<TServerRequest>(aMessage.Function());
+	// Performance data has 3 parts. First: time spent to
+	// service the request. 2nd if event is open/close/evict
+	// time of the event. 3rd, if open/close/evict repository UID
+
+	// First part: event ID and CPU time spent servicing the request
+	TUint32 entry = EncodeEventAndData(fn, endTick - iStartTick);
+	Append(entry);
+
+	if (fn == EInitialise)
+		{
+		SessionOpen();
+		
+		//store the repository UID in the subsession so that we can refer to it later
+		SetCurrentRepositoryUid(aMessage.Int0());
+		}
+
+	//get the uid of the repository that this operation is being performed on
+	TUint32 currentRepositoryUid = CurrentRepositoryUid();
+	
+	TBool repOpenCloseEvict = fn == EInitialise || fn == EClose || fn == EEvict;
+
+	// Third part: repository UID if event is open/close/evict.
+	if (repOpenCloseEvict)
+		{
+		Append(iStartTick);
+		Append(currentRepositoryUid);  // Append will check if array IsFull.
+		}
+
+	// One last thing to do: check if all concurrent sessions close.
+	if (fn == EClose)
+		{
+		SessionClose();
+
+		// This is a temporary solution to detect end-of-boot until SS code is 
+		// modified to return end-of-boot state and Centrep becomes SSA 
+		if (currentRepositoryUid == 0xCCCCCC00)
+			{
+			IncEndOfBoot();
+			}
+		}
+	}
+	
+
+#endif //__CENTREP_SERVER_PERFTEST__
+