diff -r 000000000000 -r a41df078684a userlibandfileserver/fileserver/sfile/sf_memory_man.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/userlibandfileserver/fileserver/sfile/sf_memory_man.h Mon Oct 19 15:55:17 2009 +0100 @@ -0,0 +1,109 @@ +// 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 the License "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: +// f32\sfile\sf_memory_man.h +// +// + +/** + @file + @internalTechnology +*/ + +#if !defined(__SF_MEMORY_MAN_H__) +#define __SF_MEMORY_MAN_H__ + +#include + +const TUint KSegmentSizeLog2 = 12; +/** Kernel's memory page size in bytes */ +const TUint KSegmentSize = 1 << KSegmentSizeLog2; + +/** Forward declaration */ +class CCacheMemoryClient; + +/** Cache memory manager class */ +class CCacheMemoryManager : public CBase + { +public: + static CCacheMemoryManager* NewL(TInt aSizeInBytes); + IMPORT_C CCacheMemoryClient* ConnectClientL(const TDesC& aClientName, TUint32 aMinSizeInSegs, TUint32 aMaxSizeInSegs); + IMPORT_C TUint SegmentSizeInBytesLog2() const; + TInt RegisterClient(CCacheMemoryClient* aClient); + TInt AllocateAndLockSegments(TUint8* aStartRamAddr, TInt aSegmentCount); + TInt LockSegments(TUint8* aStartRamAddr, TUint32 aSegmentCount); + TInt UnlockSegments(TUint8* aStartRamAddr, TUint32 aSegmentCount); + TInt DecommitSegments(TUint8* aStartRamAddr, TUint32 aSegmentCount); + TUint8* Base(); + void FreeMemoryChanged(TBool aIsMemoryLow); + +private: + ~CCacheMemoryManager(); + CCacheMemoryManager(TUint32 aMaxSize); + void ConstructL(); + TInt Lock(TUint8* aStartRamAddr, TInt aSegmentCount); + TInt Unlock(TUint8* aStartRamAddr, TInt aSegmentCount); + TInt Commit(TUint8* aStartRamAddr, TInt aSegmentCountt); + TInt Decommit(TUint8* aStartRamAddr, TInt aSegmentCount); + +private: + RChunk iChunk; ///< the RChunk interface to interact with demand paging sub-system + TUint8* iBase; ///< the base ram address of the manager + TUint32 iSizeInBytes; ///< virtual ram address size in bytes + TUint32 iCurrentOffsetMark; ///< a flag in bytes to record current used virtual address space + TInt iLowMemoryThreshold; ///< a threshold in bytes to flag the low memory condition, data type is aligned with TMemoryInfoV1::iTotalRamInBytes + TBool isMemoryLow; ///< the flag indicates low memory condition + + /** an array holds all the registered clients */ + RPointerArray iRegisteredClients; + + friend class CCacheMemoryManagerFactory; + }; + +/** +The factory class for CCacheMemoryManager +*/ +class CCacheMemoryManagerFactory + { +public: + static void CreateL(); + static void Destroy(); + IMPORT_C static CCacheMemoryManager* CacheMemoryManager(); +private: + static CCacheMemoryManager* iCacheMemoryManager; + }; + +/** +A static class to read cache memory manager settings +*/ +NONSHARABLE_CLASS(TGlobalCacheMemorySettings) + { +public: + static void ReadPropertiesFile(); + + static TInt CacheSize(); + static TInt LowMemoryThreshold(); +private: + static TInt32 iCacheSizeInBytes; + static TInt32 iLowMemoryThreshold; + }; + +/** Default cache memory size in KBytes (32768 KBytes)*/ +const TInt KDefaultGlobalCacheMemorySize = (32 << 10); +/** +Low memory threshold as a percentage of total RAM (10 %) +If the amount of RAM drops below this value, attempts to allocate memory will fail +*/ +const TInt KDefaultLowMemoryThreshold = 10; + +#endif // !defined(__SF_MEMORY_MAN_H__)