diff -r a41df078684a -r 4122176ea935 userlibandfileserver/fileserver/sfat32/sl_cache.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/userlibandfileserver/fileserver/sfat32/sl_cache.h Mon Dec 21 16:14:42 2009 +0000 @@ -0,0 +1,202 @@ +// Copyright (c) 1996-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\sfat32\inc\sl_cache.h +// +// + +/** + @file + @internalTechnology +*/ + +#ifndef SL_CACHE_H +#define SL_CACHE_H + + +//--------------------------------------------------------------------------------------------------------------------------------- +//-- dedicated FAT directory cache related stuff + +//-- if defined, a dedicated cache will be used for FAT directories +#define ENABLE_DEDICATED_DIR_CACHE + +//--------------------------------------------------------------------------------------------------------------------------------- + + +/** + An abstract interface to the media Write-Through cache +*/ +class MWTCacheInterface + { +public: + + /** Enums for control functions. See Control() */ + enum TControl + { + EDisableCache = 0, ///< disable/enable cache, can be used for debug purposes + EDumpCache = 1, ///< print full cache content, can be used for debug purposes + ECacheInfo = 2, ///< print cache info, can be used for debug purposes + }; + + virtual ~MWTCacheInterface() {} + + /** the same meaning and parameters as in CRawDisk::ReadL */ + virtual void ReadL(TInt64 aPos, TInt aLength, TDes8& aDes)=0; + + /** the same meaning and parameters as in CRawDisk::WriteL */ + virtual void WriteL(TInt64 aPos,const TDesC8& aDes)=0; + + /** Invalidates whole directory cache*/ + virtual void InvalidateCache(void)=0; + + /** invalidate a single cache page if the aPos is cached*/ + virtual void InvalidateCachePage(TUint64 aPos)=0; + + /** + Finds out if the media position "aPosToSearch" is in the cache and returns cache page information in this case. + + @param aPosToSearch linear media position to lookup in the cache + @param aCachedPosStart if "aPosToSearch" is cached, here will be media position of this page start + + @return 0 if aPosToSearch isn't cached, otherwise cache page size in bytes (see also aCachedPosStart). + */ + virtual TUint32 PosCached(const TInt64& aPosToSearch, TInt64& aCachedPosStart) = 0; + + /** + @return size of the cache in bytes. Can be 0. + */ + virtual TUint32 CacheSizeInBytes() const = 0; + + /** + Make the page indexed by aPos the MRU page in the cache. + Assumes cache evicts pages according to LRU algorithm. + */ + virtual void MakePageMRU(TInt64 aPos) = 0; + + /** + @return log2 number of the size of the cache in bytes. + */ + virtual TUint32 PageSizeInBytesLog2() const = 0; + + /** + Control method. + + @param aFunction control function + @param aParam1 just arbitrary parameter + @param aParam2 just arbitrary parameter + @return Standard error code. + */ + virtual TInt Control(TUint32 aFunction, TUint32 aParam1, TAny* aParam2)=0; + + /** + Set cache base position at aBasePos + @param aBasePos base position of the cache pages. Affects pages alignment. + */ + virtual void SetCacheBasePos(TInt64 aBasePos)=0; + + }; + +//--------------------------------------------------------------------------------------------------------------------------------- + +/** +This class represents the media Write-Through cache page +*/ +class CWTCachePage + { +public: + + static CWTCachePage* NewL(TUint32 aPageSizeLog2); + void ConstructL(TUint32 aPageSizeLog2); + + ~CWTCachePage(); + + inline TBool PosCached(TInt64 aPos) const; + inline TUint32 PosInCachePage(TInt64 aPos) const; + inline TUint8* PtrInCachePage(TInt64 aPos) const; + inline TUint32 PageSize() const; + +protected: + + CWTCachePage(); + CWTCachePage(const CWTCachePage&); + CWTCachePage& operator=(const CWTCachePage&); + +public: + + TInt32 iValid; ///< 0 if the page doesn't contain valid data + TInt64 iStartPos; ///< cache page base media position + RBuf8 iData; ///< page Data + }; + +//--------------------------------------------------------------------------------------------------------------------------------- + +/** + Media Write-through cache. +*/ +class CMediaWTCache : public CBase, public MWTCacheInterface + { +public: + ~CMediaWTCache(); + + static CMediaWTCache* NewL(TFatDriveInterface& aDrive, TUint32 aNumPages, TUint32 aPageSizeLog2); + + void ConstructL(TUint32 aNumPages, TUint32 aPageSizeLog2); + + //-- overloads from the base class + void ReadL (TInt64 aPos,TInt aLength,TDes8& aDes); + void WriteL(TInt64 aPos,const TDesC8& aDes); + void InvalidateCache(void); + void InvalidateCachePage(TUint64 aPos); + + + TUint32 PosCached(const TInt64& aPosToSearch, TInt64& aCachedPosStart); + TUint32 CacheSizeInBytes() const; + void MakePageMRU(TInt64 aPos); + TUint32 PageSizeInBytesLog2() const; + TInt Control(TUint32 aFunction, TUint32 aParam1, TAny* aParam2); + inline void SetCacheBasePos(TInt64 aBasePos); + //-- + +protected: + CMediaWTCache(); + CMediaWTCache(TFatDriveInterface& aDrive); + + inline TInt64 CalcPageStartPos(TInt64 aPos) const; + inline TUint32 PageSize() const; + + void MakePageLRU(TInt aPageNo); + + TInt FindPageByPos(TInt64 aPos) const; + TUint32 GrabPage() const; + TUint32 GrabReadPageL(TInt64 aPos); + TUint32 FindOrGrabReadPageL(TInt64 aPos); + +protected: + TFatDriveInterface& iDrive; ///< reference to the driver for media access + TUint32 iPageSizeLog2; ///< Log2 (cache page size) + mutable TBool iAllPagesValid;///< ETrue if all cache pages have valid data + TInt64 iCacheBasePos; ///< Cache pages base position, used to align them at cluster size + RPointerArray iPages; ///< array of pointers to the cache pages. Used for organising LRU list + TUint32 iCacheDisabled :1; ///< if not 0 the cache is disabled totally and all reads and writes go via TFatDriveInterface directly + }; + + + + +#include"sl_cache.inl" + +#endif //SL_CACHE_H + + + +