diff --git a/frameworks/concurrent_task_client/include/concurrent_task_type.h b/frameworks/concurrent_task_client/include/concurrent_task_type.h index cb4d8d6035b04136a44d53b0619751e904e9517f..c900f10a13d8ecdbc5de64f4b805bcd862285341 100644 --- a/frameworks/concurrent_task_client/include/concurrent_task_type.h +++ b/frameworks/concurrent_task_client/include/concurrent_task_type.h @@ -46,11 +46,12 @@ enum QueryIntervalItem { QUERY_UI = 0, QUERY_RENDER = 1, QUERY_RENDER_SERVICE = 2, - QUERY_RENDER_SERVICE_START = 3, - QUERY_COMPOSER = 4, - QUERY_HARDWARE = 5, - QUERY_EXECUTOR_START = 6, - QURRY_TYPE_MAX + QUERY_COMPOSER = 3, + QUERY_HARDWARE = 4, + QUERY_EXECUTOR_START = 5, + QUERY_RENDER_SERVICE_MAIN = 6, + QUERY_RENDER_SERVICE_RENDER = 7, + QURRY_TYPE_MAX, }; enum DeadlineType { diff --git a/services/include/concurrent_task_controller.h b/services/include/concurrent_task_controller.h index d6bcabfeec839faad29cbabdc8c3009f4c09112c..46d9e1f2cb08ad1d581f6cee4d23016758b2c96a 100644 --- a/services/include/concurrent_task_controller.h +++ b/services/include/concurrent_task_controller.h @@ -49,10 +49,13 @@ private: int TryCreateSystemGroup(); void TryCreateHardwareGroup(); void TryCreateRsGroup(); + void TryCreateRSMainGrp(); + void TryCreateRSRenderGrp(); void QueryUi(pid_t uid, IntervalReply& queryRs); void QueryRender(pid_t uid, IntervalReply& queryRs); - void QueryRenderServiceStart(pid_t uid, pid_t pid, IntervalReply& queryRs); void QueryRenderService(pid_t uid, IntervalReply& queryRs); + void QueryRenderServiceMain(pid_t uid, pid_t pid, IntervalReply& queryRs); + void QueryRenderServiceRender(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); @@ -88,9 +91,11 @@ private: std::unordered_map msgType_ = {}; QosPolicy qosPolicy_; std::vector authApps_; - int renderServiceGrpId_ = -1; + int renderServiceMainGrpId_ = -1; + int renderServiceRenderGrpId_ = -1; + int renderServiceMainTid_ = -1; + int renderServiceRenderTid_ = -1; int hardwareGrpId_ = -1; - int rsTid_ = -1; int hardwareTid_ = -1; int systemRate_ = 0; bool rtgEnabled_ = false; diff --git a/services/src/concurrent_task_controller.cpp b/services/src/concurrent_task_controller.cpp index ed7783c1a21b13b13b7bfeed403cedda14b6b933..d618286429f549376f651db574c3d05c93f85cd3 100644 --- a/services/src/concurrent_task_controller.cpp +++ b/services/src/concurrent_task_controller.cpp @@ -105,8 +105,11 @@ void TaskController::QueryInterval(int queryItem, IntervalReply& queryRs) case QUERY_RENDER_SERVICE: QueryRenderService(uid, queryRs); break; - case QUERY_RENDER_SERVICE_START: - QueryRenderServiceStart(uid, pid, queryRs); + case QUERY_RENDER_SERVICE_MAIN: + QueryRenderServiceMain(uid, pid, queryRs); + break; + case QUERY_RENDER_SERVICE_RENDER: + QueryRenderServiceRender(uid, pid, queryRs); break; case QUERY_COMPOSER: QueryHwc(uid, queryRs); @@ -173,16 +176,16 @@ void TaskController::QueryRenderService(int uid, IntervalReply& queryRs) return; } int queryTid = queryRs.tid; - if (renderServiceGrpId_ <= 0) { - TryCreateRsGroup(); - CONCUR_LOGI("uid %{public}d query rs group failed and create %{public}d.", uid, renderServiceGrpId_); - if (renderServiceGrpId_ <= 0) { + if (renderServiceMainGrpId_ <= 0) { + TryCreateRSMainGrp(); + CONCUR_LOGI("uid %{public}d query rs group failed and create %{public}d.", uid, renderServiceMainGrpId_); + if (renderServiceMainGrpId_ <= 0) { CONCUR_LOGE("uid %{public}d create rs group failed", uid); return; } } - queryRs.rtgId = renderServiceGrpId_; + queryRs.rtgId = renderServiceMainGrpId_; if (queryTid <= 0) { return; } @@ -190,45 +193,67 @@ void TaskController::QueryRenderService(int uid, IntervalReply& queryRs) if (iter != rsThreads_.end()) { return; } - queryRs.rtgId = renderServiceGrpId_; - int ret = AddThreadToRtg(queryTid, renderServiceGrpId_, PRIO_RT); + queryRs.rtgId = renderServiceMainGrpId_; + int ret = AddThreadToRtg(queryTid, renderServiceMainGrpId_, PRIO_RT); if (ret < 0) { CONCUR_LOGE("uid %{public}d tid %{public}d join rs group failed", uid, queryTid); return; } CONCUR_LOGI("uid %{public}d tid %{public}d join rs group success in Query", uid, queryTid); - SetFrameRateAndPrioType(renderServiceGrpId_, CURRENT_RATE, PARAM_TYPE); + SetFrameRateAndPrioType(renderServiceMainGrpId_, CURRENT_RATE, PARAM_TYPE); } -void TaskController::QueryRenderServiceStart(int uid, int pid, IntervalReply& queryRs) +void TaskController::QueryRenderServiceMain(int uid, int pid, IntervalReply& queryRs) { if (GetProcessNameByToken() != RENDER_SERVICE_PROCESS_NAME) { return; } - if (!rsAuthed_) { if (AuthSystemProcess(pid) != 0) { return; } rsAuthed_ = true; } - if (renderServiceGrpId_ <= 0) { - TryCreateRsGroup(); - CONCUR_LOGI("uid %{public}d query rs group failed and create %{public}d.", uid, renderServiceGrpId_); - if (renderServiceGrpId_ <= 0) { + if (renderServiceMainGrpId_ <= 0) { + TryCreateRSMainGrp(); + CONCUR_LOGI("uid %{public}d query rs group failed and create %{public}d.", uid, renderServiceMainGrpId_); + if (renderServiceMainGrpId_ <= 0) { + CONCUR_LOGE("uid %{public}d create rs group failed", uid); + return; + } + } + queryRs.rtgId = renderServiceMainGrpId_; + if (renderServiceMainTid_ <= 0) { + renderServiceMainTid_ = queryRs.tid; + int ret = AddThreadToRtg(renderServiceMainTid_, renderServiceMainGrpId_, PRIO_RT); + if (ret < 0) { + CONCUR_LOGE("uid %{public}d tid %{public}d join rs group failed.", uid, renderServiceMainTid_); + } + } + SetFrameRateAndPrioType(renderServiceMainGrpId_, CURRENT_RATE, PARAM_TYPE); +} + +void TaskController::QueryRenderServiceRender(int uid, int pid, IntervalReply& queryRs) +{ + if (GetProcessNameByToken() != RENDER_SERVICE_PROCESS_NAME) { + return; + } + if (renderServiceRenderGrpId_ <= 0) { + TryCreateRSRenderGrp(); + if (renderServiceRenderGrpId_ <= 0) { CONCUR_LOGE("uid %{public}d create rs group failed", uid); return; } } - queryRs.rtgId = renderServiceGrpId_; - if (rsTid_ <= 0) { - rsTid_ = queryRs.tid; - int ret = AddThreadToRtg(rsTid_, renderServiceGrpId_, PRIO_RT); + queryRs.rtgId = renderServiceRenderGrpId_; + if (renderServiceRenderTid_ <= 0 || renderServiceRenderTid_ != queryRs.tid) { + renderServiceRenderTid_ = queryRs.tid; + int ret = AddThreadToRtg(renderServiceRenderTid_, renderServiceRenderGrpId_, PRIO_RT); if (ret < 0) { - CONCUR_LOGE("uid %{public}d tid %{public}d join rs group failed.", uid, rsTid_); + CONCUR_LOGE("uid %{public}d tid %{public}d join rs group failed.", uid, renderServiceMainGrpId_); } } - SetFrameRateAndPrioType(renderServiceGrpId_, CURRENT_RATE, PARAM_TYPE); + SetFrameRateAndPrioType(renderServiceRenderGrpId_, CURRENT_RATE, PARAM_TYPE); } void TaskController::QueryHardware(int uid, int pid, IntervalReply& queryRs) @@ -240,12 +265,13 @@ void TaskController::QueryHardware(int uid, int pid, IntervalReply& queryRs) return; } hardwareTid_ = queryRs.tid; - int ret = AddThreadToRtg(hardwareTid_, renderServiceGrpId_, PRIO_RT); + TryCreateRSMainGrp(); + int ret = AddThreadToRtg(hardwareTid_, renderServiceMainGrpId_, PRIO_RT); if (ret < 0) { - CONCUR_LOGE("uid %{public}d tid %{public}d join hardware group failed.", uid, rsTid_); + CONCUR_LOGE("uid %{public}d tid %{public}d join hardware group failed.", uid, hardwareTid_); return; } - queryRs.tid = hardwareGrpId_; + queryRs.rtgId = hardwareGrpId_; } void TaskController::QueryExecutorStart(int uid, int pid, IntervalReply& queryRs) @@ -253,7 +279,7 @@ void TaskController::QueryExecutorStart(int uid, int pid, IntervalReply& queryRs if (uid != RS_UID) { return; } - if (renderServiceGrpId_ < 0) { + if (renderServiceMainGrpId_ < 0) { return; } std::lock_guard lock(executorStartLock_); @@ -263,13 +289,13 @@ void TaskController::QueryExecutorStart(int uid, int pid, IntervalReply& queryRs if (queryRs.tid <= 0) { return; } - int ret = AddThreadToRtg(queryRs.tid, renderServiceGrpId_, PRIO_RT); + int ret = AddThreadToRtg(queryRs.tid, renderServiceMainGrpId_, PRIO_RT); if (ret < 0) { - CONCUR_LOGE("uid %{public}d tid %{public}d join executor group failed.", uid, rsTid_); + CONCUR_LOGE("uid %{public}d tid %{public}d join executor group failed.", uid, renderServiceMainTid_); return; } executorNum_++; - queryRs.rtgId = renderServiceGrpId_; + queryRs.rtgId = renderServiceMainGrpId_; } void TaskController::QueryHwc(int uid, IntervalReply& queryRs) @@ -299,11 +325,14 @@ void TaskController::Init() void TaskController::Release() { msgType_.clear(); - if (renderServiceGrpId_ <= 0) { - return; + if (renderServiceMainGrpId_ > 0) { + DestroyRtgGrp(renderServiceMainGrpId_); + renderServiceMainGrpId_ = -1; + } + if (renderServiceRenderGrpId_ > 0) { + DestroyRtgGrp(renderServiceRenderGrpId_); + renderServiceRenderGrpId_ = -1; } - DestroyRtgGrp(renderServiceGrpId_); - renderServiceGrpId_ = -1; } void TaskController::TypeMapInit() @@ -319,10 +348,25 @@ void TaskController::TypeMapInit() msgType_.insert(pair("loseFocus", MSG_LOSE_FOCUS)); } +void TaskController::TryCreateRSMainGrp() +{ + if (renderServiceMainGrpId_ == -1) { + renderServiceMainGrpId_ = TryCreateSystemGroup(); + hardwareGrpId_ = renderServiceMainGrpId_; + } +} + +void TaskController::TryCreateRSRenderGrp() +{ + if (renderServiceRenderGrpId_ == -1) { + renderServiceRenderGrpId_ = TryCreateSystemGroup(); + } +} + void TaskController::TryCreateRsGroup() { - renderServiceGrpId_ = TryCreateSystemGroup(); - hardwareGrpId_ = renderServiceGrpId_; + TryCreateRSMainGrp(); + TryCreateRSRenderGrp(); } int TaskController::TryCreateSystemGroup() @@ -743,11 +787,11 @@ int TaskController::FindRateFromInfo(int uiTid, const Json::Value& payload) void TaskController::SetRenderServiceRate(const Json::Value& payload) { - int rsRate = FindRateFromInfo(rsTid_, payload); - if (renderServiceGrpId_ > 0 && rsRate > 0 && rsRate != systemRate_) { + int rsRate = FindRateFromInfo(renderServiceMainTid_, payload); + if (renderServiceMainGrpId_ > 0 && rsRate > 0 && rsRate != systemRate_) { CONCUR_LOGI("set rs rate %{public}d rtgId is %{public}d, old rate is %{public}d", - rsRate, renderServiceGrpId_, systemRate_); - SetFrameRate(renderServiceGrpId_, rsRate); + rsRate, renderServiceMainGrpId_, systemRate_); + SetFrameRate(renderServiceMainGrpId_, rsRate); systemRate_ = rsRate; bool ret = OHOS::system::SetParameter(INTERVAL_RS_RATE, std::to_string(rsRate)); if (ret == false) { diff --git a/test/fuzztest/concurrent_fuzzer/concurrent_fuzzer.cpp b/test/fuzztest/concurrent_fuzzer/concurrent_fuzzer.cpp index 44b5b79cea55d39f202177270535cbb3cde47e72..5a082886a04d9244d7b2a468c65c463d5b3c9589 100644 --- a/test/fuzztest/concurrent_fuzzer/concurrent_fuzzer.cpp +++ b/test/fuzztest/concurrent_fuzzer/concurrent_fuzzer.cpp @@ -716,7 +716,7 @@ bool FuzzTaskControllerQueryRenderService(const uint8_t* data, size_t size) queryRs.rtgId = GetData(); queryRs.paramA = 1; queryRs.paramB = 1; - TaskController::GetInstance().renderServiceGrpId_ = GetData(); + TaskController::GetInstance().renderServiceMainGrpId_ = GetData(); TaskController::GetInstance().QueryRenderService(uid, queryRs); } return true; @@ -734,7 +734,7 @@ bool FuzzTaskControllerQueryExecutorStart(const uint8_t* data, size_t size) queryRs.rtgId = GetData(); queryRs.paramA = 1; queryRs.paramB = 1; - TaskController::GetInstance().renderServiceGrpId_ = GetData(); + TaskController::GetInstance().renderServiceMainGrpId_ = GetData(); TaskController::GetInstance().QueryRenderService(uid, queryRs); } return true; diff --git a/test/unittest/phone/concurrent_svc_intf_test.cpp b/test/unittest/phone/concurrent_svc_intf_test.cpp index d63e605f66cc463e574016e2a78996d6213d964f..8c8042a173620ba96fcd503e37e9ebf2cb7bae27 100644 --- a/test/unittest/phone/concurrent_svc_intf_test.cpp +++ b/test/unittest/phone/concurrent_svc_intf_test.cpp @@ -104,7 +104,7 @@ HWTEST_F(ConcurrentSvcIntfTest, QueryNagativeItem, TestSize.Level1) */ HWTEST_F(ConcurrentSvcIntfTest, QueryRenderServiceTest, TestSize.Level1) { - int grpId = QueryInterval(QUERY_RENDER_SERVICE); + int grpId = QueryInterval(QUERY_RENDER_SERVICE_MAIN); #if TDD_MUSL EXPECT_GT(grpId, 0); #else diff --git a/test/unittest/phone/concurrent_task_controller_test.cpp b/test/unittest/phone/concurrent_task_controller_test.cpp index 75db813a64549e0567bfc581eb01d76c3f362391..be2df456c41819d49f7e5a7ee7d2948282a0a9f2 100644 --- a/test/unittest/phone/concurrent_task_controller_test.cpp +++ b/test/unittest/phone/concurrent_task_controller_test.cpp @@ -126,6 +126,32 @@ HWTEST_F(ConcurrentTaskControllerTest, TryCreateRsGroupTest, TestSize.Level1) TaskController::GetInstance().TryCreateRsGroup(); } +/** + * @tc.name: PushTaskTest + * @tc.desc: Test whether the PushTask interface are normal. + * @tc.type: FUNC + */ +HWTEST_F(ConcurrentTaskControllerTest, TryCreateRSMainGrpTest, TestSize.Level1) +{ + TaskController::GetInstance().rtgEnabled_ = false; + TaskController::GetInstance().TryCreateRSMainGrp(); + TaskController::GetInstance().rtgEnabled_ = true; + TaskController::GetInstance().TryCreateRSMainGrp(); +} + +/** + * @tc.name: PushTaskTest + * @tc.desc: Test whether the PushTask interface are normal. + * @tc.type: FUNC + */ +HWTEST_F(ConcurrentTaskControllerTest, TryCreateRSRenderGrpTest, TestSize.Level1) +{ + TaskController::GetInstance().rtgEnabled_ = false; + TaskController::GetInstance().TryCreateRSRenderGrp(); + TaskController::GetInstance().rtgEnabled_ = true; + TaskController::GetInstance().TryCreateRSRenderGrp(); +} + /** * @tc.name:QueryRenderServiceTest * @tc.desc: Test whether the QueryRenderService interface is normal @@ -136,10 +162,8 @@ HWTEST_F(ConcurrentTaskControllerTest, QueryRenderServiceTest, TestSize.Level1) int uid = SYSTEM_UID; IntervalReply queryRs = {87, 657, 357, 214}; TaskController::GetInstance().QueryRenderService(uid, queryRs); - int grpId = TaskController::GetInstance().renderServiceGrpId_; + int grpId = TaskController::GetInstance().renderServiceMainGrpId_; EXPECT_TRUE(grpId > 0); - int rsThreadsSize = TaskController::GetInstance().rsThreads_.size(); - EXPECT_TRUE(rsThreadsSize > 0); } /** @@ -147,19 +171,39 @@ HWTEST_F(ConcurrentTaskControllerTest, QueryRenderServiceTest, TestSize.Level1) * @tc.desc: Test whether the PushTask interface are normal. * @tc.type: FUNC */ -HWTEST_F(ConcurrentTaskControllerTest, QueryRenderServiceStartTest, TestSize.Level1) +HWTEST_F(ConcurrentTaskControllerTest, QueryRenderServiceMainTest, TestSize.Level1) +{ + int uid = SYSTEM_UID; + int pid = getpid(); + IntervalReply queryRs = {87, 657, 357, 214}; + TaskController::GetInstance().QueryRenderServiceMain(uid, pid, queryRs); + int flag = TaskController::GetInstance().renderServiceMainGrpId_; + TaskController::GetInstance().renderServiceMainGrpId_ = 1; + TaskController::GetInstance().QueryRenderServiceMain(uid, pid, queryRs); + TaskController::GetInstance().renderServiceMainGrpId_ = -1; + TaskController::GetInstance().QueryRenderServiceMain(uid, pid, queryRs); + TaskController::GetInstance().renderServiceMainGrpId_ = flag; + TaskController::GetInstance().QueryRenderServiceMain(uid, pid, queryRs); +} + +/** + * @tc.name: PushTaskTest + * @tc.desc: Test whether the PushTask interface are normal. + * @tc.type: FUNC + */ +HWTEST_F(ConcurrentTaskControllerTest, QueryRenderServiceRenderTest, TestSize.Level1) { int uid = SYSTEM_UID; int pid = getpid(); IntervalReply queryRs = {87, 657, 357, 214}; - TaskController::GetInstance().QueryRenderServiceStart(uid, pid, queryRs); - int flag = TaskController::GetInstance().renderServiceGrpId_; - TaskController::GetInstance().renderServiceGrpId_ = 1; - TaskController::GetInstance().QueryRenderServiceStart(uid, pid, queryRs); - TaskController::GetInstance().renderServiceGrpId_ = -1; - TaskController::GetInstance().QueryRenderServiceStart(uid, pid, queryRs); - TaskController::GetInstance().renderServiceGrpId_ = flag; - TaskController::GetInstance().QueryRenderServiceStart(uid, pid, queryRs); + TaskController::GetInstance().QueryRenderServiceRender(uid, pid, queryRs); + int flag = TaskController::GetInstance().renderServiceRenderGrpId_; + TaskController::GetInstance().renderServiceRenderGrpId_ = 1; + TaskController::GetInstance().QueryRenderServiceRender(uid, pid, queryRs); + TaskController::GetInstance().renderServiceRenderGrpId_ = -1; + TaskController::GetInstance().QueryRenderServiceRender(uid, pid, queryRs); + TaskController::GetInstance().renderServiceRenderGrpId_ = flag; + TaskController::GetInstance().QueryRenderServiceRender(uid, pid, queryRs); } /** @@ -403,9 +447,9 @@ HWTEST_F(ConcurrentTaskControllerTest, SetRenderServiceRateTest, TestSize.Level1 { Json::Value payload; payload["758"] = "120"; - TaskController::GetInstance().rsTid_ = 758; + TaskController::GetInstance().renderServiceMainTid_ = 758; TaskController::GetInstance().systemRate_ = 0; - TaskController::GetInstance().renderServiceGrpId_ = 1; + TaskController::GetInstance().renderServiceMainGrpId_ = 1; TaskController::GetInstance().SetRenderServiceRate(payload); EXPECT_EQ(TaskController::GetInstance().systemRate_, 120); EXPECT_EQ(OHOS::system::GetIntParameter("persist.ffrt.interval.rsRate", 0), 120);