diff --git a/frameworks/concurrent_task_client/include/concurrent_task_type.h b/frameworks/concurrent_task_client/include/concurrent_task_type.h index 504aa6e1eae12b418091195e71e964c6377a45a8..10c0c18f80ee02f9b78eafe0f91337dc30bd227b 100644 --- a/frameworks/concurrent_task_client/include/concurrent_task_type.h +++ b/frameworks/concurrent_task_client/include/concurrent_task_type.h @@ -48,6 +48,7 @@ enum QueryIntervalItem { QUERY_RENDER_SERVICE = 2, QUERY_COMPOSER = 3, QUERY_HARDWARE = 4, + QUERY_EXECUTOR_START = 5, QURRY_TYPE_MAX }; diff --git a/services/include/concurrent_task_controller.h b/services/include/concurrent_task_controller.h index 44ebdfaf779a6479a8412a586f44f4e0aac50745..9b5f5e87d7eed8239b7e11f91470036a29fa03e4 100644 --- a/services/include/concurrent_task_controller.h +++ b/services/include/concurrent_task_controller.h @@ -53,6 +53,7 @@ private: void QueryRender(pid_t uid, IntervalReply& queryRs); void QueryRenderService(pid_t uid, pid_t pid, IntervalReply& queryRs); void QueryHardware(pid_t uid, pid_t pid, IntervalReply& queryRs); + void QueryExecutorStart(pid_t uid, pid_t pid, IntervalReply& queryRs); void QueryHwc(pid_t uid, IntervalReply& queryRs); int GetRequestType(std::string strRequstType); void DealSystemRequest(int requestType, const Json::Value& payload); @@ -80,6 +81,7 @@ private: std::mutex appInfoLock_; std::mutex rateInfoLock_; + std::mutex executorStartLock_; std::list foregroundApp_ = {}; std::unordered_map msgType_ = {}; QosPolicy qosPolicy_; @@ -92,6 +94,7 @@ private: bool rtgEnabled_ = false; bool rsAuthed_ = false; std::atomic curGamePid_ = -1; + int executorNum_ = 0; const std::string RENDER_SERVICE_PROCESS_NAME = "render_service"; const std::string RESOURCE_SCHEDULE_PROCESS_NAME = "resource_schedule_service"; diff --git a/services/src/concurrent_task_controller.cpp b/services/src/concurrent_task_controller.cpp index cafd794a1d84ba6668fdf86c5ac6d1932b225319..1aabe3a2edc95d09359cb524c872273e801a1616 100644 --- a/services/src/concurrent_task_controller.cpp +++ b/services/src/concurrent_task_controller.cpp @@ -42,6 +42,7 @@ namespace { const char RTG_SCHED_IPC_MAGIC = 0xAB; constexpr int RTG_TYPE_MAX = 3; constexpr int RS_UID = 1003; + constexpr int EXECUTOR_LIMIT_NUM = 3; } #define CMD_ID_SET_RTG \ @@ -110,6 +111,9 @@ void TaskController::QueryInterval(int queryItem, IntervalReply& queryRs) case QUERY_HARDWARE: QueryHardware(uid, pid, queryRs); break; + case QUERY_EXECUTOR_START: + QueryExecutorStart(uid, pid, queryRs); + break; default: break; } @@ -207,6 +211,30 @@ void TaskController::QueryHardware(int uid, int pid, IntervalReply& queryRs) queryRs.tid = hardwareGrpId_; } +void TaskController::QueryExecutorStart(int uid, int pid, IntervalReply& queryRs) +{ + if (uid != RS_UID) { + return; + } + if (renderServiceGrpId_ < 0) { + return; + } + std::lock_guard lock(executorStartLock_); + if (executorNum_ >= EXECUTOR_LIMIT_NUM) { + return; + } + if (queryRs.tid <= 0) { + return; + } + int ret = AddThreadToRtg(queryRs.tid, renderServiceGrpId_, PRIO_RT); + if (ret < 0) { + CONCUR_LOGE("uid %{public}d tid %{public}d join executor group failed.", uid, rsTid_); + return; + } + executorNum_++; + queryRs.rtgId = renderServiceGrpId_; +} + void TaskController::QueryHwc(int uid, IntervalReply& queryRs) { pid_t pid = IPCSkeleton::GetInstance().GetCallingPid();