Bug 1263499 - unify the QuickExit function, r?bsmedberg
MozReview-Commit-ID: DGJbyXULHPe
--- a/dom/ipc/ContentChild.cpp
+++ b/dom/ipc/ContentChild.cpp
@@ -37,16 +37,17 @@
#include "mozilla/dom/Promise.h"
#include "mozilla/dom/nsIContentChild.h"
#include "mozilla/psm/PSMContentListener.h"
#include "mozilla/hal_sandbox/PHalChild.h"
#include "mozilla/ipc/BackgroundChild.h"
#include "mozilla/ipc/FileDescriptorSetChild.h"
#include "mozilla/ipc/FileDescriptorUtils.h"
#include "mozilla/ipc/GeckoChildProcessHost.h"
+#include "mozilla/ipc/ProcessChild.h"
#include "mozilla/ipc/TestShellChild.h"
#include "mozilla/jsipc/CrossProcessObjectWrappers.h"
#include "mozilla/layers/APZChild.h"
#include "mozilla/layers/CompositorBridgeChild.h"
#include "mozilla/layers/ImageBridgeChild.h"
#include "mozilla/layers/SharedBufferManagerChild.h"
#include "mozilla/layout/RenderFrameChild.h"
#include "mozilla/net/NeckoChild.h"
@@ -2224,24 +2225,24 @@ ContentChild::RecvSetConnectivity(const
return true;
}
void
ContentChild::ActorDestroy(ActorDestroyReason why)
{
if (AbnormalShutdown == why) {
NS_WARNING("shutting down early because of crash!");
- QuickExit();
+ ProcessChild::QuickExit();
}
#ifndef NS_FREE_PERMANENT_DATA
// In release builds, there's no point in the content process
// going through the full XPCOM shutdown path, because it doesn't
// keep persistent state.
- QuickExit();
+ ProcessChild::QuickExit();
#else
if (sFirstIdleTask) {
sFirstIdleTask->Cancel();
}
mAlertObservers.Clear();
mIdleObservers.Clear();
@@ -2252,17 +2253,17 @@ ContentChild::ActorDestroy(ActorDestroyR
mConsoleListener->mChild = nullptr;
}
mIsAlive = false;
#ifdef MOZ_NUWA_PROCESS
if (IsNuwaProcess()) {
// The Nuwa cannot go through the full XPCOM shutdown path or deadlock
// will result.
- QuickExit();
+ ProcessChild::QuickExit();
}
#endif
XRE_ShutdownChildProcess();
#endif // NS_FREE_PERMANENT_DATA
}
void
@@ -2293,31 +2294,16 @@ ContentChild::ProcessingError(Result aCo
crashReporter->SendAnnotateCrashReport(
NS_LITERAL_CSTRING("ipc_channel_error"),
reason);
}
#endif
NS_RUNTIMEABORT("Content child abort due to IPC error");
}
-void
-ContentChild::QuickExit()
-{
- NS_WARNING("content process _exit()ing");
-
-#ifdef XP_WIN
- // In bug 1254829, the destructor got called when dll got detached on windows,
- // switch to TerminateProcess to bypass dll detach handler during the process
- // termination.
- TerminateProcess(GetCurrentProcess(), 0);
-#else
- _exit(0);
-#endif
-}
-
nsresult
ContentChild::AddRemoteAlertObserver(const nsString& aData,
nsIObserver* aObserver)
{
NS_ASSERTION(aObserver, "Adding a null observer?");
mAlertObservers.AppendElement(new AlertObserver(aObserver, aData));
return NS_OK;
}
--- a/dom/ipc/ContentChild.h
+++ b/dom/ipc/ContentChild.h
@@ -610,22 +610,16 @@ public:
const nsString& aDisplayName,
const nsString& aIconPath) override;
private:
virtual void ActorDestroy(ActorDestroyReason why) override;
virtual void ProcessingError(Result aCode, const char* aReason) override;
- /**
- * Exit *now*. Do not shut down XPCOM, do not pass Go, do not run
- * static destructors, do not collect $200.
- */
- MOZ_NORETURN void QuickExit();
-
InfallibleTArray<nsAutoPtr<AlertObserver> > mAlertObservers;
RefPtr<ConsoleListener> mConsoleListener;
nsTHashtable<nsPtrHashKey<nsIObserver>> mIdleObservers;
InfallibleTArray<nsString> mAvailableDictionaries;
/**
--- a/dom/media/gmp/GMPChild.cpp
+++ b/dom/media/gmp/GMPChild.cpp
@@ -14,19 +14,21 @@
#include "GMPVideoHost.h"
#include "nsDebugImpl.h"
#include "nsIFile.h"
#include "nsXULAppAPI.h"
#include "gmp-video-decode.h"
#include "gmp-video-encode.h"
#include "GMPPlatform.h"
#include "mozilla/dom/CrashReporterChild.h"
+#include "mozilla/ipc/ProcessChild.h"
#include "GMPUtils.h"
#include "prio.h"
+using namespace mozilla::ipc;
using mozilla::dom::CrashReporterChild;
static const int MAX_VOUCHER_LENGTH = 500000;
#ifdef XP_WIN
#include <stdlib.h> // for _exit()
#else
#include <unistd.h> // for _exit()
@@ -415,17 +417,17 @@ GMPChild::ActorDestroy(ActorDestroyReaso
mGMPContentChildren[i - 1]->Close();
}
if (mGMPLoader) {
mGMPLoader->Shutdown();
}
if (AbnormalShutdown == aWhy) {
NS_WARNING("Abnormal shutdown of GMP process!");
- _exit(0);
+ ProcessChild::QuickExit();
}
XRE_ShutdownChildProcess();
}
void
GMPChild::ProcessingError(Result aCode, const char* aReason)
{
--- a/dom/plugins/ipc/PluginModuleChild.cpp
+++ b/dom/plugins/ipc/PluginModuleChild.cpp
@@ -1,16 +1,15 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* vim: set sw=4 ts=4 et : */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifdef MOZ_WIDGET_QT
-#include <unistd.h> // for _exit()
#include <QtCore/QTimer>
#include "nsQAppInstance.h"
#include "NestedLoopTimer.h"
#endif
#include "mozilla/plugins/PluginModuleChild.h"
/* This must occur *after* plugins/PluginModuleChild.h to avoid typedefs conflicts. */
@@ -28,16 +27,17 @@
#include "nsDebug.h"
#include "nsCOMPtr.h"
#include "nsPluginsDir.h"
#include "nsXULAppAPI.h"
#ifdef MOZ_X11
# include "mozilla/X11Util.h"
#endif
+#include "mozilla/ipc/ProcessChild.h"
#include "mozilla/plugins/PluginInstanceChild.h"
#include "mozilla/plugins/StreamNotifyChild.h"
#include "mozilla/plugins/BrowserStreamChild.h"
#include "mozilla/plugins/PluginStreamChild.h"
#include "mozilla/dom/CrashReporterChild.h"
#include "mozilla/unused.h"
#include "nsNPAPIPlugin.h"
@@ -52,16 +52,17 @@
#ifdef MOZ_WIDGET_COCOA
#include "PluginInterposeOSX.h"
#include "PluginUtilsOSX.h"
#endif
#include "GeckoProfiler.h"
using namespace mozilla;
+using namespace mozilla::ipc;
using namespace mozilla::plugins;
using namespace mozilla::widget;
using mozilla::dom::CrashReporterChild;
using mozilla::dom::PCrashReporterChild;
#if defined(XP_WIN)
const wchar_t * kFlashFullscreenClass = L"ShockwaveFlashFullScreen";
const wchar_t * kMozillaWindowClass = L"MozillaWindowClass";
@@ -781,23 +782,16 @@ PluginModuleChild::RecvSetAudioSessionDa
NS_ENSURE_SUCCESS(rv, true); // Bail early if this fails
// Ignore failures here; we can't really do anything about them
mozilla::widget::StartAudioSession();
return true;
#endif
}
-void
-PluginModuleChild::QuickExit()
-{
- NS_WARNING("plugin process _exit()ing");
- _exit(0);
-}
-
PPluginModuleChild*
PluginModuleChild::AllocPPluginModuleChild(mozilla::ipc::Transport* aTransport,
base::ProcessId aOtherPid)
{
return PluginModuleChild::CreateForContentProcess(aTransport, aOtherPid);
}
PCrashReporterChild*
@@ -838,17 +832,17 @@ PluginModuleChild::ActorDestroy(ActorDes
// Destroy ourselves once we finish other teardown activities.
MessageLoop::current()->PostTask(FROM_HERE, new DeleteTask<PluginModuleChild>(this));
return;
}
if (AbnormalShutdown == why) {
NS_WARNING("shutting down early because of crash!");
- QuickExit();
+ ProcessChild::QuickExit();
}
if (!mHasShutdown) {
MOZ_ASSERT(gChromeInstance == this);
NP_Shutdown();
}
// doesn't matter why we're being destroyed; it's up to us to
--- a/dom/plugins/ipc/PluginModuleChild.h
+++ b/dom/plugins/ipc/PluginModuleChild.h
@@ -137,18 +137,16 @@ protected:
virtual bool
AnswerPCrashReporterConstructor(PCrashReporterChild* actor,
mozilla::dom::NativeThreadId* id,
uint32_t* processType) override;
virtual void
ActorDestroy(ActorDestroyReason why) override;
- MOZ_NORETURN void QuickExit();
-
virtual bool
RecvProcessNativeEventsInInterruptCall() override;
virtual bool RecvStartProfiler(const ProfilerInitParams& params) override;
virtual bool RecvStopProfiler() override;
virtual bool RecvGatherProfile() override;
public:
--- a/ipc/glue/ProcessChild.cpp
+++ b/ipc/glue/ProcessChild.cpp
@@ -2,16 +2,22 @@
* vim: sw=2 ts=8 et :
*/
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "nsDebug.h"
+#ifdef XP_WIN
+#include <stdlib.h> // for _exit()
+#else
+#include <unistd.h> // for _exit()
+#endif
+
#include "mozilla/ipc/IOThreadChild.h"
#include "mozilla/ipc/ProcessChild.h"
namespace mozilla {
namespace ipc {
ProcessChild* ProcessChild::gProcessChild;
@@ -25,10 +31,23 @@ ProcessChild::ProcessChild(ProcessId aPa
gProcessChild = this;
}
ProcessChild::~ProcessChild()
{
gProcessChild = nullptr;
}
+/* static */ void
+ProcessChild::QuickExit()
+{
+#ifdef XP_WIN
+ // In bug 1254829, the destructor got called when dll got detached on windows,
+ // switch to TerminateProcess to bypass dll detach handler during the process
+ // termination.
+ TerminateProcess(GetCurrentProcess(), 0);
+#else
+ _exit(0);
+#endif
+}
+
} // namespace ipc
} // namespace mozilla
--- a/ipc/glue/ProcessChild.h
+++ b/ipc/glue/ProcessChild.h
@@ -31,16 +31,22 @@ public:
virtual bool Init() = 0;
virtual void CleanUp()
{ }
static MessageLoop* message_loop() {
return gProcessChild->mUILoop;
}
+ /**
+ * Exit *now*. Do not shut down XPCOM, do not pass Go, do not run
+ * static destructors, do not collect $200.
+ */
+ static void QuickExit();
+
protected:
static ProcessChild* current() {
return gProcessChild;
}
ProcessId ParentPid() {
return mParentPid;
}