diff options
Diffstat (limited to 'ipc/app/MozillaRuntimeMain.cpp')
-rw-r--r-- | ipc/app/MozillaRuntimeMain.cpp | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/ipc/app/MozillaRuntimeMain.cpp b/ipc/app/MozillaRuntimeMain.cpp new file mode 100644 index 0000000000..6741617b60 --- /dev/null +++ b/ipc/app/MozillaRuntimeMain.cpp @@ -0,0 +1,98 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* 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 "../contentproc/plugin-container.cpp" + +#include "mozilla/Bootstrap.h" +#include "mozilla/RuntimeExceptionModule.h" +#include "mozilla/ScopeExit.h" +#if defined(XP_WIN) +# include "mozilla/WindowsDllBlocklist.h" +# include "mozilla/GeckoArgs.h" +#endif // defined(XP_WIN) + +using namespace mozilla; + +static bool UseForkServer(int argc, char* argv[]) { +#if defined(MOZ_ENABLE_FORKSERVER) + return strcmp(argv[argc - 1], "forkserver") == 0; +#else + return false; +#endif +} + +static int RunForkServer(Bootstrap::UniquePtr&& bootstrap, int argc, + char* argv[]) { +#if defined(MOZ_ENABLE_FORKSERVER) + int ret = 0; + + bootstrap->NS_LogInit(); + + // Run a fork server in this process, single thread. When it + // returns, it means the fork server have been stopped or a new + // content process is created. + // + // For the later case, XRE_ForkServer() will return false, running + // in a content process just forked from the fork server process. + // argc & argv will be updated with the values passing from the + // chrome process. With the new values, this function + // continues the reset of the code acting as a content process. + if (bootstrap->XRE_ForkServer(&argc, &argv)) { + // Return from the fork server in the fork server process. + // Stop the fork server. + } else { + // In a content process forked from the fork server. + // Start acting as a content process. + ret = content_process_main(bootstrap.get(), argc, argv); + } + + bootstrap->NS_LogTerm(); + return ret; +#else + return 0; +#endif +} + +int main(int argc, char* argv[]) { + auto bootstrapResult = GetBootstrap(); + if (bootstrapResult.isErr()) { + return 2; + } + + Bootstrap::UniquePtr bootstrap = bootstrapResult.unwrap(); + + int ret; + if (UseForkServer(argc, argv)) { + ret = RunForkServer(std::move(bootstrap), argc, argv); + } else { + // Set the process type. We don't remove the arg here as that will be done + // later in common code. + SetGeckoProcessType(argv[argc - 1]); + + // Register an external module to report on otherwise uncatchable + // exceptions. Note that in child processes this must be called after Gecko + // process type has been set. + CrashReporter::RegisterRuntimeExceptionModule(); + + // Make sure we unregister the runtime exception module before returning. + auto unregisterRuntimeExceptionModule = MakeScopeExit( + [] { CrashReporter::UnregisterRuntimeExceptionModule(); }); + +#ifdef HAS_DLL_BLOCKLIST + uint32_t initFlags = eDllBlocklistInitFlagIsChildProcess; + SetDllBlocklistProcessTypeFlags(initFlags, GetGeckoProcessType()); + DllBlocklist_Initialize(initFlags); +#endif + + ret = content_process_main(bootstrap.get(), argc, argv); + +#if defined(DEBUG) && defined(HAS_DLL_BLOCKLIST) + DllBlocklist_Shutdown(); +#endif + } + + return ret; +} |