123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- /*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- #pragma once
- #include <sys/cdefs.h>
- #include <sys/types.h>
- #include <map>
- #include <mutex>
- #include <string>
- #include <vector>
- #include <android-base/unique_fd.h>
- #include <cgroup_map.h>
- class ProfileAttribute {
- public:
- ProfileAttribute(const CgroupController& controller, const std::string& file_name)
- : controller_(controller), file_name_(file_name) {}
- const CgroupController* controller() const { return &controller_; }
- const std::string& file_name() const { return file_name_; }
- bool GetPathForTask(int tid, std::string* path) const;
- private:
- CgroupController controller_;
- std::string file_name_;
- };
- // Abstract profile element
- class ProfileAction {
- public:
- virtual ~ProfileAction() {}
- // Default implementations will fail
- virtual bool ExecuteForProcess(uid_t, pid_t) const { return false; };
- virtual bool ExecuteForTask(int) const { return false; };
- virtual void EnableResourceCaching() {}
- };
- // Profile actions
- class SetClampsAction : public ProfileAction {
- public:
- SetClampsAction(int boost, int clamp) noexcept : boost_(boost), clamp_(clamp) {}
- virtual bool ExecuteForProcess(uid_t uid, pid_t pid) const;
- virtual bool ExecuteForTask(int tid) const;
- protected:
- int boost_;
- int clamp_;
- };
- // To avoid issues in sdk_mac build
- #if defined(__ANDROID__)
- class SetTimerSlackAction : public ProfileAction {
- public:
- SetTimerSlackAction(unsigned long slack) noexcept : slack_(slack) {}
- virtual bool ExecuteForTask(int tid) const;
- private:
- unsigned long slack_;
- static bool IsTimerSlackSupported(int tid);
- };
- #else
- class SetTimerSlackAction : public ProfileAction {
- public:
- SetTimerSlackAction(unsigned long) noexcept {}
- virtual bool ExecuteForTask(int) const { return true; }
- };
- #endif
- // Set attribute profile element
- class SetAttributeAction : public ProfileAction {
- public:
- SetAttributeAction(const ProfileAttribute* attribute, const std::string& value)
- : attribute_(attribute), value_(value) {}
- virtual bool ExecuteForProcess(uid_t uid, pid_t pid) const;
- virtual bool ExecuteForTask(int tid) const;
- private:
- const ProfileAttribute* attribute_;
- std::string value_;
- };
- // Set cgroup profile element
- class SetCgroupAction : public ProfileAction {
- public:
- SetCgroupAction(const CgroupController& c, const std::string& p);
- virtual bool ExecuteForProcess(uid_t uid, pid_t pid) const;
- virtual bool ExecuteForTask(int tid) const;
- virtual void EnableResourceCaching();
- const CgroupController* controller() const { return &controller_; }
- std::string path() const { return path_; }
- private:
- enum FdState {
- FDS_INACCESSIBLE = -1,
- FDS_APP_DEPENDENT = -2,
- FDS_NOT_CACHED = -3,
- };
- CgroupController controller_;
- std::string path_;
- android::base::unique_fd fd_;
- mutable std::mutex fd_mutex_;
- static bool IsAppDependentPath(const std::string& path);
- static bool AddTidToCgroup(int tid, int fd);
- bool IsFdValid() const { return fd_ > FDS_INACCESSIBLE; }
- };
- class TaskProfile {
- public:
- TaskProfile() : res_cached_(false) {}
- void Add(std::unique_ptr<ProfileAction> e) { elements_.push_back(std::move(e)); }
- bool ExecuteForProcess(uid_t uid, pid_t pid) const;
- bool ExecuteForTask(int tid) const;
- void EnableResourceCaching();
- private:
- bool res_cached_;
- std::vector<std::unique_ptr<ProfileAction>> elements_;
- };
- class TaskProfiles {
- public:
- // Should be used by all users
- static TaskProfiles& GetInstance();
- TaskProfile* GetProfile(const std::string& name) const;
- const ProfileAttribute* GetAttribute(const std::string& name) const;
- private:
- std::map<std::string, std::unique_ptr<TaskProfile>> profiles_;
- std::map<std::string, std::unique_ptr<ProfileAttribute>> attributes_;
- TaskProfiles();
- bool Load(const CgroupMap& cg_map, const std::string& file_name);
- };
|