2014-04-10 03:47:20 -07:00
|
|
|
/* 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;
|
|
|
|
PRTime mTimeStamp; // in milliseconds
|
|
|
|
nsRefPtr<CacheIndexIterator> mIterator;
|
|
|
|
};
|
|
|
|
|
|
|
|
class CacheFileContextEvictor
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(CacheFileContextEvictor)
|
|
|
|
|
|
|
|
CacheFileContextEvictor();
|
2014-06-20 04:08:24 -07:00
|
|
|
|
|
|
|
private:
|
2014-04-10 03:47:20 -07:00
|
|
|
virtual ~CacheFileContextEvictor();
|
|
|
|
|
2014-06-20 04:08:24 -07:00
|
|
|
public:
|
2014-04-10 03:47:20 -07:00
|
|
|
nsresult Init(nsIFile *aCacheDirectory);
|
|
|
|
|
|
|
|
// Returns number of contexts that are being evicted.
|
|
|
|
uint32_t ContextsCount();
|
|
|
|
// Start evicting given context.
|
|
|
|
nsresult AddContext(nsILoadContextInfo *aLoadContextInfo);
|
|
|
|
// 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 *_retval);
|
|
|
|
|
|
|
|
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);
|
|
|
|
// Once we are done with eviction for the given context, the eviction info is
|
|
|
|
// removed from the disk.
|
|
|
|
nsresult RemoveEvictInfoFromDisk(nsILoadContextInfo *aLoadContextInfo);
|
|
|
|
// Tries to load all contexts from the disk. This method is called just once
|
|
|
|
// after startup.
|
|
|
|
nsresult LoadEvictInfoFromDisk();
|
|
|
|
nsresult GetContextFile(nsILoadContextInfo *aLoadContextInfo,
|
|
|
|
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;
|
|
|
|
};
|
|
|
|
|
|
|
|
} // net
|
|
|
|
} // mozilla
|
|
|
|
|
|
|
|
#endif
|