diff options
Diffstat (limited to 'netwerk/cache2/CacheFileContextEvictor.h')
-rw-r--r-- | netwerk/cache2/CacheFileContextEvictor.h | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/netwerk/cache2/CacheFileContextEvictor.h b/netwerk/cache2/CacheFileContextEvictor.h new file mode 100644 index 000000000..f5fd49eca --- /dev/null +++ b/netwerk/cache2/CacheFileContextEvictor.h @@ -0,0 +1,96 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef CacheFileContextEvictor__h__ +#define CacheFileContextEvictor__h__ + +#include "nsTArray.h" +#include "nsCOMPtr.h" +#include "nsAutoPtr.h" + +class nsIFile; +class nsILoadContextInfo; + +namespace mozilla { +namespace net { + +class CacheIndexIterator; + +struct CacheFileContextEvictorEntry +{ + nsCOMPtr<nsILoadContextInfo> mInfo; + bool mPinned; + PRTime mTimeStamp; // in milliseconds + RefPtr<CacheIndexIterator> mIterator; +}; + +class CacheFileContextEvictor +{ +public: + NS_INLINE_DECL_THREADSAFE_REFCOUNTING(CacheFileContextEvictor) + + CacheFileContextEvictor(); + +private: + virtual ~CacheFileContextEvictor(); + +public: + nsresult Init(nsIFile *aCacheDirectory); + + // Returns number of contexts that are being evicted. + uint32_t ContextsCount(); + // Start evicting given context. + nsresult AddContext(nsILoadContextInfo *aLoadContextInfo, bool aPinned); + // CacheFileIOManager calls this method when CacheIndex's state changes. We + // check whether the index is up to date and start or stop evicting according + // to index's state. + nsresult CacheIndexStateChanged(); + // CacheFileIOManager calls this method to check whether an entry file should + // be considered as evicted. It returns true when there is a matching context + // info to the given key and the last modified time of the entry file is + // earlier than the time stamp of the time when the context was added to the + // evictor. + nsresult WasEvicted(const nsACString &aKey, nsIFile *aFile, + bool *aEvictedAsPinned, bool *aEvictedAsNonPinned); + +private: + // Writes information about eviction of the given context to the disk. This is + // done for every context added to the evictor to be able to recover eviction + // after a shutdown or crash. When the context file is found after startup, we + // restore mTimeStamp from the last modified time of the file. + nsresult PersistEvictionInfoToDisk(nsILoadContextInfo *aLoadContextInfo, bool aPinned); + // Once we are done with eviction for the given context, the eviction info is + // removed from the disk. + nsresult RemoveEvictInfoFromDisk(nsILoadContextInfo *aLoadContextInfo, bool aPinned); + // Tries to load all contexts from the disk. This method is called just once + // after startup. + nsresult LoadEvictInfoFromDisk(); + nsresult GetContextFile(nsILoadContextInfo *aLoadContextInfo, bool aPinned, + nsIFile **_retval); + + void CreateIterators(); + void CloseIterators(); + void StartEvicting(); + nsresult EvictEntries(); + + // Whether eviction is in progress + bool mEvicting; + // Whether index is up to date. We wait with eviction until the index finishes + // update process when it is outdated. NOTE: We also stop eviction in progress + // when the index is found outdated, the eviction is restarted again once the + // update process finishes. + bool mIndexIsUpToDate; + // Whether we already tried to restore unfinished jobs from previous run after + // startup. + static bool sDiskAlreadySearched; + // Array of contexts being evicted. + nsTArray<nsAutoPtr<CacheFileContextEvictorEntry> > mEntries; + nsCOMPtr<nsIFile> mCacheDirectory; + nsCOMPtr<nsIFile> mEntriesDir; +}; + +} // namespace net +} // namespace mozilla + +#endif |