[netwerk] Make nsIncrementalStreamLoader's GetNumBytesRead threadsafe.

master
Fedor 2020-10-30 21:50:57 +03:00
parent ea43aa2ecc
commit d6b281cf01
4 changed files with 14 additions and 10 deletions

View File

@ -11,10 +11,7 @@
#include <limits>
nsIncrementalStreamLoader::nsIncrementalStreamLoader()
: mData(), mBytesConsumed(0)
{
}
nsIncrementalStreamLoader::nsIncrementalStreamLoader() = default;
nsIncrementalStreamLoader::~nsIncrementalStreamLoader()
{
@ -49,7 +46,7 @@ NS_IMPL_ISUPPORTS(nsIncrementalStreamLoader, nsIIncrementalStreamLoader,
NS_IMETHODIMP
nsIncrementalStreamLoader::GetNumBytesRead(uint32_t* aNumBytes)
{
*aNumBytes = mBytesConsumed + mData.length();
*aNumBytes = mBytesRead;
return NS_OK;
}
@ -180,7 +177,6 @@ nsIncrementalStreamLoader::WriteSegmentFun(nsIInputStream *inStr,
}
}
self->mBytesConsumed += consumedCount;
*writeCount = count;
return NS_OK;
@ -198,6 +194,8 @@ nsIncrementalStreamLoader::OnDataAvailable(nsIRequest* request, nsISupports *ctx
uint32_t countRead;
nsresult rv = inStr->ReadSegments(WriteSegmentFun, this, count, &countRead);
mRequest = nullptr;
NS_ENSURE_SUCCESS(rv, rv);
mBytesRead += countRead;
return rv;
}

View File

@ -47,8 +47,9 @@ protected:
// available.
mozilla::Vector<uint8_t, 0> mData;
// Number of consumed bytes from the mData.
size_t mBytesConsumed;
// Number of bytes read, which may differ from the number of bytes in mData,
// since we incrementally remove from there.
mozilla::Atomic<uint32_t, mozilla::Relaxed> mBytesRead;
};
#endif // nsIncrementalStreamLoader_h__

View File

@ -54,7 +54,7 @@ NS_IMPL_ISUPPORTS(nsStreamLoader, nsIStreamLoader,
NS_IMETHODIMP
nsStreamLoader::GetNumBytesRead(uint32_t* aNumBytes)
{
*aNumBytes = mData.length();
*aNumBytes = mBytesRead;
return NS_OK;
}
@ -150,7 +150,10 @@ nsStreamLoader::OnDataAvailable(nsIRequest* request, nsISupports *ctxt,
uint64_t sourceOffset, uint32_t count)
{
uint32_t countRead;
return inStr->ReadSegments(WriteSegmentFun, this, count, &countRead);
nsresult rv = inStr->ReadSegments(WriteSegmentFun, this, count, &countRead);
NS_ENSURE_SUCCESS(rv, rv);
mBytesRead += countRead;
return NS_OK;
}
void

View File

@ -47,6 +47,8 @@ protected:
nsCOMPtr<nsIRequest> mRequest;
nsCOMPtr<nsIRequestObserver> mRequestObserver;
mozilla::Atomic<uint32_t, mozilla::Relaxed> mBytesRead;
// Buffer to accumulate incoming data. We preallocate if contentSize is
// available.
mozilla::Vector<uint8_t, 0> mData;