Loading init/init.cpp +17 −35 Original line number Diff line number Diff line Loading @@ -255,7 +255,6 @@ static class ShutdownState { return {}; } bool do_shutdown() const { return do_shutdown_; } void set_do_shutdown(bool value) { do_shutdown_ = value; } private: Loading @@ -264,31 +263,6 @@ static class ShutdownState { bool do_shutdown_ = false; } shutdown_state; static void UnwindMainThreadStack() { unwindstack::AndroidLocalUnwinder unwinder; unwindstack::AndroidUnwinderData data; if (!unwinder.Unwind(data)) { LOG(ERROR) << __FUNCTION__ << "sys.powerctl: Failed to unwind callstack: " << data.GetErrorString(); } for (const auto& frame : data.frames) { LOG(ERROR) << "sys.powerctl: " << unwinder.FormatFrame(frame); } } void DebugRebootLogging() { LOG(INFO) << "sys.powerctl: do_shutdown: " << shutdown_state.do_shutdown() << " IsShuttingDown: " << IsShuttingDown(); if (shutdown_state.do_shutdown()) { LOG(ERROR) << "sys.powerctl set while a previous shutdown command has not been handled"; UnwindMainThreadStack(); } if (IsShuttingDown()) { LOG(ERROR) << "sys.powerctl set while init is already shutting down"; UnwindMainThreadStack(); } } void DumpState() { ServiceList::GetInstance().DumpState(); ActionManager::GetInstance().DumpState(); Loading Loading @@ -1109,8 +1083,11 @@ int SecondStageMain(int argc, char** argv) { // Restore prio before main loop setpriority(PRIO_PROCESS, 0, 0); while (true) { // By default, sleep until something happens. std::optional<std::chrono::milliseconds> epoll_timeout; // By default, sleep until something happens. Do not convert far_future into // std::chrono::milliseconds because that would trigger an overflow. The unit of boot_clock // is 1ns. const boot_clock::time_point far_future = boot_clock::time_point::max(); boot_clock::time_point next_action_time = far_future; auto shutdown_command = shutdown_state.CheckShutdown(); if (shutdown_command) { Loading @@ -1122,23 +1099,28 @@ int SecondStageMain(int argc, char** argv) { if (!(prop_waiter_state.MightBeWaiting() || Service::is_exec_service_running())) { am.ExecuteOneCommand(); // If there's more work to do, wake up again immediately. if (am.HasMoreCommands()) { next_action_time = boot_clock::now(); } } // Since the above code examined pending actions, no new actions must be // queued by the code between this line and the Epoll::Wait() call below // without calling WakeMainInitThread(). 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; next_action_time = std::min(next_action_time, *next_process_action_time); } } if (!(prop_waiter_state.MightBeWaiting() || Service::is_exec_service_running())) { // If there's more work to do, wake up again immediately. if (am.HasMoreCommands()) epoll_timeout = 0ms; std::optional<std::chrono::milliseconds> epoll_timeout; if (next_action_time != far_future) { epoll_timeout = std::chrono::ceil<std::chrono::milliseconds>( std::max(next_action_time - boot_clock::now(), 0ns)); } auto epoll_result = epoll.Wait(epoll_timeout); if (!epoll_result.ok()) { LOG(ERROR) << epoll_result.error(); Loading init/init.h +0 −2 Original line number Diff line number Diff line Loading @@ -42,8 +42,6 @@ void SendLoadPersistentPropertiesMessage(); void PropertyChanged(const std::string& name, const std::string& value); bool QueueControlMessage(const std::string& message, const std::string& name, pid_t pid, int fd); void DebugRebootLogging(); int SecondStageMain(int argc, char** argv); int StopServicesFromApex(const std::string& apex_name); Loading init/property_service.cpp +0 −3 Original line number Diff line number Diff line Loading @@ -550,9 +550,6 @@ std::optional<uint32_t> HandlePropertySet(const std::string& name, const std::st } LOG(INFO) << "Received sys.powerctl='" << value << "' from pid: " << cr.pid << process_log_string; if (!value.empty()) { DebugRebootLogging(); } if (value == "reboot,userspace" && !is_userspace_reboot_supported().value_or(false)) { *error = "Userspace reboot is not supported by this device"; return {PROP_ERROR_INVALID_VALUE}; Loading Loading
init/init.cpp +17 −35 Original line number Diff line number Diff line Loading @@ -255,7 +255,6 @@ static class ShutdownState { return {}; } bool do_shutdown() const { return do_shutdown_; } void set_do_shutdown(bool value) { do_shutdown_ = value; } private: Loading @@ -264,31 +263,6 @@ static class ShutdownState { bool do_shutdown_ = false; } shutdown_state; static void UnwindMainThreadStack() { unwindstack::AndroidLocalUnwinder unwinder; unwindstack::AndroidUnwinderData data; if (!unwinder.Unwind(data)) { LOG(ERROR) << __FUNCTION__ << "sys.powerctl: Failed to unwind callstack: " << data.GetErrorString(); } for (const auto& frame : data.frames) { LOG(ERROR) << "sys.powerctl: " << unwinder.FormatFrame(frame); } } void DebugRebootLogging() { LOG(INFO) << "sys.powerctl: do_shutdown: " << shutdown_state.do_shutdown() << " IsShuttingDown: " << IsShuttingDown(); if (shutdown_state.do_shutdown()) { LOG(ERROR) << "sys.powerctl set while a previous shutdown command has not been handled"; UnwindMainThreadStack(); } if (IsShuttingDown()) { LOG(ERROR) << "sys.powerctl set while init is already shutting down"; UnwindMainThreadStack(); } } void DumpState() { ServiceList::GetInstance().DumpState(); ActionManager::GetInstance().DumpState(); Loading Loading @@ -1109,8 +1083,11 @@ int SecondStageMain(int argc, char** argv) { // Restore prio before main loop setpriority(PRIO_PROCESS, 0, 0); while (true) { // By default, sleep until something happens. std::optional<std::chrono::milliseconds> epoll_timeout; // By default, sleep until something happens. Do not convert far_future into // std::chrono::milliseconds because that would trigger an overflow. The unit of boot_clock // is 1ns. const boot_clock::time_point far_future = boot_clock::time_point::max(); boot_clock::time_point next_action_time = far_future; auto shutdown_command = shutdown_state.CheckShutdown(); if (shutdown_command) { Loading @@ -1122,23 +1099,28 @@ int SecondStageMain(int argc, char** argv) { if (!(prop_waiter_state.MightBeWaiting() || Service::is_exec_service_running())) { am.ExecuteOneCommand(); // If there's more work to do, wake up again immediately. if (am.HasMoreCommands()) { next_action_time = boot_clock::now(); } } // Since the above code examined pending actions, no new actions must be // queued by the code between this line and the Epoll::Wait() call below // without calling WakeMainInitThread(). 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; next_action_time = std::min(next_action_time, *next_process_action_time); } } if (!(prop_waiter_state.MightBeWaiting() || Service::is_exec_service_running())) { // If there's more work to do, wake up again immediately. if (am.HasMoreCommands()) epoll_timeout = 0ms; std::optional<std::chrono::milliseconds> epoll_timeout; if (next_action_time != far_future) { epoll_timeout = std::chrono::ceil<std::chrono::milliseconds>( std::max(next_action_time - boot_clock::now(), 0ns)); } auto epoll_result = epoll.Wait(epoll_timeout); if (!epoll_result.ok()) { LOG(ERROR) << epoll_result.error(); Loading
init/init.h +0 −2 Original line number Diff line number Diff line Loading @@ -42,8 +42,6 @@ void SendLoadPersistentPropertiesMessage(); void PropertyChanged(const std::string& name, const std::string& value); bool QueueControlMessage(const std::string& message, const std::string& name, pid_t pid, int fd); void DebugRebootLogging(); int SecondStageMain(int argc, char** argv); int StopServicesFromApex(const std::string& apex_name); Loading
init/property_service.cpp +0 −3 Original line number Diff line number Diff line Loading @@ -550,9 +550,6 @@ std::optional<uint32_t> HandlePropertySet(const std::string& name, const std::st } LOG(INFO) << "Received sys.powerctl='" << value << "' from pid: " << cr.pid << process_log_string; if (!value.empty()) { DebugRebootLogging(); } if (value == "reboot,userspace" && !is_userspace_reboot_supported().value_or(false)) { *error = "Userspace reboot is not supported by this device"; return {PROP_ERROR_INVALID_VALUE}; Loading