michael@0: /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ michael@0: /* vim: set ts=8 sts=4 et sw=4 tw=80: */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #ifndef _nsMemoryCacheDevice_h_ michael@0: #define _nsMemoryCacheDevice_h_ michael@0: michael@0: #include "nsCacheDevice.h" michael@0: #include "pldhash.h" michael@0: #include "nsCacheEntry.h" michael@0: michael@0: michael@0: class nsMemoryCacheDeviceInfo; michael@0: michael@0: /****************************************************************************** michael@0: * nsMemoryCacheDevice michael@0: ******************************************************************************/ michael@0: class nsMemoryCacheDevice : public nsCacheDevice michael@0: { michael@0: public: michael@0: nsMemoryCacheDevice(); michael@0: virtual ~nsMemoryCacheDevice(); michael@0: michael@0: virtual nsresult Init(); michael@0: virtual nsresult Shutdown(); michael@0: michael@0: virtual const char * GetDeviceID(void); michael@0: michael@0: virtual nsresult BindEntry( nsCacheEntry * entry ); michael@0: virtual nsCacheEntry * FindEntry( nsCString * key, bool *collision ); michael@0: virtual void DoomEntry( nsCacheEntry * entry ); michael@0: virtual nsresult DeactivateEntry( nsCacheEntry * entry ); michael@0: michael@0: virtual nsresult OpenInputStreamForEntry(nsCacheEntry * entry, michael@0: nsCacheAccessMode mode, michael@0: uint32_t offset, michael@0: nsIInputStream ** result); michael@0: michael@0: virtual nsresult OpenOutputStreamForEntry(nsCacheEntry * entry, michael@0: nsCacheAccessMode mode, michael@0: uint32_t offset, michael@0: nsIOutputStream ** result); michael@0: michael@0: virtual nsresult GetFileForEntry( nsCacheEntry * entry, michael@0: nsIFile ** result ); michael@0: michael@0: virtual nsresult OnDataSizeChange( nsCacheEntry * entry, int32_t deltaSize ); michael@0: michael@0: virtual nsresult Visit( nsICacheVisitor * visitor ); michael@0: michael@0: virtual nsresult EvictEntries(const char * clientID); michael@0: nsresult EvictPrivateEntries(); michael@0: michael@0: void SetCapacity(int32_t capacity); michael@0: void SetMaxEntrySize(int32_t maxSizeInKilobytes); michael@0: michael@0: bool EntryIsTooBig(int64_t entrySize); michael@0: michael@0: size_t TotalSize(); michael@0: michael@0: private: michael@0: friend class nsMemoryCacheDeviceInfo; michael@0: enum { DELETE_ENTRY = true, michael@0: DO_NOT_DELETE_ENTRY = false }; michael@0: michael@0: void AdjustMemoryLimits( int32_t softLimit, int32_t hardLimit); michael@0: void EvictEntry( nsCacheEntry * entry , bool deleteEntry); michael@0: void EvictEntriesIfNecessary(); michael@0: int EvictionList(nsCacheEntry * entry, int32_t deltaSize); michael@0: michael@0: typedef bool (*EvictionMatcherFn)(nsCacheEntry* entry, void* args); michael@0: nsresult DoEvictEntries(EvictionMatcherFn matchFn, void* args); michael@0: michael@0: #ifdef DEBUG michael@0: void CheckEntryCount(); michael@0: #endif michael@0: /* michael@0: * Data members michael@0: */ michael@0: enum { michael@0: kQueueCount = 24 // entries > 2^23 (8Mb) start in last queue michael@0: }; michael@0: michael@0: nsCacheEntryHashTable mMemCacheEntries; michael@0: bool mInitialized; michael@0: michael@0: PRCList mEvictionList[kQueueCount]; michael@0: michael@0: int32_t mHardLimit; michael@0: int32_t mSoftLimit; michael@0: michael@0: int32_t mTotalSize; michael@0: int32_t mInactiveSize; michael@0: michael@0: int32_t mEntryCount; michael@0: int32_t mMaxEntryCount; michael@0: int32_t mMaxEntrySize; // internal unit is bytes michael@0: michael@0: // XXX what other stats do we want to keep? michael@0: }; michael@0: michael@0: michael@0: /****************************************************************************** michael@0: * nsMemoryCacheDeviceInfo - used to call nsIVisitor for about:cache michael@0: ******************************************************************************/ michael@0: class nsMemoryCacheDeviceInfo : public nsICacheDeviceInfo { michael@0: public: michael@0: NS_DECL_ISUPPORTS michael@0: NS_DECL_NSICACHEDEVICEINFO michael@0: michael@0: nsMemoryCacheDeviceInfo(nsMemoryCacheDevice* device) michael@0: : mDevice(device) michael@0: { michael@0: } michael@0: michael@0: virtual ~nsMemoryCacheDeviceInfo() {} michael@0: michael@0: private: michael@0: nsMemoryCacheDevice* mDevice; michael@0: }; michael@0: michael@0: michael@0: #endif // _nsMemoryCacheDevice_h_