зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1333573 P9 Refactor worker proxy release of main thread objects to reduce duplicate code. r=baku
This commit is contained in:
Родитель
75937028fd
Коммит
fa883b7bc2
|
@ -395,15 +395,7 @@ private:
|
||||||
virtual bool
|
virtual bool
|
||||||
WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) override
|
WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) override
|
||||||
{
|
{
|
||||||
nsCOMPtr<nsILoadGroup> loadGroupToCancel;
|
if (!mFinishedWorker->ProxyReleaseMainThreadObjects()) {
|
||||||
mFinishedWorker->ForgetOverridenLoadGroup(loadGroupToCancel);
|
|
||||||
|
|
||||||
nsTArray<nsCOMPtr<nsISupports>> doomed;
|
|
||||||
mFinishedWorker->ForgetMainThreadObjects(doomed);
|
|
||||||
|
|
||||||
RefPtr<MainThreadReleaseRunnable> runnable =
|
|
||||||
new MainThreadReleaseRunnable(doomed, loadGroupToCancel);
|
|
||||||
if (NS_FAILED(mWorkerPrivate->DispatchToMainThread(runnable.forget()))) {
|
|
||||||
NS_WARNING("Failed to dispatch, going to leak!");
|
NS_WARNING("Failed to dispatch, going to leak!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -447,15 +439,7 @@ private:
|
||||||
|
|
||||||
runtime->UnregisterWorker(mFinishedWorker);
|
runtime->UnregisterWorker(mFinishedWorker);
|
||||||
|
|
||||||
nsCOMPtr<nsILoadGroup> loadGroupToCancel;
|
if (!mFinishedWorker->ProxyReleaseMainThreadObjects()) {
|
||||||
mFinishedWorker->ForgetOverridenLoadGroup(loadGroupToCancel);
|
|
||||||
|
|
||||||
nsTArray<nsCOMPtr<nsISupports> > doomed;
|
|
||||||
mFinishedWorker->ForgetMainThreadObjects(doomed);
|
|
||||||
|
|
||||||
RefPtr<MainThreadReleaseRunnable> runnable =
|
|
||||||
new MainThreadReleaseRunnable(doomed, loadGroupToCancel);
|
|
||||||
if (NS_FAILED(NS_DispatchToCurrentThread(runnable))) {
|
|
||||||
NS_WARNING("Failed to dispatch, going to leak!");
|
NS_WARNING("Failed to dispatch, going to leak!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2004,26 +1988,38 @@ WorkerLoadInfo::FinalChannelPrincipalIsValid(nsIChannel* aChannel)
|
||||||
}
|
}
|
||||||
#endif // defined(DEBUG) || !defined(RELEASE_OR_BETA)
|
#endif // defined(DEBUG) || !defined(RELEASE_OR_BETA)
|
||||||
|
|
||||||
void
|
bool
|
||||||
WorkerLoadInfo::ForgetMainThreadObjects(nsTArray<nsCOMPtr<nsISupports> >& aDoomed)
|
WorkerLoadInfo::ProxyReleaseMainThreadObjects(WorkerPrivate* aWorkerPrivate)
|
||||||
{
|
{
|
||||||
|
nsCOMPtr<nsILoadGroup> nullLoadGroup;
|
||||||
|
return ProxyReleaseMainThreadObjects(aWorkerPrivate, nullLoadGroup);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
WorkerLoadInfo::ProxyReleaseMainThreadObjects(WorkerPrivate* aWorkerPrivate,
|
||||||
|
nsCOMPtr<nsILoadGroup>& aLoadGroupToCancel)
|
||||||
|
{
|
||||||
|
|
||||||
static const uint32_t kDoomedCount = 10;
|
static const uint32_t kDoomedCount = 10;
|
||||||
|
nsTArray<nsCOMPtr<nsISupports>> doomed(kDoomedCount);
|
||||||
|
|
||||||
aDoomed.SetCapacity(kDoomedCount);
|
SwapToISupportsArray(mWindow, doomed);
|
||||||
|
SwapToISupportsArray(mScriptContext, doomed);
|
||||||
SwapToISupportsArray(mWindow, aDoomed);
|
SwapToISupportsArray(mBaseURI, doomed);
|
||||||
SwapToISupportsArray(mScriptContext, aDoomed);
|
SwapToISupportsArray(mResolvedScriptURI, doomed);
|
||||||
SwapToISupportsArray(mBaseURI, aDoomed);
|
SwapToISupportsArray(mPrincipal, doomed);
|
||||||
SwapToISupportsArray(mResolvedScriptURI, aDoomed);
|
SwapToISupportsArray(mChannel, doomed);
|
||||||
SwapToISupportsArray(mPrincipal, aDoomed);
|
SwapToISupportsArray(mCSP, doomed);
|
||||||
SwapToISupportsArray(mChannel, aDoomed);
|
SwapToISupportsArray(mLoadGroup, doomed);
|
||||||
SwapToISupportsArray(mCSP, aDoomed);
|
SwapToISupportsArray(mLoadFailedAsyncRunnable, doomed);
|
||||||
SwapToISupportsArray(mLoadGroup, aDoomed);
|
SwapToISupportsArray(mInterfaceRequestor, doomed);
|
||||||
SwapToISupportsArray(mLoadFailedAsyncRunnable, aDoomed);
|
|
||||||
SwapToISupportsArray(mInterfaceRequestor, aDoomed);
|
|
||||||
// Before adding anything here update kDoomedCount above!
|
// Before adding anything here update kDoomedCount above!
|
||||||
|
|
||||||
MOZ_ASSERT(aDoomed.Length() == kDoomedCount);
|
MOZ_ASSERT(doomed.Length() == kDoomedCount);
|
||||||
|
|
||||||
|
RefPtr<MainThreadReleaseRunnable> runnable =
|
||||||
|
new MainThreadReleaseRunnable(doomed, aLoadGroupToCancel);
|
||||||
|
return NS_SUCCEEDED(aWorkerPrivate->DispatchToMainThread(runnable.forget()));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Derived>
|
template <class Derived>
|
||||||
|
@ -3206,32 +3202,25 @@ WorkerPrivateParent<Derived>::ModifyBusyCount(bool aIncrease)
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Derived>
|
template <class Derived>
|
||||||
void
|
bool
|
||||||
WorkerPrivateParent<Derived>::ForgetOverridenLoadGroup(
|
WorkerPrivateParent<Derived>::ProxyReleaseMainThreadObjects()
|
||||||
nsCOMPtr<nsILoadGroup>& aLoadGroupOut)
|
|
||||||
{
|
|
||||||
AssertIsOnParentThread();
|
|
||||||
|
|
||||||
// If we're not overriden, then do nothing here. Let the load group get
|
|
||||||
// handled in ForgetMainThreadObjects().
|
|
||||||
if (!mLoadInfo.mInterfaceRequestor) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
mLoadInfo.mLoadGroup.swap(aLoadGroupOut);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Derived>
|
|
||||||
void
|
|
||||||
WorkerPrivateParent<Derived>::ForgetMainThreadObjects(
|
|
||||||
nsTArray<nsCOMPtr<nsISupports> >& aDoomed)
|
|
||||||
{
|
{
|
||||||
AssertIsOnParentThread();
|
AssertIsOnParentThread();
|
||||||
MOZ_ASSERT(!mMainThreadObjectsForgotten);
|
MOZ_ASSERT(!mMainThreadObjectsForgotten);
|
||||||
|
|
||||||
mLoadInfo.ForgetMainThreadObjects(aDoomed);
|
nsCOMPtr<nsILoadGroup> loadGroupToCancel;
|
||||||
|
// If we're not overriden, then do nothing here. Let the load group get
|
||||||
|
// handled in ForgetMainThreadObjects().
|
||||||
|
if (mLoadInfo.mInterfaceRequestor) {
|
||||||
|
mLoadInfo.mLoadGroup.swap(loadGroupToCancel);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool result = mLoadInfo.ProxyReleaseMainThreadObjects(ParentAsWorkerPrivate(),
|
||||||
|
loadGroupToCancel);
|
||||||
|
|
||||||
mMainThreadObjectsForgotten = true;
|
mMainThreadObjectsForgotten = true;
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Derived>
|
template <class Derived>
|
||||||
|
@ -4594,12 +4583,7 @@ WorkerPrivate::GetLoadInfo(JSContext* aCx, nsPIDOMWindowInner* aWindow,
|
||||||
rv = ChannelFromScriptURLWorkerThread(aCx, aParent, aScriptURL,
|
rv = ChannelFromScriptURLWorkerThread(aCx, aParent, aScriptURL,
|
||||||
loadInfo);
|
loadInfo);
|
||||||
if (NS_FAILED(rv)) {
|
if (NS_FAILED(rv)) {
|
||||||
nsTArray<nsCOMPtr<nsISupports>> doomed;
|
MOZ_ALWAYS_TRUE(loadInfo.ProxyReleaseMainThreadObjects(aParent));
|
||||||
loadInfo.ForgetMainThreadObjects(doomed);
|
|
||||||
nsCOMPtr<nsILoadGroup> loadGroupToCancel;
|
|
||||||
RefPtr<MainThreadReleaseRunnable> runnable =
|
|
||||||
new MainThreadReleaseRunnable(doomed, loadGroupToCancel);
|
|
||||||
MOZ_ALWAYS_SUCCEEDS(aParent->DispatchToMainThread(runnable.forget()));
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4611,12 +4595,7 @@ WorkerPrivate::GetLoadInfo(JSContext* aCx, nsPIDOMWindowInner* aWindow,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parentStatus > Running) {
|
if (parentStatus > Running) {
|
||||||
nsTArray<nsCOMPtr<nsISupports>> doomed;
|
MOZ_ALWAYS_TRUE(loadInfo.ProxyReleaseMainThreadObjects(aParent));
|
||||||
loadInfo.ForgetMainThreadObjects(doomed);
|
|
||||||
nsCOMPtr<nsILoadGroup> loadGroupToCancel;
|
|
||||||
RefPtr<MainThreadReleaseRunnable> runnable =
|
|
||||||
new MainThreadReleaseRunnable(doomed, loadGroupToCancel);
|
|
||||||
MOZ_ALWAYS_SUCCEEDS(aParent->DispatchToMainThread(runnable.forget()));
|
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -353,11 +353,8 @@ public:
|
||||||
bool
|
bool
|
||||||
ModifyBusyCount(bool aIncrease);
|
ModifyBusyCount(bool aIncrease);
|
||||||
|
|
||||||
void
|
bool
|
||||||
ForgetOverridenLoadGroup(nsCOMPtr<nsILoadGroup>& aLoadGroupOut);
|
ProxyReleaseMainThreadObjects();
|
||||||
|
|
||||||
void
|
|
||||||
ForgetMainThreadObjects(nsTArray<nsCOMPtr<nsISupports> >& aDoomed);
|
|
||||||
|
|
||||||
void
|
void
|
||||||
PostMessage(JSContext* aCx, JS::Handle<JS::Value> aMessage,
|
PostMessage(JSContext* aCx, JS::Handle<JS::Value> aMessage,
|
||||||
|
|
|
@ -294,8 +294,12 @@ struct WorkerLoadInfo
|
||||||
FinalChannelPrincipalIsValid(nsIChannel* aChannel);
|
FinalChannelPrincipalIsValid(nsIChannel* aChannel);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void
|
bool
|
||||||
ForgetMainThreadObjects(nsTArray<nsCOMPtr<nsISupports> >& aDoomed);
|
ProxyReleaseMainThreadObjects(WorkerPrivate* aWorkerPrivate);
|
||||||
|
|
||||||
|
bool
|
||||||
|
ProxyReleaseMainThreadObjects(WorkerPrivate* aWorkerPrivate,
|
||||||
|
nsCOMPtr<nsILoadGroup>& aLoadGroupToCancel);
|
||||||
};
|
};
|
||||||
|
|
||||||
// All of these are implemented in RuntimeService.cpp
|
// All of these are implemented in RuntimeService.cpp
|
||||||
|
|
Загрузка…
Ссылка в новой задаче