blob: 9a1e5ee0587a9ab9a916d001b8463eebbddf7386 [file] [log] [blame]
diff --git services/service_manager/embedder/main.cc services/service_manager/embedder/main.cc
index f9c275cdd78f..247142951d99 100644
--- services/service_manager/embedder/main.cc
+++ services/service_manager/embedder/main.cc
@@ -244,22 +244,36 @@ int RunService(MainDelegate* delegate) {
return 0;
}
+ProcessType GetProcessType(MainDelegate* delegate,
+ const base::CommandLine& command_line) {
+ ProcessType process_type = delegate->OverrideProcessType();
+ if (process_type == ProcessType::kDefault) {
+ const std::string& type_switch =
+ command_line.GetSwitchValueASCII(switches::kProcessType);
+ if (type_switch == switches::kProcessTypeServiceManager) {
+ process_type = ProcessType::kServiceManager;
+ } else if (type_switch == switches::kProcessTypeService) {
+ process_type = ProcessType::kService;
+ } else {
+ process_type = ProcessType::kEmbedder;
+ }
+ }
+ return process_type;
+}
+
} // namespace
MainParams::MainParams(MainDelegate* delegate) : delegate(delegate) {}
MainParams::~MainParams() {}
-int Main(const MainParams& params) {
+int MainInitialize(MainParams& params) {
MainDelegate* delegate = params.delegate;
DCHECK(delegate);
int exit_code = -1;
base::debug::GlobalActivityTracker* tracker = nullptr;
ProcessType process_type = delegate->OverrideProcessType();
-#if defined(OS_MACOSX)
- std::unique_ptr<base::mac::ScopedNSAutoreleasePool> autorelease_pool;
-#endif
// A flag to indicate whether Main() has been called before. On Android, we
// may re-run Main() without restarting the browser process. This flag
@@ -345,12 +359,7 @@ int Main(const MainParams& params) {
MainDelegate::InitializeParams init_params;
#if defined(OS_MACOSX)
- // We need this pool for all the objects created before we get to the event
- // loop, but we don't want to leave them hanging around until the app quits.
- // Each "main" needs to flush this pool right before it goes into its main
- // event loop to get rid of the cruft.
- autorelease_pool = std::make_unique<base::mac::ScopedNSAutoreleasePool>();
- init_params.autorelease_pool = autorelease_pool.get();
+ init_params.autorelease_pool = params.autorelease_pool.get();
InitializeMac();
#endif
@@ -422,18 +431,16 @@ int Main(const MainParams& params) {
}
}
+ return exit_code;
+}
+
+int MainRun(MainParams& params) {
+ MainDelegate* delegate = params.delegate;
+ DCHECK(delegate);
+
+ int exit_code = 0;
const auto& command_line = *base::CommandLine::ForCurrentProcess();
- if (process_type == ProcessType::kDefault) {
- std::string type_switch =
- command_line.GetSwitchValueASCII(switches::kProcessType);
- if (type_switch == switches::kProcessTypeServiceManager) {
- process_type = ProcessType::kServiceManager;
- } else if (type_switch == switches::kProcessTypeService) {
- process_type = ProcessType::kService;
- } else {
- process_type = ProcessType::kEmbedder;
- }
- }
+ const ProcessType process_type = GetProcessType(delegate, command_line);
switch (process_type) {
case ProcessType::kDefault:
NOTREACHED();
@@ -455,6 +462,8 @@ int Main(const MainParams& params) {
break;
}
+ base::debug::GlobalActivityTracker* tracker =
+ base::debug::GlobalActivityTracker::Get();
if (tracker) {
if (exit_code == 0) {
tracker->SetProcessPhaseIfEnabled(
@@ -466,13 +475,38 @@ int Main(const MainParams& params) {
}
}
+ return exit_code;
+}
+
+void MainShutdown(MainParams& params) {
+ MainDelegate* delegate = params.delegate;
+ DCHECK(delegate);
+
#if defined(OS_MACOSX)
- autorelease_pool.reset();
+ params.autorelease_pool.reset();
#endif
+ const ProcessType process_type =
+ GetProcessType(delegate, *base::CommandLine::ForCurrentProcess());
if (process_type == ProcessType::kEmbedder)
delegate->ShutDownEmbedderProcess();
+}
+
+int Main(MainParams& params) {
+#if defined(OS_MACOSX)
+ // We need this pool for all the objects created before we get to the event
+ // loop, but we don't want to leave them hanging around until the app quits.
+ // Each "main" needs to flush this pool right before it goes into its main
+ // event loop to get rid of the cruft.
+ params.autorelease_pool =
+ std::make_unique<base::mac::ScopedNSAutoreleasePool>();
+#endif
+ int exit_code = MainInitialize(params);
+ if (exit_code >= 0)
+ return exit_code;
+ exit_code = MainRun(params);
+ MainShutdown(params);
return exit_code;
}
diff --git services/service_manager/embedder/main.h services/service_manager/embedder/main.h
index 57e88aa85dfe..5ed6ec2abfda 100644
--- services/service_manager/embedder/main.h
+++ services/service_manager/embedder/main.h
@@ -5,9 +5,15 @@
#ifndef SERVICES_SERVICE_MANAGER_EMBEDDER_MAIN_H_
#define SERVICES_SERVICE_MANAGER_EMBEDDER_MAIN_H_
+#include <memory>
+
#include "base/component_export.h"
#include "build/build_config.h"
+#if defined(OS_MACOSX)
+#include "base/mac/scoped_nsautorelease_pool.h"
+#endif // defined(OS_MACOSX)
+
namespace service_manager {
class MainDelegate;
@@ -22,11 +28,22 @@ struct COMPONENT_EXPORT(SERVICE_MANAGER_EMBEDDER) MainParams {
int argc = 0;
const char** argv = nullptr;
#endif
+
+#if defined(OS_MACOSX)
+ std::unique_ptr<base::mac::ScopedNSAutoreleasePool> autorelease_pool;
+#endif
};
+// Split Main() into separate stages.
+int COMPONENT_EXPORT(SERVICE_MANAGER_EMBEDDER)
+ MainInitialize(MainParams& params);
+int COMPONENT_EXPORT(SERVICE_MANAGER_EMBEDDER) MainRun(MainParams& params);
+void COMPONENT_EXPORT(SERVICE_MANAGER_EMBEDDER)
+ MainShutdown(MainParams& params);
+
// Main function which should be called as early as possible by any executable
// embedding the service manager.
-int COMPONENT_EXPORT(SERVICE_MANAGER_EMBEDDER) Main(const MainParams& params);
+int COMPONENT_EXPORT(SERVICE_MANAGER_EMBEDDER) Main(MainParams& params);
} // namespace service_manager
diff --git services/service_manager/embedder/set_process_title.cc services/service_manager/embedder/set_process_title.cc
index 1dc53b847ef9..5432ab02a088 100644
--- services/service_manager/embedder/set_process_title.cc
+++ services/service_manager/embedder/set_process_title.cc
@@ -44,7 +44,7 @@ void SetProcessTitleFromCommandLine(const char** main_argv) {
bool have_argv0 = false;
#if defined(OS_LINUX)
- DCHECK_EQ(base::PlatformThread::CurrentId(), getpid());
+ //DCHECK_EQ(base::PlatformThread::CurrentId(), getpid());
if (main_argv)
setproctitle_init(main_argv);