From 2a3540a74b648413f28f1c74cd2b6f53636bdb39 Mon Sep 17 00:00:00 2001 From: Suren Baghdasaryan Date: Wed, 1 Jul 2020 12:34:17 -0700 Subject: [PATCH] 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 Merged-In: I71a2ee4d4b3c585e7c9a01b791e973390d409cbc Change-Id: I71a2ee4d4b3c585e7c9a01b791e973390d409cbc Former-commit-id: d4bc3f2adb882c4d7858653ab38f6f5a0baf5171 --- libprocessgroup/task_profiles.cpp | 16 +++++++++++----- libprocessgroup/task_profiles.h | 1 + 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(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;