Loading init/service.cpp +25 −0 Original line number Diff line number Diff line Loading @@ -397,6 +397,14 @@ Result<void> Service::ExecStart() { return {}; } static void ClosePipe(const std::array<int, 2>* pipe) { for (const auto fd : *pipe) { if (fd >= 0) { close(fd); } } } Result<void> Service::Start() { auto reboot_on_failure = make_scope_guard([this] { if (on_failure_reboot_target_) { Loading Loading @@ -428,6 +436,12 @@ Result<void> Service::Start() { return {}; } std::unique_ptr<std::array<int, 2>, decltype(&ClosePipe)> pipefd(new std::array<int, 2>{-1, -1}, ClosePipe); if (pipe(pipefd->data()) < 0) { return ErrnoError() << "pipe()"; } bool needs_console = (flags_ & SVC_CONSOLE); if (needs_console) { if (proc_attr_.console.empty()) { Loading Loading @@ -532,6 +546,13 @@ Result<void> Service::Start() { LOG(ERROR) << "failed to write pid to files: " << result.error(); } // Wait until the cgroups have been created and until the cgroup controllers have been // activated. if (std::byte byte; read((*pipefd)[0], &byte, 1) < 0) { PLOG(ERROR) << "failed to read from notification channel"; } pipefd.reset(); if (task_profiles_.size() > 0 && !SetTaskProfiles(getpid(), task_profiles_)) { LOG(ERROR) << "failed to set task profiles"; } Loading Loading @@ -618,6 +639,10 @@ Result<void> Service::Start() { LmkdRegister(name_, proc_attr_.uid, pid_, oom_score_adjust_); } if (write((*pipefd)[1], "", 1) < 0) { return ErrnoError() << "sending notification failed"; } NotifyStateChange("running"); reboot_on_failure.Disable(); return {}; Loading libprocessgroup/processgroup.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -85,7 +85,7 @@ bool CgroupGetControllerFromPath(const std::string& path, std::string* cgroup_na bool CgroupGetAttributePath(const std::string& attr_name, std::string* path) { const TaskProfiles& tp = TaskProfiles::GetInstance(); const ProfileAttribute* attr = tp.GetAttribute(attr_name); const IProfileAttribute* attr = tp.GetAttribute(attr_name); if (attr == nullptr) { return false; Loading @@ -100,7 +100,7 @@ bool CgroupGetAttributePath(const std::string& attr_name, std::string* path) { bool CgroupGetAttributePathForTask(const std::string& attr_name, int tid, std::string* path) { const TaskProfiles& tp = TaskProfiles::GetInstance(); const ProfileAttribute* attr = tp.GetAttribute(attr_name); const IProfileAttribute* attr = tp.GetAttribute(attr_name); if (attr == nullptr) { return false; Loading libprocessgroup/task_profiles.cpp +3 −1 Original line number Diff line number Diff line Loading @@ -112,6 +112,8 @@ bool FdCacheHelper::IsAppDependentPath(const std::string& path) { return path.find("<uid>", 0) != std::string::npos || path.find("<pid>", 0) != std::string::npos; } IProfileAttribute::~IProfileAttribute() = default; void ProfileAttribute::Reset(const CgroupController& controller, const std::string& file_name) { controller_ = controller; file_name_ = file_name; Loading Loading @@ -726,7 +728,7 @@ TaskProfile* TaskProfiles::GetProfile(const std::string& name) const { return nullptr; } const ProfileAttribute* TaskProfiles::GetAttribute(const std::string& name) const { const IProfileAttribute* TaskProfiles::GetAttribute(const std::string& name) const { auto iter = attributes_.find(name); if (iter != attributes_.end()) { Loading libprocessgroup/task_profiles.h +19 −9 Original line number Diff line number Diff line Loading @@ -26,16 +26,26 @@ #include <android-base/unique_fd.h> #include <cgroup_map.h> class ProfileAttribute { class IProfileAttribute { public: virtual ~IProfileAttribute() = 0; virtual void Reset(const CgroupController& controller, const std::string& file_name) = 0; virtual const CgroupController* controller() const = 0; virtual const std::string& file_name() const = 0; virtual bool GetPathForTask(int tid, std::string* path) const = 0; }; class ProfileAttribute : public IProfileAttribute { public: ProfileAttribute(const CgroupController& controller, const std::string& file_name) : controller_(controller), file_name_(file_name) {} ~ProfileAttribute() = default; const CgroupController* controller() const { return &controller_; } const std::string& file_name() const { return file_name_; } void Reset(const CgroupController& controller, const std::string& file_name); const CgroupController* controller() const override { return &controller_; } const std::string& file_name() const override { return file_name_; } void Reset(const CgroupController& controller, const std::string& file_name) override; bool GetPathForTask(int tid, std::string* path) const; bool GetPathForTask(int tid, std::string* path) const override; private: CgroupController controller_; Loading Loading @@ -88,14 +98,14 @@ class SetTimerSlackAction : public ProfileAction { // Set attribute profile element class SetAttributeAction : public ProfileAction { public: SetAttributeAction(const ProfileAttribute* attribute, const std::string& value) SetAttributeAction(const IProfileAttribute* attribute, const std::string& value) : attribute_(attribute), value_(value) {} bool ExecuteForProcess(uid_t uid, pid_t pid) const override; bool ExecuteForTask(int tid) const override; private: const ProfileAttribute* attribute_; const IProfileAttribute* attribute_; std::string value_; }; Loading Loading @@ -180,7 +190,7 @@ class TaskProfiles { static TaskProfiles& GetInstance(); TaskProfile* GetProfile(const std::string& name) const; const ProfileAttribute* GetAttribute(const std::string& name) const; const IProfileAttribute* GetAttribute(const std::string& name) const; void DropResourceCaching(ProfileAction::ResourceCacheType cache_type) const; bool SetProcessProfiles(uid_t uid, pid_t pid, const std::vector<std::string>& profiles, bool use_fd_cache); Loading @@ -188,7 +198,7 @@ class TaskProfiles { private: std::map<std::string, std::shared_ptr<TaskProfile>> profiles_; std::map<std::string, std::unique_ptr<ProfileAttribute>> attributes_; std::map<std::string, std::unique_ptr<IProfileAttribute>> attributes_; TaskProfiles(); Loading Loading
init/service.cpp +25 −0 Original line number Diff line number Diff line Loading @@ -397,6 +397,14 @@ Result<void> Service::ExecStart() { return {}; } static void ClosePipe(const std::array<int, 2>* pipe) { for (const auto fd : *pipe) { if (fd >= 0) { close(fd); } } } Result<void> Service::Start() { auto reboot_on_failure = make_scope_guard([this] { if (on_failure_reboot_target_) { Loading Loading @@ -428,6 +436,12 @@ Result<void> Service::Start() { return {}; } std::unique_ptr<std::array<int, 2>, decltype(&ClosePipe)> pipefd(new std::array<int, 2>{-1, -1}, ClosePipe); if (pipe(pipefd->data()) < 0) { return ErrnoError() << "pipe()"; } bool needs_console = (flags_ & SVC_CONSOLE); if (needs_console) { if (proc_attr_.console.empty()) { Loading Loading @@ -532,6 +546,13 @@ Result<void> Service::Start() { LOG(ERROR) << "failed to write pid to files: " << result.error(); } // Wait until the cgroups have been created and until the cgroup controllers have been // activated. if (std::byte byte; read((*pipefd)[0], &byte, 1) < 0) { PLOG(ERROR) << "failed to read from notification channel"; } pipefd.reset(); if (task_profiles_.size() > 0 && !SetTaskProfiles(getpid(), task_profiles_)) { LOG(ERROR) << "failed to set task profiles"; } Loading Loading @@ -618,6 +639,10 @@ Result<void> Service::Start() { LmkdRegister(name_, proc_attr_.uid, pid_, oom_score_adjust_); } if (write((*pipefd)[1], "", 1) < 0) { return ErrnoError() << "sending notification failed"; } NotifyStateChange("running"); reboot_on_failure.Disable(); return {}; Loading
libprocessgroup/processgroup.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -85,7 +85,7 @@ bool CgroupGetControllerFromPath(const std::string& path, std::string* cgroup_na bool CgroupGetAttributePath(const std::string& attr_name, std::string* path) { const TaskProfiles& tp = TaskProfiles::GetInstance(); const ProfileAttribute* attr = tp.GetAttribute(attr_name); const IProfileAttribute* attr = tp.GetAttribute(attr_name); if (attr == nullptr) { return false; Loading @@ -100,7 +100,7 @@ bool CgroupGetAttributePath(const std::string& attr_name, std::string* path) { bool CgroupGetAttributePathForTask(const std::string& attr_name, int tid, std::string* path) { const TaskProfiles& tp = TaskProfiles::GetInstance(); const ProfileAttribute* attr = tp.GetAttribute(attr_name); const IProfileAttribute* attr = tp.GetAttribute(attr_name); if (attr == nullptr) { return false; Loading
libprocessgroup/task_profiles.cpp +3 −1 Original line number Diff line number Diff line Loading @@ -112,6 +112,8 @@ bool FdCacheHelper::IsAppDependentPath(const std::string& path) { return path.find("<uid>", 0) != std::string::npos || path.find("<pid>", 0) != std::string::npos; } IProfileAttribute::~IProfileAttribute() = default; void ProfileAttribute::Reset(const CgroupController& controller, const std::string& file_name) { controller_ = controller; file_name_ = file_name; Loading Loading @@ -726,7 +728,7 @@ TaskProfile* TaskProfiles::GetProfile(const std::string& name) const { return nullptr; } const ProfileAttribute* TaskProfiles::GetAttribute(const std::string& name) const { const IProfileAttribute* TaskProfiles::GetAttribute(const std::string& name) const { auto iter = attributes_.find(name); if (iter != attributes_.end()) { Loading
libprocessgroup/task_profiles.h +19 −9 Original line number Diff line number Diff line Loading @@ -26,16 +26,26 @@ #include <android-base/unique_fd.h> #include <cgroup_map.h> class ProfileAttribute { class IProfileAttribute { public: virtual ~IProfileAttribute() = 0; virtual void Reset(const CgroupController& controller, const std::string& file_name) = 0; virtual const CgroupController* controller() const = 0; virtual const std::string& file_name() const = 0; virtual bool GetPathForTask(int tid, std::string* path) const = 0; }; class ProfileAttribute : public IProfileAttribute { public: ProfileAttribute(const CgroupController& controller, const std::string& file_name) : controller_(controller), file_name_(file_name) {} ~ProfileAttribute() = default; const CgroupController* controller() const { return &controller_; } const std::string& file_name() const { return file_name_; } void Reset(const CgroupController& controller, const std::string& file_name); const CgroupController* controller() const override { return &controller_; } const std::string& file_name() const override { return file_name_; } void Reset(const CgroupController& controller, const std::string& file_name) override; bool GetPathForTask(int tid, std::string* path) const; bool GetPathForTask(int tid, std::string* path) const override; private: CgroupController controller_; Loading Loading @@ -88,14 +98,14 @@ class SetTimerSlackAction : public ProfileAction { // Set attribute profile element class SetAttributeAction : public ProfileAction { public: SetAttributeAction(const ProfileAttribute* attribute, const std::string& value) SetAttributeAction(const IProfileAttribute* attribute, const std::string& value) : attribute_(attribute), value_(value) {} bool ExecuteForProcess(uid_t uid, pid_t pid) const override; bool ExecuteForTask(int tid) const override; private: const ProfileAttribute* attribute_; const IProfileAttribute* attribute_; std::string value_; }; Loading Loading @@ -180,7 +190,7 @@ class TaskProfiles { static TaskProfiles& GetInstance(); TaskProfile* GetProfile(const std::string& name) const; const ProfileAttribute* GetAttribute(const std::string& name) const; const IProfileAttribute* GetAttribute(const std::string& name) const; void DropResourceCaching(ProfileAction::ResourceCacheType cache_type) const; bool SetProcessProfiles(uid_t uid, pid_t pid, const std::vector<std::string>& profiles, bool use_fd_cache); Loading @@ -188,7 +198,7 @@ class TaskProfiles { private: std::map<std::string, std::shared_ptr<TaskProfile>> profiles_; std::map<std::string, std::unique_ptr<ProfileAttribute>> attributes_; std::map<std::string, std::unique_ptr<IProfileAttribute>> attributes_; TaskProfiles(); Loading