Bug 1387285 - release more member variable in HttpChannelChild on main thread. r?mayhemer
After
bug 1338493 landed, HttpChannelChild might be released on STS thread.
Redirected channel, intercept stream listener and context might not always be able to
release off-main-thread. Therefore, we need to proxy release these members on main thread.
MozReview-Commit-ID: 6mcja7WY1fK
--- a/netwerk/protocol/http/HttpChannelChild.cpp
+++ b/netwerk/protocol/http/HttpChannelChild.cpp
@@ -219,16 +219,24 @@ HttpChannelChild::ReleaseMainThreadOnlyR
if (NS_IsMainThread()) {
// Already on main thread, let dtor to
// take care of releasing references
return;
}
nsTArray<nsCOMPtr<nsISupports>> arrayToRelease;
arrayToRelease.AppendElement(mCacheKey.forget());
+ arrayToRelease.AppendElement(mRedirectChannelChild.forget());
+
+ // To solve multiple inheritence of nsISupports in InterceptStreamListener
+ already_AddRefed<nsIStreamListener> listener = mInterceptListener.forget();
+ arrayToRelease.AppendElement(listener.take());
+
+ arrayToRelease.AppendElement(mInterceptedRedirectListener.forget());
+ arrayToRelease.AppendElement(mInterceptedRedirectContext.forget());
NS_DispatchToMainThread(new ProxyReleaseRunnable(Move(arrayToRelease)));
}
//-----------------------------------------------------------------------------
// HttpChannelChild::nsISupports
//-----------------------------------------------------------------------------
NS_IMPL_ADDREF(HttpChannelChild)
--- a/netwerk/protocol/http/HttpChannelChild.h
+++ b/netwerk/protocol/http/HttpChannelChild.h
@@ -181,16 +181,21 @@ protected:
virtual mozilla::ipc::IPCResult RecvLogBlockedCORSRequest(const nsString& aMessage) override;
NS_IMETHOD LogBlockedCORSRequest(const nsAString & aMessage) override;
private:
// this section is for main-thread-only object
// all the references need to be proxy released on main thread.
nsCOMPtr<nsISupports> mCacheKey;
+ nsCOMPtr<nsIChildChannel> mRedirectChannelChild;
+ RefPtr<InterceptStreamListener> mInterceptListener;
+ // Needed to call AsyncOpen in FinishInterceptedRedirect
+ nsCOMPtr<nsIStreamListener> mInterceptedRedirectListener;
+ nsCOMPtr<nsISupports> mInterceptedRedirectContext;
// Proxy release all members above on main thread.
void ReleaseMainThreadOnlyReferences();
private:
class OverrideRunnable : public Runnable {
public:
@@ -266,18 +271,16 @@ private:
// main thread if invoking on non-main thread.
void TrySendDeletingChannel();
// Try invoke Cancel if on main thread, or prepend a CancelEvent in mEventQ to
// ensure Cacnel is processed before any other channel events.
void CancelOnMainThread(nsresult aRv);
RequestHeaderTuples mClientSetRequestHeaders;
- nsCOMPtr<nsIChildChannel> mRedirectChannelChild;
- RefPtr<InterceptStreamListener> mInterceptListener;
RefPtr<nsInputStreamPump> mSynthesizedResponsePump;
nsCOMPtr<nsIInputStream> mSynthesizedInput;
int64_t mSynthesizedStreamLength;
bool mIsFromCache;
bool mCacheEntryAvailable;
bool mAltDataCacheEntryAvailable;
int32_t mCacheFetchCount;
@@ -346,19 +349,16 @@ private:
// Error handling procedure if failed to establish PBackground IPC
nsCOMPtr<nsIRunnable> mBgInitFailCallback;
// Remove the association with background channel after OnStopRequest
// or AsyncAbort.
void CleanupBackgroundChannel();
- // Needed to call AsyncOpen in FinishInterceptedRedirect
- nsCOMPtr<nsIStreamListener> mInterceptedRedirectListener;
- nsCOMPtr<nsISupports> mInterceptedRedirectContext;
// Needed to call CleanupRedirectingChannel in FinishInterceptedRedirect
RefPtr<HttpChannelChild> mInterceptingChannel;
// Used to call OverrideWithSynthesizedResponse in FinishInterceptedRedirect
RefPtr<OverrideRunnable> mOverrideRunnable;
// Target thread for delivering ODA.
nsCOMPtr<nsIEventTarget> mODATarget;
// Used to ensure atomicity of mNeckoTarget / mODATarget;