mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-27 12:50:09 +00:00
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:
parent
1896efc1b5
commit
6cd06a958e
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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__
|
||||
|
Loading…
x
Reference in New Issue
Block a user