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:
Eden Chuang
2025-04-29 13:50:20 +00:00
parent f22d7767a0
commit 4ce1ddbb64
4 changed files with 22 additions and 15 deletions

View File

@@ -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);

View File

@@ -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() {}

View File

@@ -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

View File

@@ -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();