init: handle process actions when waiting for exec services
We currently do not handle process actions (restarting services or exiting timedout services) when we are waiting for an exec service, but this seems to be the wrong behavior. Particularly, an exec service may depend on a previously started service and if that service crashes, we will deadlock unless init restarts it. Bug: 146920034 Test: build, boot Change-Id: Id2fc936b8a7b989862ba4c32c398a544941e0e76
This commit is contained in:
parent
838b1a1f94
commit
44d5ec37a7
1 changed files with 9 additions and 9 deletions
|
|
@ -780,18 +780,18 @@ int SecondStageMain(int argc, char** argv) {
|
|||
if (!(waiting_for_prop || Service::is_exec_service_running())) {
|
||||
am.ExecuteOneCommand();
|
||||
}
|
||||
if (!(waiting_for_prop || Service::is_exec_service_running())) {
|
||||
if (!IsShuttingDown()) {
|
||||
auto next_process_action_time = HandleProcessActions();
|
||||
if (!IsShuttingDown()) {
|
||||
auto next_process_action_time = HandleProcessActions();
|
||||
|
||||
// If there's a process that needs restarting, wake up in time for that.
|
||||
if (next_process_action_time) {
|
||||
epoll_timeout = std::chrono::ceil<std::chrono::milliseconds>(
|
||||
*next_process_action_time - boot_clock::now());
|
||||
if (*epoll_timeout < 0ms) epoll_timeout = 0ms;
|
||||
}
|
||||
// If there's a process that needs restarting, wake up in time for that.
|
||||
if (next_process_action_time) {
|
||||
epoll_timeout = std::chrono::ceil<std::chrono::milliseconds>(
|
||||
*next_process_action_time - boot_clock::now());
|
||||
if (*epoll_timeout < 0ms) epoll_timeout = 0ms;
|
||||
}
|
||||
}
|
||||
|
||||
if (!(waiting_for_prop || Service::is_exec_service_running())) {
|
||||
// If there's more work to do, wake up again immediately.
|
||||
if (am.HasMoreCommands()) epoll_timeout = 0ms;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue