Fix IsUsable to check for each controller separately
CgroupController::IsUsable is using a global static variable to store the
existence of the controller. That means the first controller existence
check would affect all other controllers. Fix this by making this variable
to be a member of CgroupController class so that each controller can check
for its existence independently of other controllers.
Fixes: aa1d54f0cc
("Remove ACgroupController_getFlags to fix API breakage")
Bug: 136020193
Test: adb shell cat /proc/$pid/task/*/cgroup" prints "cpuset:/top-app"
Test: for new launched activity process
Change-Id: I4741a9126ea494122d5b2b1a0c4d7252bff6025c
Signed-off-by: Suren Baghdasaryan <surenb@google.com>
This commit is contained in:
parent
c0349199db
commit
25eb1bfadf
2 changed files with 16 additions and 5 deletions
|
@ -67,11 +67,14 @@ bool CgroupController::HasValue() const {
|
|||
return controller_ != nullptr;
|
||||
}
|
||||
|
||||
bool CgroupController::IsUsable() const {
|
||||
bool CgroupController::IsUsable() {
|
||||
if (!HasValue()) return false;
|
||||
|
||||
static bool enabled = (access(GetProcsFilePath("", 0, 0).c_str(), F_OK) == 0);
|
||||
return enabled;
|
||||
if (state_ == UNKNOWN) {
|
||||
state_ = access(GetProcsFilePath("", 0, 0).c_str(), F_OK) == 0 ? USABLE : MISSING;
|
||||
}
|
||||
|
||||
return state_ == USABLE;
|
||||
}
|
||||
|
||||
std::string CgroupController::GetTasksFilePath(const std::string& rel_path) const {
|
||||
|
|
|
@ -31,20 +31,28 @@
|
|||
class CgroupController {
|
||||
public:
|
||||
// Does not own controller
|
||||
explicit CgroupController(const ACgroupController* controller) : controller_(controller) {}
|
||||
explicit CgroupController(const ACgroupController* controller)
|
||||
: controller_(controller), state_(UNKNOWN) {}
|
||||
|
||||
uint32_t version() const;
|
||||
const char* name() const;
|
||||
const char* path() const;
|
||||
|
||||
bool HasValue() const;
|
||||
bool IsUsable() const;
|
||||
bool IsUsable();
|
||||
|
||||
std::string GetTasksFilePath(const std::string& path) const;
|
||||
std::string GetProcsFilePath(const std::string& path, uid_t uid, pid_t pid) const;
|
||||
bool GetTaskGroup(int tid, std::string* group) const;
|
||||
private:
|
||||
enum ControllerState {
|
||||
UNKNOWN = 0,
|
||||
USABLE = 1,
|
||||
MISSING = 2,
|
||||
};
|
||||
|
||||
const ACgroupController* controller_ = nullptr;
|
||||
ControllerState state_;
|
||||
};
|
||||
|
||||
class CgroupMap {
|
||||
|
|
Loading…
Reference in a new issue