userlibandfileserver/fileserver/sfat/sl_dir_cache.h
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:26:05 +0100
branchRCL_3
changeset 29 743008598095
parent 2 4122176ea935
permissions -rw-r--r--
Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h) Have multiple extension sections in the bld.inf, one for each version of the compiler. The RVCT version building the tools will build the runtime libraries for its version, but make sure we extract all the other versions from zip archives. Also add the archive for RVCT4.

// 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\sfat32\inc\sl_dir_cache.h
// 
//

/**
 @file
 @internalTechnology
*/

//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//!!
//!! WARNING!! DO NOT edit this file !! '\sfat' component is obsolete and is not being used. '\sfat32'replaces it
//!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


#ifndef SL_DIR_CACHE_H
#define SL_DIR_CACHE_H

#include "sf_memory_man.h"
#include "sf_memory_client.h"
#include "sl_cache.h"
#include <e32hashtab.h>

//---------------------------------------------------------------------------------------------------------------------------------
class   CDynamicDirCache;


/**
The dynamic directory cache page class
*/
class TDynamicDirCachePage
    {
public:
    enum TPageType
        {
        EUnknown,
        ELocked,
        EUnlocked,
        EActivePage,
        };

public:
    ~TDynamicDirCachePage();
    static TDynamicDirCachePage* NewL(CDynamicDirCache* aOwnerCache, TInt64 aStartMedPos, TUint8* aStartRamAddr);
    
    inline void SetLocked(TBool);
    inline TBool    IsLocked() const;
    inline TUint8*  StartPtr()  const;
    inline void     SetStartPtr(TUint8* aPtr);
    inline void SetValid(TBool aIsValid);
    inline TBool    IsValid()   const;
    inline void SetPageType(TPageType aType);
    inline TPageType PageType();

    inline TUint32  PageSizeInBytes() const;
    inline TUint32  PageSizeInSegs() const;

    inline void SetPos(TInt64 aPos);
    inline void ResetPos();
    inline TInt64   StartPos()  const;

    inline TUint8*  PtrInPage(TInt64 aPos) const;
    inline TBool    PosCachedInPage(TInt64 aPos) const;

    inline void Deque();

private:
    // declared to disable copying and assignment
    TDynamicDirCachePage& operator=(const TDynamicDirCachePage&);
    TDynamicDirCachePage(const TDynamicDirCachePage&);

    // private constructor, as this class is not supposed to be created on stack
    TDynamicDirCachePage(CDynamicDirCache* aOwnerCache, TInt64 aStartMedPos, TUint8* aStartRamAddr);

public:
    TDblQueLink         iLink;          ///< the embedded link object, see TCachePageList
    TInt64              iStartMedPos;   ///< the starting media address that this page caches
    TUint8*             iStartRamAddr;  ///< the starting ram address that thsi page lives
    CDynamicDirCache*   iOwnerCache;    ///< pointer to the cache that owns this page
    TBool               iValid  :1;     ///< flag to indicate the validity of the page content
    TBool               iLocked :1;     ///< flag to indicate if the page is locked or not
    TPageType           iType;          ///< page type, see TPageType
    };

/**
The lookup table entry class
@see    CDynamicDirCache
*/
class TLookupEntry
    {
    public:
        TLookupEntry(): iPos(0), iRange(0), iPage(NULL) {};
        TLookupEntry(TInt64 aPos, TUint32 aRange, TDynamicDirCachePage* aPage): iPos(aPos), iRange(aRange), iPage(aPage) {};
    public:
        TInt64                  iPos;
        TUint32                 iRange;
        TDynamicDirCachePage*   iPage;
    };

