зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1704500: Add logging to UtilityProcessHost/Manager r=gerard-majax
Adds a "utilityproc" log to trace utility process launch and shutdown steps. Differential Revision: https://phabricator.services.mozilla.com/D155017
This commit is contained in:
Родитель
7d4467db1a
Коммит
6a29255196
|
@ -28,6 +28,9 @@
|
||||||
|
|
||||||
namespace mozilla::ipc {
|
namespace mozilla::ipc {
|
||||||
|
|
||||||
|
LazyLogModule gUtilityProcessLog("utilityproc");
|
||||||
|
#define LOGD(...) MOZ_LOG(gUtilityProcessLog, LogLevel::Debug, (__VA_ARGS__))
|
||||||
|
|
||||||
#if defined(XP_MACOSX) && defined(MOZ_SANDBOX)
|
#if defined(XP_MACOSX) && defined(MOZ_SANDBOX)
|
||||||
bool UtilityProcessHost::sLaunchWithMacSandbox = false;
|
bool UtilityProcessHost::sLaunchWithMacSandbox = false;
|
||||||
#endif
|
#endif
|
||||||
|
@ -38,6 +41,9 @@ UtilityProcessHost::UtilityProcessHost(SandboxingKind aSandbox,
|
||||||
mListener(std::move(aListener)),
|
mListener(std::move(aListener)),
|
||||||
mLiveToken(new media::Refcountable<bool>(true)) {
|
mLiveToken(new media::Refcountable<bool>(true)) {
|
||||||
MOZ_COUNT_CTOR(UtilityProcessHost);
|
MOZ_COUNT_CTOR(UtilityProcessHost);
|
||||||
|
LOGD("[%p] UtilityProcessHost::UtilityProcessHost sandboxingKind=%" PRIu64,
|
||||||
|
this, aSandbox);
|
||||||
|
|
||||||
#if defined(XP_MACOSX) && defined(MOZ_SANDBOX)
|
#if defined(XP_MACOSX) && defined(MOZ_SANDBOX)
|
||||||
if (!sLaunchWithMacSandbox) {
|
if (!sLaunchWithMacSandbox) {
|
||||||
sLaunchWithMacSandbox =
|
sLaunchWithMacSandbox =
|
||||||
|
@ -52,6 +58,12 @@ UtilityProcessHost::UtilityProcessHost(SandboxingKind aSandbox,
|
||||||
|
|
||||||
UtilityProcessHost::~UtilityProcessHost() {
|
UtilityProcessHost::~UtilityProcessHost() {
|
||||||
MOZ_COUNT_DTOR(UtilityProcessHost);
|
MOZ_COUNT_DTOR(UtilityProcessHost);
|
||||||
|
#if defined(MOZ_SANDBOX)
|
||||||
|
LOGD("[%p] UtilityProcessHost::~UtilityProcessHost sandboxingKind=%" PRIu64,
|
||||||
|
this, mSandbox);
|
||||||
|
#else
|
||||||
|
LOGD("[%p] UtilityProcessHost::~UtilityProcessHost", this);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool UtilityProcessHost::Launch(StringVector aExtraOpts) {
|
bool UtilityProcessHost::Launch(StringVector aExtraOpts) {
|
||||||
|
@ -60,6 +72,8 @@ bool UtilityProcessHost::Launch(StringVector aExtraOpts) {
|
||||||
MOZ_ASSERT(mLaunchPhase == LaunchPhase::Unlaunched);
|
MOZ_ASSERT(mLaunchPhase == LaunchPhase::Unlaunched);
|
||||||
MOZ_ASSERT(!mUtilityProcessParent);
|
MOZ_ASSERT(!mUtilityProcessParent);
|
||||||
|
|
||||||
|
LOGD("[%p] UtilityProcessHost::Launch", this);
|
||||||
|
|
||||||
mPrefSerializer = MakeUnique<ipc::SharedPreferenceSerializer>();
|
mPrefSerializer = MakeUnique<ipc::SharedPreferenceSerializer>();
|
||||||
if (!mPrefSerializer->SerializeToSharedMemory(GeckoProcessType_Utility,
|
if (!mPrefSerializer->SerializeToSharedMemory(GeckoProcessType_Utility,
|
||||||
/* remoteType */ ""_ns)) {
|
/* remoteType */ ""_ns)) {
|
||||||
|
@ -107,6 +121,7 @@ bool UtilityProcessHost::Launch(StringVector aExtraOpts) {
|
||||||
mPrefSerializer = nullptr;
|
mPrefSerializer = nullptr;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
LOGD("[%p] UtilityProcessHost::Launch launching async", this);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -143,6 +158,7 @@ RefPtr<GenericNonExclusivePromise> UtilityProcessHost::LaunchPromise() {
|
||||||
|
|
||||||
void UtilityProcessHost::OnChannelConnected(base::ProcessId peer_pid) {
|
void UtilityProcessHost::OnChannelConnected(base::ProcessId peer_pid) {
|
||||||
MOZ_ASSERT(!NS_IsMainThread());
|
MOZ_ASSERT(!NS_IsMainThread());
|
||||||
|
LOGD("[%p] UtilityProcessHost::OnChannelConnected", this);
|
||||||
|
|
||||||
GeckoChildProcessHost::OnChannelConnected(peer_pid);
|
GeckoChildProcessHost::OnChannelConnected(peer_pid);
|
||||||
|
|
||||||
|
@ -157,6 +173,7 @@ void UtilityProcessHost::OnChannelConnected(base::ProcessId peer_pid) {
|
||||||
|
|
||||||
void UtilityProcessHost::OnChannelError() {
|
void UtilityProcessHost::OnChannelError() {
|
||||||
MOZ_ASSERT(!NS_IsMainThread());
|
MOZ_ASSERT(!NS_IsMainThread());
|
||||||
|
LOGD("[%p] UtilityProcessHost::OnChannelError", this);
|
||||||
|
|
||||||
GeckoChildProcessHost::OnChannelError();
|
GeckoChildProcessHost::OnChannelError();
|
||||||
|
|
||||||
|
@ -221,6 +238,8 @@ void UtilityProcessHost::InitAfterConnect(bool aSucceeded) {
|
||||||
Unused << GetActor()->SendInitProfiler(
|
Unused << GetActor()->SendInitProfiler(
|
||||||
ProfilerParent::CreateForProcess(GetActor()->OtherPid()));
|
ProfilerParent::CreateForProcess(GetActor()->OtherPid()));
|
||||||
|
|
||||||
|
LOGD("[%p] UtilityProcessHost::InitAfterConnect succeeded", this);
|
||||||
|
|
||||||
// Promise will be resolved later, from UtilityProcessParent when the child
|
// Promise will be resolved later, from UtilityProcessParent when the child
|
||||||
// will send the InitCompleted message.
|
// will send the InitCompleted message.
|
||||||
}
|
}
|
||||||
|
@ -228,10 +247,14 @@ void UtilityProcessHost::InitAfterConnect(bool aSucceeded) {
|
||||||
void UtilityProcessHost::Shutdown() {
|
void UtilityProcessHost::Shutdown() {
|
||||||
MOZ_ASSERT(NS_IsMainThread());
|
MOZ_ASSERT(NS_IsMainThread());
|
||||||
MOZ_ASSERT(!mShutdownRequested);
|
MOZ_ASSERT(!mShutdownRequested);
|
||||||
|
LOGD("[%p] UtilityProcessHost::Shutdown", this);
|
||||||
|
|
||||||
RejectPromise();
|
RejectPromise();
|
||||||
|
|
||||||
if (mUtilityProcessParent) {
|
if (mUtilityProcessParent) {
|
||||||
|
LOGD("[%p] UtilityProcessHost::Shutdown not destroying utility process.",
|
||||||
|
this);
|
||||||
|
|
||||||
// OnChannelClosed uses this to check if the shutdown was expected or
|
// OnChannelClosed uses this to check if the shutdown was expected or
|
||||||
// unexpected.
|
// unexpected.
|
||||||
mShutdownRequested = true;
|
mShutdownRequested = true;
|
||||||
|
@ -261,6 +284,7 @@ void UtilityProcessHost::Shutdown() {
|
||||||
|
|
||||||
void UtilityProcessHost::OnChannelClosed() {
|
void UtilityProcessHost::OnChannelClosed() {
|
||||||
MOZ_ASSERT(NS_IsMainThread());
|
MOZ_ASSERT(NS_IsMainThread());
|
||||||
|
LOGD("[%p] UtilityProcessHost::OnChannelClosed", this);
|
||||||
|
|
||||||
RejectPromise();
|
RejectPromise();
|
||||||
|
|
||||||
|
@ -277,6 +301,7 @@ void UtilityProcessHost::OnChannelClosed() {
|
||||||
|
|
||||||
void UtilityProcessHost::KillHard(const char* aReason) {
|
void UtilityProcessHost::KillHard(const char* aReason) {
|
||||||
MOZ_ASSERT(NS_IsMainThread());
|
MOZ_ASSERT(NS_IsMainThread());
|
||||||
|
LOGD("[%p] UtilityProcessHost::KillHard", this);
|
||||||
|
|
||||||
ProcessHandle handle = GetChildProcessHandle();
|
ProcessHandle handle = GetChildProcessHandle();
|
||||||
if (!base::KillProcess(handle, base::PROCESS_END_KILLED_BY_USER)) {
|
if (!base::KillProcess(handle, base::PROCESS_END_KILLED_BY_USER)) {
|
||||||
|
@ -288,6 +313,8 @@ void UtilityProcessHost::KillHard(const char* aReason) {
|
||||||
|
|
||||||
void UtilityProcessHost::DestroyProcess() {
|
void UtilityProcessHost::DestroyProcess() {
|
||||||
MOZ_ASSERT(NS_IsMainThread());
|
MOZ_ASSERT(NS_IsMainThread());
|
||||||
|
LOGD("[%p] UtilityProcessHost::DestroyProcess", this);
|
||||||
|
|
||||||
RejectPromise();
|
RejectPromise();
|
||||||
|
|
||||||
// Any pending tasks will be cancelled from now on.
|
// Any pending tasks will be cancelled from now on.
|
||||||
|
@ -299,6 +326,7 @@ void UtilityProcessHost::DestroyProcess() {
|
||||||
|
|
||||||
void UtilityProcessHost::ResolvePromise() {
|
void UtilityProcessHost::ResolvePromise() {
|
||||||
MOZ_ASSERT(NS_IsMainThread());
|
MOZ_ASSERT(NS_IsMainThread());
|
||||||
|
LOGD("[%p] UtilityProcessHost connected - resolving launch promise", this);
|
||||||
|
|
||||||
if (!mLaunchPromiseSettled) {
|
if (!mLaunchPromiseSettled) {
|
||||||
mLaunchPromise->Resolve(true, __func__);
|
mLaunchPromise->Resolve(true, __func__);
|
||||||
|
@ -311,6 +339,8 @@ void UtilityProcessHost::ResolvePromise() {
|
||||||
|
|
||||||
void UtilityProcessHost::RejectPromise() {
|
void UtilityProcessHost::RejectPromise() {
|
||||||
MOZ_ASSERT(NS_IsMainThread());
|
MOZ_ASSERT(NS_IsMainThread());
|
||||||
|
LOGD("[%p] UtilityProcessHost connection failed - rejecting launch promise",
|
||||||
|
this);
|
||||||
|
|
||||||
if (!mLaunchPromiseSettled) {
|
if (!mLaunchPromiseSettled) {
|
||||||
mLaunchPromise->Reject(NS_ERROR_FAILURE, __func__);
|
mLaunchPromise->Reject(NS_ERROR_FAILURE, __func__);
|
||||||
|
|
|
@ -25,6 +25,9 @@
|
||||||
|
|
||||||
namespace mozilla::ipc {
|
namespace mozilla::ipc {
|
||||||
|
|
||||||
|
extern LazyLogModule gUtilityProcessLog;
|
||||||
|
#define LOGD(...) MOZ_LOG(gUtilityProcessLog, LogLevel::Debug, (__VA_ARGS__))
|
||||||
|
|
||||||
static StaticRefPtr<UtilityProcessManager> sSingleton;
|
static StaticRefPtr<UtilityProcessManager> sSingleton;
|
||||||
|
|
||||||
static bool sXPCOMShutdown = false;
|
static bool sXPCOMShutdown = false;
|
||||||
|
@ -50,6 +53,8 @@ RefPtr<UtilityProcessManager> UtilityProcessManager::GetIfExists() {
|
||||||
}
|
}
|
||||||
|
|
||||||
UtilityProcessManager::UtilityProcessManager() : mObserver(new Observer(this)) {
|
UtilityProcessManager::UtilityProcessManager() : mObserver(new Observer(this)) {
|
||||||
|
LOGD("[%p] UtilityProcessManager::UtilityProcessManager", this);
|
||||||
|
|
||||||
// Start listening for pref changes so we can
|
// Start listening for pref changes so we can
|
||||||
// forward them to the process once it is running.
|
// forward them to the process once it is running.
|
||||||
nsContentUtils::RegisterShutdownObserver(mObserver);
|
nsContentUtils::RegisterShutdownObserver(mObserver);
|
||||||
|
@ -57,6 +62,8 @@ UtilityProcessManager::UtilityProcessManager() : mObserver(new Observer(this)) {
|
||||||
}
|
}
|
||||||
|
|
||||||
UtilityProcessManager::~UtilityProcessManager() {
|
UtilityProcessManager::~UtilityProcessManager() {
|
||||||
|
LOGD("[%p] UtilityProcessManager::~UtilityProcessManager", this);
|
||||||
|
|
||||||
// The Utility process should ALL have already been shut down.
|
// The Utility process should ALL have already been shut down.
|
||||||
MOZ_ASSERT(NoMoreProcesses());
|
MOZ_ASSERT(NoMoreProcesses());
|
||||||
}
|
}
|
||||||
|
@ -80,6 +87,8 @@ UtilityProcessManager::Observer::Observe(nsISupports* aSubject,
|
||||||
}
|
}
|
||||||
|
|
||||||
void UtilityProcessManager::OnXPCOMShutdown() {
|
void UtilityProcessManager::OnXPCOMShutdown() {
|
||||||
|
LOGD("[%p] UtilityProcessManager::OnXPCOMShutdown", this);
|
||||||
|
|
||||||
MOZ_ASSERT(NS_IsMainThread());
|
MOZ_ASSERT(NS_IsMainThread());
|
||||||
sXPCOMShutdown = true;
|
sXPCOMShutdown = true;
|
||||||
nsContentUtils::UnregisterShutdownObserver(mObserver);
|
nsContentUtils::UnregisterShutdownObserver(mObserver);
|
||||||
|
@ -124,6 +133,9 @@ RefPtr<UtilityProcessManager::ProcessFields> UtilityProcessManager::GetProcess(
|
||||||
|
|
||||||
RefPtr<GenericNonExclusivePromise> UtilityProcessManager::LaunchProcess(
|
RefPtr<GenericNonExclusivePromise> UtilityProcessManager::LaunchProcess(
|
||||||
SandboxingKind aSandbox) {
|
SandboxingKind aSandbox) {
|
||||||
|
LOGD("[%p] UtilityProcessManager::LaunchProcess SandboxingKind=%" PRIu64,
|
||||||
|
this, aSandbox);
|
||||||
|
|
||||||
MOZ_ASSERT(NS_IsMainThread());
|
MOZ_ASSERT(NS_IsMainThread());
|
||||||
|
|
||||||
if (IsShutdown()) {
|
if (IsShutdown()) {
|
||||||
|
@ -213,6 +225,11 @@ RefPtr<GenericNonExclusivePromise> UtilityProcessManager::LaunchProcess(
|
||||||
template <typename Actor>
|
template <typename Actor>
|
||||||
RefPtr<GenericNonExclusivePromise> UtilityProcessManager::StartUtility(
|
RefPtr<GenericNonExclusivePromise> UtilityProcessManager::StartUtility(
|
||||||
RefPtr<Actor> aActor, SandboxingKind aSandbox) {
|
RefPtr<Actor> aActor, SandboxingKind aSandbox) {
|
||||||
|
LOGD(
|
||||||
|
"[%p] UtilityProcessManager::StartUtility actor=%p "
|
||||||
|
"SandboxingKind=%" PRIu64,
|
||||||
|
this, aActor.get(), aSandbox);
|
||||||
|
|
||||||
if (!aActor) {
|
if (!aActor) {
|
||||||
MOZ_ASSERT(false, "Actor singleton failure");
|
MOZ_ASSERT(false, "Actor singleton failure");
|
||||||
return GenericNonExclusivePromise::CreateAndReject(NS_ERROR_FAILURE,
|
return GenericNonExclusivePromise::CreateAndReject(NS_ERROR_FAILURE,
|
||||||
|
@ -396,6 +413,8 @@ void UtilityProcessManager::OnProcessUnexpectedShutdown(
|
||||||
}
|
}
|
||||||
|
|
||||||
void UtilityProcessManager::CleanShutdownAllProcesses() {
|
void UtilityProcessManager::CleanShutdownAllProcesses() {
|
||||||
|
LOGD("[%p] UtilityProcessManager::CleanShutdownAllProcesses", this);
|
||||||
|
|
||||||
for (auto& it : mProcesses) {
|
for (auto& it : mProcesses) {
|
||||||
if (it) {
|
if (it) {
|
||||||
DestroyProcess(it->mSandbox);
|
DestroyProcess(it->mSandbox);
|
||||||
|
@ -404,6 +423,9 @@ void UtilityProcessManager::CleanShutdownAllProcesses() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void UtilityProcessManager::CleanShutdown(SandboxingKind aSandbox) {
|
void UtilityProcessManager::CleanShutdown(SandboxingKind aSandbox) {
|
||||||
|
LOGD("[%p] UtilityProcessManager::CleanShutdown SandboxingKind=%" PRIu64,
|
||||||
|
this, aSandbox);
|
||||||
|
|
||||||
DestroyProcess(aSandbox);
|
DestroyProcess(aSandbox);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -420,6 +442,9 @@ uint16_t UtilityProcessManager::AliveProcesses() {
|
||||||
bool UtilityProcessManager::NoMoreProcesses() { return AliveProcesses() == 0; }
|
bool UtilityProcessManager::NoMoreProcesses() { return AliveProcesses() == 0; }
|
||||||
|
|
||||||
void UtilityProcessManager::DestroyProcess(SandboxingKind aSandbox) {
|
void UtilityProcessManager::DestroyProcess(SandboxingKind aSandbox) {
|
||||||
|
LOGD("[%p] UtilityProcessManager::DestroyProcess SandboxingKind=%" PRIu64,
|
||||||
|
this, aSandbox);
|
||||||
|
|
||||||
MOZ_RELEASE_ASSERT(NS_IsMainThread());
|
MOZ_RELEASE_ASSERT(NS_IsMainThread());
|
||||||
|
|
||||||
if (AliveProcesses() <= 1) {
|
if (AliveProcesses() <= 1) {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче