--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/msgsrvnstore/server/inc/msventryfreepool.h Fri Jun 04 10:32:16 2010 +0100
@@ -0,0 +1,215 @@
+// Copyright (c) 2007-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:
+// MACRO DEFINITION
+//
+//
+
+#ifndef __MSVENTRYFREEPOOL_H__
+#define __MSVENTRYFREEPOOL_H__
+
+
+/**
+ * HEADER FILES
+ */
+#include <e32base.h>
+#include "msvcacheentry.h"
+#include "msvcachevisiblefolder.h"
+
+#if !defined(MSVSEARCHSORTCACHEMANAGER_H_)
+#include "msvsearchsortcachemanager.h"
+#endif
+
+
+class CMsvIndexAdapter;
+
+
+/**
+ * The class provides implementation for pool of unused CMsvCacheEntry.
+ * It is a singleton class. A CMsvIndexAdapter instance should create and
+ * delete the instance of this class. It reads a msgcache.ini file which
+ * stores amount of CMsvCacheEntry to be created at startup. The file
+ * can be configured by licencees.
+ * The destructor is made private so that only friend function can delete
+ * the instance of this class. Moreover static function Destroy() should
+ * be called to delete the instance of the class.
+ *
+ @internalComponent
+ @prototype
+ */
+
+NONSHARABLE_CLASS (CMsvEntryFreePool): public CBase
+{
+public:
+ static CMsvEntryFreePool* Instance();
+ CMsvCacheEntry* EntryL();
+ void ReleaseEntry(CMsvCacheEntry* aMsvCacheEntry, TBool aBypassTransaction = EFalse);
+ void ReleaseEntrySet(RPointerArray<CMsvCacheEntry>& aMsvCacheEntryArray);
+ void DoReleaseEntrySetL(RPointerArray<CMsvCacheEntry>& aMsvCacheEntryArray);
+ void SetEssentialParam(TDblQue<CMsvCacheVisibleFolder>* aEntryCache, CMsvIndexAdapter* aAdapterObj);
+ inline void BeginTransaction();
+ void RollbackTransaction();
+ void CommitTransaction();
+ inline TInt ExcessMemoryAllocated();
+ inline void RecordExcessMemoryL(CMsvCacheEntry* aEntry);
+ void FlushExcessMemory();
+ void RoutineFreePoolCleanUpL();
+ void ReleaseEntryWithoutTransaction(CMsvCacheEntry* aMsvCacheEntry);
+
+#ifdef SYMBIAN_MESSAGESTORE_UNIT_TESTCODE
+ inline TInt GetMaximumCacheSize();
+ inline TInt GetGranularity();
+ inline TInt GetCacheThreshold();
+ inline TInt GetCacheNumberOfEntriesCreated();
+ inline TInt GetNumberOfEntriesPresentInFreePool();
+ inline TInt GetMaxEntries();
+ inline TInt GetUsedEntriesCount();
+#endif
+
+
+private:
+ static CMsvEntryFreePool* CreateL(TDblQue<CMsvCacheVisibleFolder>* aEntryCache = NULL);
+ CMsvEntryFreePool(TDblQue<CMsvCacheVisibleFolder>* aEntryCache);
+ CMsvEntryFreePool(const CMsvEntryFreePool&);
+ ~CMsvEntryFreePool();
+ void ConstructL();
+ void SwapEntriesL(TInt aEntriesToSwap);
+ TInt ConvertMemToEntry(TInt aMem);
+ TBool IsAllocationRequiredL();
+ void AllocateMemoryL();
+ TInt CacheSizeL();
+
+#ifdef _DEBUG
+ static void Destroy(CMsvEntryFreePool* aFreePoolInstance);
+#endif
+
+private:
+ static CMsvEntryFreePool* iMsvEntryFreePool;
+ RPointerArray<CMsvCacheEntry>* iMsvEntries;
+ RPointerArray<CMsvCacheEntry> iUsedCacheEntries;
+
+ // Reference to catch object.
+ // Needed for entry swapping.
+ TDblQue<CMsvCacheVisibleFolder>* iEntryCache;
+ CMsvIndexAdapter* iAdapter;
+
+ // Needed for transaction.
+ RPointerArray<CMsvCacheEntry> iMsvTmpEntries;
+ TBool isTransactionOpen;
+
+ TInt iMsvMaximumCacheSize;
+ //TInt iMsvGranularity;
+ TInt iMsvCacheThreshold;
+ TInt iMsvCacheNumberOfEntriesCreated;
+
+ TInt iMsvInitialCacheSize;
+ TInt iMsvCacheIncrement;
+ TInt iMsvPercentageAllocated;
+ TInt iMsvCacheSize;
+ TInt iMsvSearchSortCache;
+ TInt iMsvMaxEntries;
+
+ /**
+ * FRIEND CLASSES:
+ * These classes can access destructor and Destroy().
+ */
+ friend class CMsvIndexAdapter;
+ friend class CMsvServer;
+ friend class CMSvSearchSortCacheManager;
+
+#ifdef SYMBIAN_MESSAGESTORE_UNIT_TESTCODE
+ TBool iReleaseError;
+ TInt iReleaseErrorOffset;
+ friend class CTestEntryFreePool;
+ friend class CTestDbAdapter;
+ friend class CTestIndexTableEntry;
+ friend class CTestVisibleFolder;
+#endif
+};
+
+
+
+
+
+/**
+ *********** INLINE FUNCTIONS ************
+ */
+
+void CMsvEntryFreePool::BeginTransaction()
+ {
+ isTransactionOpen = ETrue;
+ }
+
+
+TInt CMsvEntryFreePool::ExcessMemoryAllocated()
+ {
+ if (iMsvMaxEntries < iMsvCacheNumberOfEntriesCreated)
+ {
+ return (iMsvCacheNumberOfEntriesCreated - iMsvMaxEntries);
+ }
+ return NULL;
+ }
+
+
+/**
+ * RecordExcessMemoryL()
+ */
+void CMsvEntryFreePool::RecordExcessMemoryL(CMsvCacheEntry* aEntry)
+ {
+ if(aEntry)
+ {
+ iUsedCacheEntries.AppendL(aEntry);
+ }
+ }
+
+
+
+#ifdef SYMBIAN_MESSAGESTORE_UNIT_TESTCODE
+TInt CMsvEntryFreePool::GetMaximumCacheSize()
+ {
+ return iMsvMaximumCacheSize;
+ }
+
+
+TInt CMsvEntryFreePool::GetCacheThreshold()
+ {
+ return iMsvCacheThreshold;
+ }
+
+
+TInt CMsvEntryFreePool::GetCacheNumberOfEntriesCreated()
+ {
+ return iMsvCacheNumberOfEntriesCreated;
+ }
+
+
+TInt CMsvEntryFreePool::GetNumberOfEntriesPresentInFreePool()
+ {
+ return iMsvEntries->Count();
+ }
+
+TInt CMsvEntryFreePool::GetMaxEntries()
+ {
+ return iMsvMaxEntries;
+ }
+
+TInt CMsvEntryFreePool::GetUsedEntriesCount()
+ {
+ return iUsedCacheEntries.Count();
+ }
+
+#endif
+
+
+
+#endif