mirror of
https://github.com/roytam1/UXP.git
synced 2026-05-26 14:54:25 +00:00
[netwerk] Make nsIncrementalStreamLoader's GetNumBytesRead threadsafe.
This prevents a potential race and simplifies the code a bit by keeping the bytes read separate instead of using mData, which is modified from another thread from OnDataAvailable. Relaxed atomics are fine for these, since they don't guard any memory.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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__
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user