mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 999383 - optimize Open and Read inter-thread calls in CacheFileIOManager, r=michal
This commit is contained in:
parent
cd415d3c36
commit
3c216393ff
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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,
|
||||
|
@ -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, "
|
||||
|
@ -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));
|
||||
|
Loading…
Reference in New Issue
Block a user