//---------------------------------------------------------------------------------------------------------------------------------
typedef TDblQue<TDynamicDirCachePage> TCachePageList;
/**
Dynamic directory cache.
For now it is directly derived from MWTCacheInterface.
Provides caching FAT directory data.
*/
class CDynamicDirCache : public CBase, public MWTCacheInterface
    {
public:
    ~CDynamicDirCache();
    static CDynamicDirCache* NewL(TFatDriveInterface& aDrive, TUint32 aMinPageNum, TUint32 aMaxPageNum, TUint32 aPageSizeLog2, const TDesC& aClientName);

    //-- 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;
    TInt    Control(TUint32 aFunction, TUint32 aParam1, TAny* aParam2);
    void    SetCacheBasePos(TInt64 aBasePos);
    void    MakePageMRU(TInt64 aPos);
    TUint32 PageSizeInBytesLog2() const;
    
    TUint32 PageSizeInSegs() const;

    // Debugging functions
    void Dump();
    void Info() const;

protected:
    CDynamicDirCache(TFatDriveInterface& aDrive, TUint32 aMinSizeInBytes, TUint32 aMaxSizeInBytes, TUint32 aPageSizeInBytesLog2);
    void ConstructL(const TDesC& aClientName);

    void ReadDataFromSinglePageL(TInt64 aPos, TInt aLength, TDes8& aDes);
    void WriteDataOntoSinglePageL(TInt64 aPos, const TUint8* aData, TUint32 aDataLen);
    TDynamicDirCachePage* FindPageByPos(TInt64 aPos);
    TDynamicDirCachePage* UpdateActivePageL(TInt64 aPos);
    TDynamicDirCachePage* AllocateAndLockNewPageL(TInt64 aStartMedPos);
    TUint8* LockPage(TDynamicDirCachePage* aPage);
    TInt    UnlockPage(TDynamicDirCachePage* aPage);
    TInt    DecommitPage(TDynamicDirCachePage* aPage);
    inline TInt64  CalcPageStartPos(TInt64 aPos) const;
    void CheckThresholds();
    inline TBool CacheIsFull() const;
    inline TUint32 MaxCacheSizeInPages() const;
    TInt DeQueue(TDynamicDirCachePage* aPage);
    TInt AddFirstOntoQueue(TDynamicDirCachePage* aPage, TDynamicDirCachePage::TPageType aType);
    TInt LookupTblRemove(TInt64 aPagePos);
    TInt LookupTblAdd(TDynamicDirCachePage* aPage);
    TDynamicDirCachePage* LookupTblFind(TInt64 aPos);
    TInt ResetPagePos(TDynamicDirCachePage* aPage);
    void MakePageLastLocked(TDynamicDirCachePage* aPage);
    
private:
    TUint32             iPageSizeLog2;      ///< log2 value of cache pages size in bytes
    TUint32             iMinCacheSizeInBytes;   ///< minimum cache data size
    TUint32             iMaxCacheSizeInBytes;   ///< maximum cache data size
    TUint32             iMinSizeInPages;    ///< minimum cache page number
    TUint32             iMaxSizeInPages;    ///< maximum cache page number
    TUint32             iPageSizeInBytes;   ///< cache page size in bytes
    TInt64              iCacheBasePos;      ///< cache pages base position, used to align them at cluster size

    TFatDriveInterface& iDrive;             ///< reference to the driver for media access
    TUint32             iCacheDisabled : 1; ///< if not 0 the cache is disabled totally and all reads and writes go via TFatDriveInterface directly

    TDynamicDirCachePage*   iActivePage;    ///< a unique page in cache, used to read new page before make it MRU or have it replaced
    
    // data structures for LRU page list    
    TCachePageList  iLockedQ;               ///< the locked queue that manages all locked pages, limited by minimum page number
    TCachePageList  iUnlockedQ;             ///< the unlocked queue that manages all locked pages, limited by maximum page number - minimum page number
    TUint32         iLockedQCount;
    TUint32         iUnlockedQCount;

    // data structures for look up table
    THashFunction32<TLookupEntry>   iHashFunction;
    TIdentityRelation<TLookupEntry> iIdentityFunction;
    RHashSet<TLookupEntry>          iLookupTable;   ///< a lookup table that used to speed up page look up

    CCacheMemoryClient* iCacheMemoryClient; ///< interface to cache memory manager
    };

#include"sl_dir_cache.inl"

#endif //SL_DIR_CACHE_H