summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSuren Baghdasaryan <surenb@google.com>2020-07-01 12:34:17 -0700
committerSuren Baghdasaryan <surenb@google.com>2020-07-01 15:22:04 -0700
commitd4bc3f2adb882c4d7858653ab38f6f5a0baf5171 (patch)
treeb3782c3651bcdb65b12387b0f337c5e9322c78b9
parentd389d983bc4db64e128da5a55e8dc41182010c52 (diff)
downloadcore-d4bc3f2adb882c4d7858653ab38f6f5a0baf5171.tar.gz
libprocessgroup: Allow vendor profile attributes to override system ones
In the current implementation vendor profile attributes do not override system ones and instead generate a warning. Fix that by overriding existing attribute if a new definition is found. Bug: 160318642 Test: add vendor attributes and confirm no warnings Signed-off-by: Suren Baghdasaryan <surenb@google.com> Merged-In: I71a2ee4d4b3c585e7c9a01b791e973390d409cbc Change-Id: I71a2ee4d4b3c585e7c9a01b791e973390d409cbc
-rw-r--r--libprocessgroup/task_profiles.cpp16
-rw-r--r--libprocessgroup/task_profiles.h1
2 files changed, 12 insertions, 5 deletions
diff --git a/libprocessgroup/task_profiles.cpp b/libprocessgroup/task_profiles.cpp
index 4af4589da..a638fcac6 100644
--- a/libprocessgroup/task_profiles.cpp
+++ b/libprocessgroup/task_profiles.cpp
@@ -44,6 +44,11 @@ using android::base::WriteStringToFile;
#define TASK_PROFILE_DB_FILE "/etc/task_profiles.json"
#define TASK_PROFILE_DB_VENDOR_FILE "/vendor/etc/task_profiles.json"
+void ProfileAttribute::Reset(const CgroupController& controller, const std::string& file_name) {
+ controller_ = controller;
+ file_name_ = file_name;
+}
+
bool ProfileAttribute::GetPathForTask(int tid, std::string* path) const {
std::string subgroup;
if (!controller()->GetTaskGroup(tid, &subgroup)) {
@@ -380,15 +385,16 @@ bool TaskProfiles::Load(const CgroupMap& cg_map, const std::string& file_name) {
std::string controller_name = attr[i]["Controller"].asString();
std::string file_attr = attr[i]["File"].asString();
- if (attributes_.find(name) == attributes_.end()) {
- auto controller = cg_map.FindController(controller_name);
- if (controller.HasValue()) {
+ auto controller = cg_map.FindController(controller_name);
+ if (controller.HasValue()) {
+ auto iter = attributes_.find(name);
+ if (iter == attributes_.end()) {
attributes_[name] = std::make_unique<ProfileAttribute>(controller, file_attr);
} else {
- LOG(WARNING) << "Controller " << controller_name << " is not found";
+ iter->second->Reset(controller, file_attr);
}
} else {
- LOG(WARNING) << "Attribute " << name << " is already defined";
+ LOG(WARNING) << "Controller " << controller_name << " is not found";
}
}
diff --git a/libprocessgroup/task_profiles.h b/libprocessgroup/task_profiles.h
index 28bc00c10..2983a09b3 100644
--- a/libprocessgroup/task_profiles.h
+++ b/libprocessgroup/task_profiles.h
@@ -33,6 +33,7 @@ class ProfileAttribute {
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);
bool GetPathForTask(int tid, std::string* path) const;