Bug 999383 - optimize Open and Read inter-thread calls in CacheFileIOManager, r=michal

This commit is contained in:
Honza Bambas 2014-04-26 18:42:07 +02:00
parent cd415d3c36
commit 3c216393ff
6 changed files with 56 additions and 32 deletions

View File

@ -269,7 +269,7 @@ CacheFile::Init(const nsACString &aKey,
mOpeningFile = true;
mListener = aCallback;
rv = CacheFileIOManager::OpenFile(mKey, flags, this);
rv = CacheFileIOManager::OpenFile(mKey, flags, true, this);
if (NS_FAILED(rv)) {
mListener = nullptr;
mOpeningFile = false;

View File

@ -203,7 +203,7 @@ CacheFileChunk::Read(CacheFileHandle *aHandle, uint32_t aLen,
DoMemoryReport(MemorySize());
rv = CacheFileIOManager::Read(aHandle, mIndex * kChunkSize, mRWBuf, aLen,
this);
true, this);
if (NS_WARN_IF(NS_FAILED(rv))) {
rv = mIndex ? NS_ERROR_FILE_CORRUPTED : NS_ERROR_FILE_NOT_FOUND;
SetError(rv);

View File

@ -559,18 +559,22 @@ protected:
class OpenFileEvent : public nsRunnable {
public:
OpenFileEvent(const nsACString &aKey,
uint32_t aFlags,
uint32_t aFlags, bool aResultOnAnyThread,
CacheFileIOListener *aCallback)
: mFlags(aFlags)
, mResultOnAnyThread(aResultOnAnyThread)
, mCallback(aCallback)
, mRV(NS_ERROR_FAILURE)
, mKey(aKey)
{
MOZ_COUNT_CTOR(OpenFileEvent);
mTarget = static_cast<nsIEventTarget*>(NS_GetCurrentThread());
if (!aResultOnAnyThread) {
mTarget = static_cast<nsIEventTarget*>(NS_GetCurrentThread());
MOZ_ASSERT(mTarget);
}
mIOMan = CacheFileIOManager::gInstance;
MOZ_ASSERT(mTarget);
MOZ_EVENT_TRACER_NAME_OBJECT(static_cast<nsIRunnable*>(this), aKey.BeginReading());
MOZ_EVENT_TRACER_WAIT(static_cast<nsIRunnable*>(this), "net::cache::open-background");
@ -583,7 +587,7 @@ public:
NS_IMETHOD Run()
{
if (mTarget) {
if (mResultOnAnyThread || mTarget) {
mRV = NS_OK;
if (!(mFlags & CacheFileIOManager::SPECIAL_FILE)) {
@ -617,20 +621,27 @@ public:
MOZ_EVENT_TRACER_DONE(static_cast<nsIRunnable*>(this), "net::cache::open-background");
MOZ_EVENT_TRACER_WAIT(static_cast<nsIRunnable*>(this), "net::cache::open-result");
nsCOMPtr<nsIEventTarget> target;
mTarget.swap(target);
target->Dispatch(this, nsIEventTarget::DISPATCH_NORMAL);
} else {
if (mTarget) {
nsCOMPtr<nsIEventTarget> target;
mTarget.swap(target);
return target->Dispatch(this, nsIEventTarget::DISPATCH_NORMAL);
}
}
if (!mTarget) {
MOZ_EVENT_TRACER_EXEC(static_cast<nsIRunnable*>(this), "net::cache::open-result");
mCallback->OnFileOpened(mHandle, mRV);
MOZ_EVENT_TRACER_DONE(static_cast<nsIRunnable*>(this), "net::cache::open-result");
}
return NS_OK;
}
protected:
SHA1Sum::Hash mHash;
uint32_t mFlags;
bool mResultOnAnyThread;
nsCOMPtr<CacheFileIOListener> mCallback;
nsCOMPtr<nsIEventTarget> mTarget;
nsRefPtr<CacheFileIOManager> mIOMan;
@ -642,16 +653,20 @@ protected:
class ReadEvent : public nsRunnable {
public:
ReadEvent(CacheFileHandle *aHandle, int64_t aOffset, char *aBuf,
int32_t aCount, CacheFileIOListener *aCallback)
int32_t aCount, bool aResultOnAnyThread, CacheFileIOListener *aCallback)
: mHandle(aHandle)
, mOffset(aOffset)
, mBuf(aBuf)
, mCount(aCount)
, mResultOnAnyThread(aResultOnAnyThread)
, mCallback(aCallback)
, mRV(NS_ERROR_FAILURE)
{
MOZ_COUNT_CTOR(ReadEvent);
mTarget = static_cast<nsIEventTarget*>(NS_GetCurrentThread());
if (!aResultOnAnyThread) {
mTarget = static_cast<nsIEventTarget*>(NS_GetCurrentThread());
}
MOZ_EVENT_TRACER_NAME_OBJECT(static_cast<nsIRunnable*>(this), aHandle->Key().get());
MOZ_EVENT_TRACER_WAIT(static_cast<nsIRunnable*>(this), "net::cache::read-background");
@ -664,7 +679,7 @@ public:
NS_IMETHOD Run()
{
if (mTarget) {
if (mResultOnAnyThread || mTarget) {
MOZ_EVENT_TRACER_EXEC(static_cast<nsIRunnable*>(this), "net::cache::read-background");
if (mHandle->IsClosed()) {
mRV = NS_ERROR_NOT_INITIALIZED;
@ -675,16 +690,20 @@ public:
MOZ_EVENT_TRACER_DONE(static_cast<nsIRunnable*>(this), "net::cache::read-background");
MOZ_EVENT_TRACER_WAIT(static_cast<nsIRunnable*>(this), "net::cache::read-result");
nsCOMPtr<nsIEventTarget> target;
mTarget.swap(target);
target->Dispatch(this, nsIEventTarget::DISPATCH_NORMAL);
} else {
MOZ_EVENT_TRACER_EXEC(static_cast<nsIRunnable*>(this), "net::cache::read-result");
if (mCallback) {
mCallback->OnDataRead(mHandle, mBuf, mRV);
if (mTarget) {
nsCOMPtr<nsIEventTarget> target;
mTarget.swap(target);
return target->Dispatch(this, nsIEventTarget::DISPATCH_NORMAL);
}
}
if (!mTarget && mCallback) {
MOZ_EVENT_TRACER_EXEC(static_cast<nsIRunnable*>(this), "net::cache::read-result");
mCallback->OnDataRead(mHandle, mBuf, mRV);
MOZ_EVENT_TRACER_DONE(static_cast<nsIRunnable*>(this), "net::cache::read-result");
}
return NS_OK;
}
@ -693,6 +712,7 @@ protected:
int64_t mOffset;
char *mBuf;
int32_t mCount;
bool mResultOnAnyThread;
nsCOMPtr<CacheFileIOListener> mCallback;
nsCOMPtr<nsIEventTarget> mTarget;
nsresult mRV;
@ -1532,7 +1552,7 @@ CacheFileIOManager::Notify(nsITimer * aTimer)
// static
nsresult
CacheFileIOManager::OpenFile(const nsACString &aKey,
uint32_t aFlags,
uint32_t aFlags, bool aResultOnAnyThread,
CacheFileIOListener *aCallback)
{
LOG(("CacheFileIOManager::OpenFile() [key=%s, flags=%d, listener=%p]",
@ -1546,7 +1566,7 @@ CacheFileIOManager::OpenFile(const nsACString &aKey,
}
bool priority = aFlags & CacheFileIOManager::PRIORITY;
nsRefPtr<OpenFileEvent> ev = new OpenFileEvent(aKey, aFlags, aCallback);
nsRefPtr<OpenFileEvent> ev = new OpenFileEvent(aKey, aFlags, aResultOnAnyThread, aCallback);
rv = ioMan->mIOThread->Dispatch(ev, priority
? CacheIOThread::OPEN_PRIORITY
: CacheIOThread::OPEN);
@ -1799,7 +1819,7 @@ CacheFileIOManager::CloseHandleInternal(CacheFileHandle *aHandle)
// static
nsresult
CacheFileIOManager::Read(CacheFileHandle *aHandle, int64_t aOffset,
char *aBuf, int32_t aCount,
char *aBuf, int32_t aCount, bool aResultOnAnyThread,
CacheFileIOListener *aCallback)
{
LOG(("CacheFileIOManager::Read() [handle=%p, offset=%lld, count=%d, "
@ -1813,7 +1833,7 @@ CacheFileIOManager::Read(CacheFileHandle *aHandle, int64_t aOffset,
}
nsRefPtr<ReadEvent> ev = new ReadEvent(aHandle, aOffset, aBuf, aCount,
aCallback);
aResultOnAnyThread, aCallback);
rv = ioMan->mIOThread->Dispatch(ev, aHandle->IsPriority()
? CacheIOThread::READ_PRIORITY
: CacheIOThread::READ);

View File

@ -238,10 +238,10 @@ public:
static nsresult ShutdownMetadataWriteScheduling();
static nsresult OpenFile(const nsACString &aKey,
uint32_t aFlags,
uint32_t aFlags, bool aResultOnAnyThread,
CacheFileIOListener *aCallback);
static nsresult Read(CacheFileHandle *aHandle, int64_t aOffset,
char *aBuf, int32_t aCount,
char *aBuf, int32_t aCount, bool aResultOnAnyThread,
CacheFileIOListener *aCallback);
static nsresult Write(CacheFileHandle *aHandle, int64_t aOffset,
const char *aBuf, int32_t aCount, bool aValidate,

View File

@ -199,7 +199,7 @@ CacheFileMetadata::ReadMetadata(CacheFileMetadataListener *aListener)
"offset=%lld, filesize=%lld [this=%p]", offset, size, this));
mListener = aListener;
rv = CacheFileIOManager::Read(mHandle, offset, mBuf, mBufSize, this);
rv = CacheFileIOManager::Read(mHandle, offset, mBuf, mBufSize, true, this);
if (NS_FAILED(rv)) {
LOG(("CacheFileMetadata::ReadMetadata() - CacheFileIOManager::Read() failed"
" synchronously, creating empty metadata. [this=%p, rv=0x%08x]",
@ -629,7 +629,7 @@ CacheFileMetadata::OnDataRead(CacheFileHandle *aHandle, char *aBuf,
LOG(("CacheFileMetadata::OnDataRead() - We need to read %d more bytes to "
"have full metadata. [this=%p]", missing, this));
rv = CacheFileIOManager::Read(mHandle, realOffset, mBuf, missing, this);
rv = CacheFileIOManager::Read(mHandle, realOffset, mBuf, missing, true, this);
if (NS_FAILED(rv)) {
LOG(("CacheFileMetadata::OnDataRead() - CacheFileIOManager::Read() "
"failed synchronously, creating empty metadata. [this=%p, "

View File

@ -1469,6 +1469,7 @@ CacheIndex::WriteIndexToDisk()
rv = CacheFileIOManager::OpenFile(NS_LITERAL_CSTRING(kTempIndexName),
CacheFileIOManager::SPECIAL_FILE |
CacheFileIOManager::CREATE,
true,
mIndexFileOpener);
if (NS_FAILED(rv)) {
LOG(("CacheIndex::WriteIndexToDisk() - Can't open file [rv=0x%08x]", rv));
@ -1914,6 +1915,7 @@ CacheIndex::ReadIndexFromDisk()
rv = CacheFileIOManager::OpenFile(NS_LITERAL_CSTRING(kIndexName),
CacheFileIOManager::SPECIAL_FILE |
CacheFileIOManager::OPEN,
true,
mIndexFileOpener);
if (NS_FAILED(rv)) {
LOG(("CacheIndex::ReadIndexFromDisk() - CacheFileIOManager::OpenFile() "
@ -1926,6 +1928,7 @@ CacheIndex::ReadIndexFromDisk()
rv = CacheFileIOManager::OpenFile(NS_LITERAL_CSTRING(kJournalName),
CacheFileIOManager::SPECIAL_FILE |
CacheFileIOManager::OPEN,
true,
mJournalFileOpener);
if (NS_FAILED(rv)) {
LOG(("CacheIndex::ReadIndexFromDisk() - CacheFileIOManager::OpenFile() "
@ -1937,6 +1940,7 @@ CacheIndex::ReadIndexFromDisk()
rv = CacheFileIOManager::OpenFile(NS_LITERAL_CSTRING(kTempIndexName),
CacheFileIOManager::SPECIAL_FILE |
CacheFileIOManager::OPEN,
true,
mTmpFileOpener);
if (NS_FAILED(rv)) {
LOG(("CacheIndex::ReadIndexFromDisk() - CacheFileIOManager::OpenFile() "
@ -1977,7 +1981,7 @@ CacheIndex::StartReadingIndex()
mRWBufPos = std::min(mRWBufSize,
static_cast<uint32_t>(mIndexHandle->FileSize()));
rv = CacheFileIOManager::Read(mIndexHandle, 0, mRWBuf, mRWBufPos, this);
rv = CacheFileIOManager::Read(mIndexHandle, 0, mRWBuf, mRWBufPos, true, this);
if (NS_FAILED(rv)) {
LOG(("CacheIndex::StartReadingIndex() - CacheFileIOManager::Read() failed "
"synchronously [rv=0x%08x]", rv));
@ -2102,7 +2106,7 @@ CacheIndex::ParseRecords()
mRWBufPos = pos + toRead;
rv = CacheFileIOManager::Read(mIndexHandle, fileOffset, mRWBuf + pos, toRead,
this);
true, this);
if (NS_FAILED(rv)) {
LOG(("CacheIndex::ParseRecords() - CacheFileIOManager::Read() failed "
"synchronously [rv=0x%08x]", rv));
@ -2140,7 +2144,7 @@ CacheIndex::StartReadingJournal()
mRWBufPos = std::min(mRWBufSize,
static_cast<uint32_t>(mJournalHandle->FileSize()));
rv = CacheFileIOManager::Read(mJournalHandle, 0, mRWBuf, mRWBufPos, this);
rv = CacheFileIOManager::Read(mJournalHandle, 0, mRWBuf, mRWBufPos, true, this);
if (NS_FAILED(rv)) {
LOG(("CacheIndex::StartReadingJournal() - CacheFileIOManager::Read() failed"
" synchronously [rv=0x%08x]", rv));
@ -2215,7 +2219,7 @@ CacheIndex::ParseJournal()
mRWBufPos = pos + toRead;
rv = CacheFileIOManager::Read(mJournalHandle, fileOffset, mRWBuf + pos,
toRead, this);
toRead, true, this);
if (NS_FAILED(rv)) {
LOG(("CacheIndex::ParseJournal() - CacheFileIOManager::Read() failed "
"synchronously [rv=0x%08x]", rv));