Bug 1961460 - Remove the assertion for target thread in RemoteWorkerDebuggerManagerChild::Constructor. r=dom-worker-reviewers,jstutte
RemoteWorkerService::InitializeOnTargetThread could race with its shutdown So we can not use sRemoteWorkerService for thread correctness checking in RemoteWorkerDebuggerManagerChild creation during the initialization. This patch remove the assertions in the RemoteWorkerDebuggerManagerChild constructor and also moving the RemoteWorkerDebuggerManagerChild creation into RemoteWorkerService::InitializeOnTargetThread. RemoteWorkerService::InitializeOnTargetThread provides the thread correctness checking by using its mThread. Differential Revision: https://phabricator.services.mozilla.com/D247043
This commit is contained in:
@@ -3160,7 +3160,7 @@ already_AddRefed<WorkerPrivate> WorkerPrivate::Constructor(
|
|||||||
|
|
||||||
// Create remote debugger endpoint here for child binding in
|
// Create remote debugger endpoint here for child binding in
|
||||||
// WorkerThreadPrimaryRunnable
|
// WorkerThreadPrimaryRunnable
|
||||||
worker->CreateRemoteDebuggerEndpoints();
|
// worker->CreateRemoteDebuggerEndpoints();
|
||||||
|
|
||||||
if (!runtimeService->RegisterWorker(*worker)) {
|
if (!runtimeService->RegisterWorker(*worker)) {
|
||||||
aRv.Throw(NS_ERROR_UNEXPECTED);
|
aRv.Throw(NS_ERROR_UNEXPECTED);
|
||||||
|
|||||||
@@ -7,11 +7,7 @@
|
|||||||
|
|
||||||
namespace mozilla::dom {
|
namespace mozilla::dom {
|
||||||
|
|
||||||
RemoteWorkerDebuggerManagerChild::RemoteWorkerDebuggerManagerChild() {
|
RemoteWorkerDebuggerManagerChild::RemoteWorkerDebuggerManagerChild() {}
|
||||||
MOZ_ASSERT_DEBUG_OR_FUZZING(
|
|
||||||
RemoteWorkerService::Thread() &&
|
|
||||||
RemoteWorkerService::Thread()->IsOnCurrentThread());
|
|
||||||
}
|
|
||||||
|
|
||||||
RemoteWorkerDebuggerManagerChild::~RemoteWorkerDebuggerManagerChild() {}
|
RemoteWorkerDebuggerManagerChild::~RemoteWorkerDebuggerManagerChild() {}
|
||||||
|
|
||||||
|
|||||||
@@ -275,11 +275,8 @@ nsresult RemoteWorkerService::InitializeOnMainThread(
|
|||||||
"InitializeThread",
|
"InitializeThread",
|
||||||
[self, endpoint = std::move(aEndpoint),
|
[self, endpoint = std::move(aEndpoint),
|
||||||
debuggerChildEp = std::move(aDebuggerChildEp)]() mutable {
|
debuggerChildEp = std::move(aDebuggerChildEp)]() mutable {
|
||||||
self->InitializeOnTargetThread(std::move(endpoint));
|
self->InitializeOnTargetThread(std::move(endpoint),
|
||||||
|
std::move(debuggerChildEp));
|
||||||
self->mDebuggerManagerChild =
|
|
||||||
MakeRefPtr<RemoteWorkerDebuggerManagerChild>();
|
|
||||||
debuggerChildEp.Bind(self->mDebuggerManagerChild);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
rv = mThread->Dispatch(r.forget(), NS_DISPATCH_NORMAL);
|
rv = mThread->Dispatch(r.forget(), NS_DISPATCH_NORMAL);
|
||||||
@@ -298,18 +295,26 @@ RemoteWorkerService::RemoteWorkerService()
|
|||||||
RemoteWorkerService::~RemoteWorkerService() = default;
|
RemoteWorkerService::~RemoteWorkerService() = default;
|
||||||
|
|
||||||
void RemoteWorkerService::InitializeOnTargetThread(
|
void RemoteWorkerService::InitializeOnTargetThread(
|
||||||
mozilla::ipc::Endpoint<PRemoteWorkerServiceChild> aEndpoint) {
|
mozilla::ipc::Endpoint<PRemoteWorkerServiceChild> aEndpoint,
|
||||||
|
mozilla::ipc::Endpoint<PRemoteWorkerDebuggerManagerChild>
|
||||||
|
aDebuggerMgrEndpoint) {
|
||||||
MOZ_ASSERT(mThread);
|
MOZ_ASSERT(mThread);
|
||||||
MOZ_ASSERT(mThread->IsOnCurrentThread());
|
MOZ_ASSERT(mThread->IsOnCurrentThread());
|
||||||
|
|
||||||
|
RefPtr<RemoteWorkerDebuggerManagerChild> debuggerManagerActor =
|
||||||
|
MakeRefPtr<RemoteWorkerDebuggerManagerChild>();
|
||||||
|
if (NS_WARN_IF(!aDebuggerMgrEndpoint.Bind(debuggerManagerActor))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
RefPtr<RemoteWorkerServiceChild> serviceActor =
|
RefPtr<RemoteWorkerServiceChild> serviceActor =
|
||||||
MakeAndAddRef<RemoteWorkerServiceChild>();
|
MakeAndAddRef<RemoteWorkerServiceChild>();
|
||||||
if (NS_WARN_IF(!aEndpoint.Bind(serviceActor))) {
|
if (NS_WARN_IF(!aEndpoint.Bind(serviceActor))) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now we are ready!
|
mDebuggerManagerChild = std::move(debuggerManagerActor);
|
||||||
mActor = serviceActor;
|
mActor = std::move(serviceActor);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RemoteWorkerService::CloseActorOnTargetThread() {
|
void RemoteWorkerService::CloseActorOnTargetThread() {
|
||||||
@@ -322,6 +327,10 @@ void RemoteWorkerService::CloseActorOnTargetThread() {
|
|||||||
mActor->Close();
|
mActor->Close();
|
||||||
mActor = nullptr;
|
mActor = nullptr;
|
||||||
}
|
}
|
||||||
|
if (mDebuggerManagerChild) {
|
||||||
|
mDebuggerManagerChild->Close();
|
||||||
|
mDebuggerManagerChild = nullptr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
|
|||||||
@@ -111,7 +111,9 @@ class RemoteWorkerService final : public nsIObserver {
|
|||||||
aDebuggerChildEp);
|
aDebuggerChildEp);
|
||||||
|
|
||||||
void InitializeOnTargetThread(
|
void InitializeOnTargetThread(
|
||||||
mozilla::ipc::Endpoint<PRemoteWorkerServiceChild> aEndpoint);
|
mozilla::ipc::Endpoint<PRemoteWorkerServiceChild> aEndpoint,
|
||||||
|
mozilla::ipc::Endpoint<PRemoteWorkerDebuggerManagerChild>
|
||||||
|
aDebuggerMgrEndpoint);
|
||||||
|
|
||||||
void CloseActorOnTargetThread();
|
void CloseActorOnTargetThread();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user