summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMoonchild <moonchild@palemoon.org>2020-10-23 08:10:01 +0000
committerMoonchild <moonchild@palemoon.org>2020-10-24 10:38:50 +0000
commitf07d60c09fc0fea2bc614146d13346bc7473b87e (patch)
treed823fc78c97a0f611ee7ad492c58d84858004461
parentd7a05ea9e50f7484d09caf93c554b4be0c9e887d (diff)
downloadUXP-f07d60c09fc0fea2bc614146d13346bc7473b87e.tar
UXP-f07d60c09fc0fea2bc614146d13346bc7473b87e.tar.gz
UXP-f07d60c09fc0fea2bc614146d13346bc7473b87e.tar.lz
UXP-f07d60c09fc0fea2bc614146d13346bc7473b87e.tar.xz
UXP-f07d60c09fc0fea2bc614146d13346bc7473b87e.zip
[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.
-rw-r--r--netwerk/base/nsIncrementalStreamLoader.cpp10
-rw-r--r--netwerk/base/nsIncrementalStreamLoader.h5
-rw-r--r--netwerk/base/nsStreamLoader.cpp7
-rw-r--r--netwerk/base/nsStreamLoader.h2
4 files changed, 14 insertions, 10 deletions
diff --git a/netwerk/base/nsIncrementalStreamLoader.cpp b/netwerk/base/nsIncrementalStreamLoader.cpp
index a7298be3f..8890333f8 100644
--- a/netwerk/base/nsIncrementalStreamLoader.cpp
+++ b/netwerk/base/nsIncrementalStreamLoader.cpp
@@ -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;
}
diff --git a/netwerk/base/nsIncrementalStreamLoader.h b/netwerk/base/nsIncrementalStreamLoader.h
index f04d4a958..0e2b532e6 100644
--- a/netwerk/base/nsIncrementalStreamLoader.h
+++ b/netwerk/base/nsIncrementalStreamLoader.h
@@ -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__
diff --git a/netwerk/base/nsStreamLoader.cpp b/netwerk/base/nsStreamLoader.cpp
index a73b038a7..9990d1882 100644
--- a/netwerk/base/nsStreamLoader.cpp
+++ b/netwerk/base/nsStreamLoader.cpp
@@ -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
diff --git a/netwerk/base/nsStreamLoader.h b/netwerk/base/nsStreamLoader.h
index 671fc441f..b611a1aed 100644
--- a/netwerk/base/nsStreamLoader.h
+++ b/netwerk/base/nsStreamLoader.h
@@ -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;