Bug 1915988, part 2 - Make non-main process NS_InitXPCOM infallible. r=nika

Differential Revision: https://phabricator.services.mozilla.com/D220742
This commit is contained in:
Andrew McCreight 2024-08-30 21:49:36 +00:00
Родитель 221ea22231
Коммит 3f93202f63
1 изменённых файлов: 19 добавлений и 11 удалений

Просмотреть файл

@ -249,6 +249,12 @@ static void InitializeJS() {
}
}
#define XPCOM_INIT_FATAL(message, res) \
if (XRE_IsParentProcess()) { \
return res; \
} \
MOZ_CRASH(message);
// Note that on OSX, aBinDirectory will point to .app/Contents/Resources/browser
EXPORT_XPCOM_API(nsresult)
NS_InitXPCOM(nsIServiceManager** aResult, nsIFile* aBinDirectory,
@ -256,7 +262,7 @@ NS_InitXPCOM(nsIServiceManager** aResult, nsIFile* aBinDirectory,
bool aInitJSContext) {
static bool sInitialized = false;
if (sInitialized) {
return NS_ERROR_FAILURE;
XPCOM_INIT_FATAL("!sInitialized", NS_ERROR_FAILURE)
}
sInitialized = true;
@ -316,7 +322,7 @@ NS_InitXPCOM(nsIServiceManager** aResult, nsIFile* aBinDirectory,
base::Thread::Options options;
options.message_loop_type = MessageLoop::TYPE_IO;
if (NS_WARN_IF(!ioThread->StartWithOptions(options))) {
return NS_ERROR_FAILURE;
XPCOM_INIT_FATAL("StartWithOptions()", NS_ERROR_FAILURE)
}
sIOThread = ioThread.release();
@ -325,7 +331,7 @@ NS_InitXPCOM(nsIServiceManager** aResult, nsIFile* aBinDirectory,
// Establish the main thread here.
rv = nsThreadManager::get().Init();
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
XPCOM_INIT_FATAL("nsThreadManager::get().Init()", rv)
}
// Initialise the profiler
@ -334,7 +340,7 @@ NS_InitXPCOM(nsIServiceManager** aResult, nsIFile* aBinDirectory,
// Set up the timer globals/timer thread
rv = nsTimerImpl::Startup();
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
XPCOM_INIT_FATAL("nsTimerImpl::Startup()", rv)
}
#ifndef ANDROID
@ -361,7 +367,7 @@ NS_InitXPCOM(nsIServiceManager** aResult, nsIFile* aBinDirectory,
rv = nsDirectoryService::gService->RegisterProvider(
aAppFileLocationProvider);
if (NS_FAILED(rv)) {
return rv;
XPCOM_INIT_FATAL("nsDirectoryService::gService->RegisterProvider()", rv)
}
}
@ -390,7 +396,7 @@ NS_InitXPCOM(nsIServiceManager** aResult, nsIFile* aBinDirectory,
// with an unpacked modules directory.
nsresult rv = mozilla::Omnijar::Init();
if (NS_FAILED(rv)) {
return NS_ERROR_OMNIJAR_CORRUPT;
XPCOM_INIT_FATAL("Omnijar::Init()", NS_ERROR_OMNIJAR_CORRUPT)
}
}
@ -403,18 +409,18 @@ NS_InitXPCOM(nsIServiceManager** aResult, nsIFile* aBinDirectory,
NS_GET_IID(nsIFile),
getter_AddRefs(binaryFile));
if (NS_WARN_IF(!binaryFile)) {
return NS_ERROR_FAILURE;
XPCOM_INIT_FATAL("!binaryFile", NS_ERROR_FAILURE)
}
rv = binaryFile->AppendNative("nonexistent-executable"_ns);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
XPCOM_INIT_FATAL("binaryFile->AppendNative()", rv)
}
nsCString binaryPath;
rv = binaryFile->GetNativePath(binaryPath);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
XPCOM_INIT_FATAL("binaryFile->GetNativePath", rv)
}
static char const* const argv = {strdup(binaryPath.get())};
@ -431,7 +437,7 @@ NS_InitXPCOM(nsIServiceManager** aResult, nsIFile* aBinDirectory,
// Global cycle collector initialization.
if (!nsCycleCollector_init()) {
return NS_ERROR_UNEXPECTED;
XPCOM_INIT_FATAL("nsCycleCollector_init()", NS_ERROR_UNEXPECTED)
}
// And start it up for this thread too.
@ -457,7 +463,7 @@ NS_InitXPCOM(nsIServiceManager** aResult, nsIFile* aBinDirectory,
rv = nsComponentManagerImpl::gComponentManager->Init();
if (NS_FAILED(rv)) {
NS_RELEASE(nsComponentManagerImpl::gComponentManager);
return rv;
XPCOM_INIT_FATAL("gComponentManager->Init()", rv)
}
if (aResult) {
@ -516,6 +522,8 @@ NS_InitXPCOM(nsIServiceManager** aResult, nsIFile* aBinDirectory,
return NS_OK;
}
#undef XPCOM_INIT_FATAL
EXPORT_XPCOM_API(nsresult)
NS_InitMinimalXPCOM() {
NS_SetMainThread();