1 /* 2 * Copyright (c) 2022-2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef SOC_PERF_SERVICES_CORE_INCLUDE_SOCPERF_COMMON_H 17 #define SOC_PERF_SERVICES_CORE_INCLUDE_SOCPERF_COMMON_H 18 19 #include <climits> 20 #include <list> 21 #include <mutex> 22 #include <string> 23 #include <vector> 24 #include <unordered_map> 25 #include <unordered_set> 26 #include "socperf_log.h" 27 #include "socperf_action_type.h" 28 29 namespace OHOS { 30 namespace SOCPERF { 31 enum EventType { 32 EVENT_INVALID = -1, 33 EVENT_OFF, 34 EVENT_ON 35 }; 36 37 const std::string SOCPERF_RESOURCE_CONFIG_XML = "etc/soc_perf/socperf_resource_config.xml"; 38 const std::string SOCPERF_BOOST_CONFIG_XML = "etc/soc_perf/socperf_boost_config.xml"; 39 const std::string SOCPERF_BOOST_CONFIG_XML_EXT = "etc/soc_perf/socperf_boost_config_ext.xml"; 40 const int64_t MAX_INT_VALUE = 0x7FFFFFFFFFFFFFFF; 41 const int64_t MIN_INT_VALUE = 0x8000000000000000; 42 const int32_t INVALID_VALUE = INT_MIN; 43 const int32_t RESET_VALUE = -1; 44 const int32_t MIN_RESOURCE_ID = 1000; 45 const int32_t MAX_RESOURCE_ID = 5999; 46 const int32_t RES_ID_ADDITION = 10000; 47 const int32_t RES_ID_AND_VALUE_PAIR = 2; 48 const int32_t RES_ID_NUMS_PER_TYPE = 1000; 49 const int32_t RES_ID_NUMS_PER_TYPE_EXT = 10000; 50 const int32_t WRITE_NODE = 0; 51 const int32_t REPORT_TO_PERFSO = 1; 52 const int32_t INVALID_THERMAL_CMD_ID = -1; 53 const int32_t INVALID_DURATION = -1; 54 const int32_t MIN_THERMAL_LVL = 0; 55 const int32_t RES_MODE_AND_ID_PAIR = 2; 56 const int32_t MAX_RES_MODE_LEN = 64; 57 const int32_t MAX_FREQUE_NODE = 1; 58 const int32_t NODE_DEFAULT_VALUE = -1; 59 60 const std::unordered_map<std::string, std::vector<std::string>> MUTEX_MODE = { 61 {"displaySub", {"displayMain", "displayFull"}}, 62 {"displayMain", {"displaySub", "displayFull"}}, 63 {"displayFull", {"displayMain", "displaySub"}} 64 }; 65 66 class ResourceNode { 67 public: 68 int32_t id; 69 std::string name; 70 int64_t def; 71 std::unordered_set<int64_t> available; 72 int32_t persistMode; 73 bool isGov; 74 bool isMaxValue; 75 public: ResourceNode(int32_t id,const std::string & name,int32_t persistMode,bool isGov,bool isMaxValue)76 ResourceNode(int32_t id, const std::string& name, int32_t persistMode, bool isGov, bool isMaxValue) : id(id), 77 name(name), def(INVALID_VALUE), persistMode(persistMode), isGov(isGov), isMaxValue(isMaxValue) {} ~ResourceNode()78 virtual ~ResourceNode() {}; PrintString()79 virtual void PrintString() {}; 80 }; 81 82 class ResNode : public ResourceNode { 83 public: 84 std::string path; 85 int32_t pair; 86 87 public: ResNode(int32_t resId,const std::string & resName,int32_t resMode,int32_t resPair,int32_t resPersistMode)88 ResNode(int32_t resId, const std::string& resName, int32_t resMode, int32_t resPair, int32_t resPersistMode) 89 : ResourceNode(resId, resName, resPersistMode, false, resMode == MAX_FREQUE_NODE) 90 { 91 pair = resPair; 92 } ~ResNode()93 ~ResNode() {} 94 }; 95 96 class GovResNode : public ResourceNode { 97 public: 98 std::vector<std::string> paths; 99 std::mutex levelToStrMutex_; 100 std::unordered_map<int64_t, std::vector<std::string>> levelToStr; 101 102 public: GovResNode(int32_t govResId,const std::string & govResName,int32_t govPersistMode)103 GovResNode(int32_t govResId, const std::string& govResName, int32_t govPersistMode) 104 : ResourceNode(govResId, govResName, govPersistMode, true, false) {} ~GovResNode()105 ~GovResNode() {} 106 }; 107 108 class Action { 109 public: 110 int32_t thermalCmdId_ = INVALID_THERMAL_CMD_ID; 111 int32_t thermalLvl_ = MIN_THERMAL_LVL; 112 int32_t duration = INVALID_DURATION; 113 std::vector<int64_t> variable; 114 115 public: Action()116 Action() {} ~Action()117 ~Action() {} 118 }; 119 120 class Actions { 121 public: 122 int32_t id; 123 std::string name; 124 std::list<std::shared_ptr<Action>> actionList; 125 std::mutex modeMapMutex_; 126 std::unordered_map<std::string, int32_t> modeMap; 127 bool isLongTimePerf = false; 128 129 public: Actions(int32_t cmdId,const std::string & cmdName)130 Actions(int32_t cmdId, const std::string& cmdName) 131 { 132 id = cmdId; 133 name = cmdName; 134 } ~Actions()135 ~Actions() {} 136 }; 137 138 class ResAction { 139 public: 140 int64_t value; 141 int32_t duration; 142 int32_t type; 143 int32_t onOff; 144 int32_t cmdId; 145 int64_t endTime; 146 147 public: ResAction(int64_t resActionValue,int32_t resActionDuration,int32_t resActionType,int32_t resActionOnOff,int32_t resActionCmdId,int64_t resActionEndTime)148 ResAction(int64_t resActionValue, int32_t resActionDuration, int32_t resActionType, 149 int32_t resActionOnOff, int32_t resActionCmdId, int64_t resActionEndTime) 150 { 151 value = resActionValue; 152 duration = resActionDuration; 153 type = resActionType; 154 onOff = resActionOnOff; 155 cmdId = resActionCmdId; 156 endTime = resActionEndTime; 157 } ~ResAction()158 ~ResAction() {} 159 TotalSame(std::shared_ptr<ResAction> resAction)160 bool TotalSame(std::shared_ptr<ResAction> resAction) 161 { 162 if (value == resAction->value 163 && duration == resAction->duration 164 && type == resAction->type 165 && onOff == resAction->onOff 166 && cmdId == resAction->cmdId) { 167 return true; 168 } 169 return false; 170 } 171 PartSame(std::shared_ptr<ResAction> resAction)172 bool PartSame(std::shared_ptr<ResAction> resAction) 173 { 174 if (value == resAction->value 175 && duration == resAction->duration 176 && type == resAction->type 177 && cmdId == resAction->cmdId) { 178 return true; 179 } 180 return false; 181 } 182 }; 183 184 class ResActionItem { 185 public: ResActionItem(int32_t id)186 ResActionItem(int32_t id) 187 { 188 resId = id; 189 } 190 191 ~ResActionItem() = default; 192 193 int32_t resId; 194 std::shared_ptr<ResAction> resAction = nullptr; 195 std::shared_ptr<ResActionItem> next = nullptr; 196 }; 197 198 class ResStatus { 199 public: 200 std::vector<std::list<std::shared_ptr<ResAction>>> resActionList; 201 std::vector<int64_t> candidatesValue; 202 std::vector<int64_t> candidatesEndTime; 203 int64_t candidate; 204 int64_t currentValue; 205 int64_t previousValue; 206 int64_t currentEndTime; 207 int64_t previousEndTime; 208 209 public: ResStatus()210 explicit ResStatus() 211 { 212 resActionList = std::vector<std::list<std::shared_ptr<ResAction>>>(ACTION_TYPE_MAX); 213 candidatesValue = std::vector<int64_t>(ACTION_TYPE_MAX); 214 candidatesEndTime = std::vector<int64_t>(ACTION_TYPE_MAX); 215 candidatesValue[ACTION_TYPE_PERF] = INVALID_VALUE; 216 candidatesValue[ACTION_TYPE_POWER] = INVALID_VALUE; 217 candidatesValue[ACTION_TYPE_THERMAL] = INVALID_VALUE; 218 candidatesValue[ACTION_TYPE_PERFLVL] = INVALID_VALUE; 219 candidatesEndTime[ACTION_TYPE_PERF] = MAX_INT_VALUE; 220 candidatesEndTime[ACTION_TYPE_POWER] = MAX_INT_VALUE; 221 candidatesEndTime[ACTION_TYPE_THERMAL] = MAX_INT_VALUE; 222 candidatesEndTime[ACTION_TYPE_PERFLVL] = MAX_INT_VALUE; 223 candidate = NODE_DEFAULT_VALUE; 224 currentValue = NODE_DEFAULT_VALUE; 225 previousValue = NODE_DEFAULT_VALUE; 226 currentEndTime = MAX_INT_VALUE; 227 previousEndTime = MAX_INT_VALUE; 228 } ~ResStatus()229 ~ResStatus() {} 230 }; 231 Max(int64_t num1,int64_t num2)232 static inline int64_t Max(int64_t num1, int64_t num2) 233 { 234 if (num1 >= num2) { 235 return num1; 236 } 237 return num2; 238 } 239 Max(int64_t num1,int64_t num2,int64_t num3)240 static inline int64_t Max(int64_t num1, int64_t num2, int64_t num3) 241 { 242 return Max(Max(num1, num2), num3); 243 } 244 Min(int64_t num1,int64_t num2)245 static inline int64_t Min(int64_t num1, int64_t num2) 246 { 247 if (num1 <= num2) { 248 return num1; 249 } 250 return num2; 251 } 252 Min(int64_t num1,int64_t num2,int64_t num3)253 static inline int64_t Min(int64_t num1, int64_t num2, int64_t num3) 254 { 255 return Min(Min(num1, num2), num3); 256 } 257 IsNumber(const std::string & str)258 static inline bool IsNumber(const std::string& str) 259 { 260 for (int32_t i = 0; i < (int32_t)str.size(); i++) { 261 if (i == 0 && str.at(i) == '-') { 262 continue; 263 } 264 if (str.at(i) < '0' || str.at(i) > '9') { 265 return false; 266 } 267 } 268 return true; 269 } 270 IsValidRangeResId(int32_t id)271 static inline bool IsValidRangeResId(int32_t id) 272 { 273 if (id < MIN_RESOURCE_ID || id > MAX_RESOURCE_ID) { 274 return false; 275 } 276 return true; 277 } 278 IsValidPersistMode(int32_t persistMode)279 static inline bool IsValidPersistMode(int32_t persistMode) 280 { 281 if (persistMode != WRITE_NODE && persistMode != REPORT_TO_PERFSO) { 282 return false; 283 } 284 return true; 285 } 286 SplitEx(const std::string & str,const std::string & pattern)287 static std::vector<std::string> SplitEx(const std::string& str, const std::string& pattern) 288 { 289 int32_t position; 290 std::vector<std::string> result; 291 std::string tempStr = str; 292 tempStr += pattern; 293 int32_t length = (int32_t)tempStr.size(); 294 for (int32_t i = 0; i < length; i++) { 295 position = (int32_t)tempStr.find(pattern, i); 296 if (position < length) { 297 std::string tmp = tempStr.substr(i, position - i); 298 result.push_back(tmp); 299 i = position + (int32_t)pattern.size() - 1; 300 } 301 } 302 return result; 303 } 304 Split(const std::string & str,const std::string & pattern)305 static inline std::vector<std::string> Split(const std::string& str, const std::string& pattern) 306 { 307 return SplitEx(str, pattern); 308 } 309 310 } // namespace SOCPERF 311 } // namespace OHOS 312 313 #endif // SOC_PERF_SERVICES_CORE_INCLUDE_COMMON_H 314