Bug 1636823 - nsInputTransport must support blocking and async source - part 1 - Use NS_MakeAsyncNonBlockingInputStream, r=smaug,necko-reviewers,mayhemer

Differential Revision: https://phabricator.services.mozilla.com/D78233
This commit is contained in:
Andrea Marchesini 2020-06-12 22:48:07 +00:00
parent 1896efc1b5
commit 6cd06a958e
3 changed files with 17 additions and 50 deletions

View File

@ -7,7 +7,6 @@
#include "nsIOService.h"
#include "nsInputStreamPump.h"
#include "nsIStreamTransportService.h"
#include "nsITransport.h"
#include "nsIThreadRetargetableStreamListener.h"
#include "nsThreadUtils.h"
#include "nsCOMPtr.h"
@ -320,50 +319,14 @@ nsInputStreamPump::AsyncRead(nsIStreamListener* listener, nsISupports* ctxt) {
"nsInputStreamPump should be read from the "
"main thread only.");
//
// OK, we need to use the stream transport service if
//
// (1) the stream is blocking
// (2) the stream does not support nsIAsyncInputStream
//
bool nonBlocking;
nsresult rv = mStream->IsNonBlocking(&nonBlocking);
if (NS_FAILED(rv)) return rv;
if (nonBlocking) {
mAsyncStream = do_QueryInterface(mStream);
if (!mAsyncStream) {
rv = NonBlockingAsyncInputStream::Create(mStream.forget(),
getter_AddRefs(mAsyncStream));
if (NS_WARN_IF(NS_FAILED(rv))) return rv;
}
MOZ_ASSERT(mAsyncStream);
nsresult rv = NS_MakeAsyncNonBlockingInputStream(
mStream.forget(), getter_AddRefs(mAsyncStream), mCloseWhenDone, mSegSize,
mSegCount);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
if (!mAsyncStream) {
// ok, let's use the stream transport service to read this stream.
nsCOMPtr<nsIStreamTransportService> sts =
do_GetService(kStreamTransportServiceCID, &rv);
if (NS_FAILED(rv)) return rv;
nsCOMPtr<nsITransport> transport;
rv = sts->CreateInputTransport(mStream, mCloseWhenDone,
getter_AddRefs(transport));
if (NS_FAILED(rv)) return rv;
nsCOMPtr<nsIInputStream> wrapper;
rv = transport->OpenInputStream(0, mSegSize, mSegCount,
getter_AddRefs(wrapper));
if (NS_FAILED(rv)) return rv;
mAsyncStream = do_QueryInterface(wrapper, &rv);
if (NS_FAILED(rv)) return rv;
}
// release our reference to the original stream. from this point forward,
// we only reference the "stream" via mAsyncStream.
mStream = nullptr;
MOZ_ASSERT(mAsyncStream);
// mStreamOffset now holds the number of bytes currently read.
mStreamOffset = 0;

View File

@ -890,7 +890,8 @@ nsresult NS_CloneInputStream(nsIInputStream* aSource,
nsresult NS_MakeAsyncNonBlockingInputStream(
already_AddRefed<nsIInputStream> aSource,
nsIAsyncInputStream** aAsyncInputStream) {
nsIAsyncInputStream** aAsyncInputStream, bool aCloseWhenDone,
uint32_t aFlags, uint32_t aSegmentSize, uint32_t aSegmentCount) {
nsCOMPtr<nsIInputStream> source = std::move(aSource);
if (NS_WARN_IF(!aAsyncInputStream)) {
return NS_ERROR_FAILURE;
@ -923,17 +924,14 @@ nsresult NS_MakeAsyncNonBlockingInputStream(
}
nsCOMPtr<nsITransport> transport;
rv = sts->CreateInputTransport(source,
/* aCloseWhenDone */ true,
rv = sts->CreateInputTransport(source, aCloseWhenDone,
getter_AddRefs(transport));
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
nsCOMPtr<nsIInputStream> wrapper;
rv = transport->OpenInputStream(/* aFlags */ 0,
/* aSegmentSize */ 0,
/* aSegmentCount */ 0,
rv = transport->OpenInputStream(aFlags, aSegmentSize, aSegmentCount,
getter_AddRefs(wrapper));
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;

View File

@ -306,9 +306,15 @@ extern nsresult NS_CloneInputStream(nsIInputStream* aSource,
* The last step is to use nsIStreamTransportService and create a pipe in order
* to expose a non-blocking async inputStream and read |aSource| data from
* a separate thread.
*
* In case we need to create a pipe, |aCloseWhenDone| will be used to create the
* inputTransport, |aFlags|, |aSegmentSize|, |asegmentCount| will be used to
* open the inputStream. If true, the input stream will be closed after it has
* been read. Read more in nsITransport.idl.
*/
extern nsresult NS_MakeAsyncNonBlockingInputStream(
already_AddRefed<nsIInputStream> aSource,
nsIAsyncInputStream** aAsyncInputStream);
nsIAsyncInputStream** aAsyncInputStream, bool aCloseWhenDone = true,
uint32_t aFlags = 0, uint32_t aSegmentSize = 0, uint32_t aSegmentCount = 0);
#endif // !nsStreamUtils_h__