From 8fd3727e0738dfd7b7b2d6ae02734fb4676506c1 Mon Sep 17 00:00:00 2001 From: zhaolixue Date: Tue, 5 Aug 2025 18:39:27 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E6=9C=BA=E9=80=BB=E8=BE=91=EF=BC=8C=E8=A7=A3=E5=86=B3post?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=97=B6=E5=BA=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhaolixue --- .../status_mgr_center/form_status_mgr.h | 12 +++- .../src/status_mgr_center/form_status_mgr.cpp | 72 ++++++++++--------- .../fms_form_status_mgr_test.cpp | 28 ++++++++ 3 files changed, 76 insertions(+), 36 deletions(-) diff --git a/services/include/status_mgr_center/form_status_mgr.h b/services/include/status_mgr_center/form_status_mgr.h index aeca1c54f2..4b9ef26adf 100644 --- a/services/include/status_mgr_center/form_status_mgr.h +++ b/services/include/status_mgr_center/form_status_mgr.h @@ -35,11 +35,10 @@ class FormStatusMgr final : public DelayedRefSingleton { public: /** - * @brief Posts a form event + * @brief Post a form event * @param formId The ID of the form * @param event The event to trigger * @param func The function to handle the event (default is nullptr) - * @return The event handling result */ void PostFormEvent(const int64_t formId, const FormFsmEvent event, std::function func = nullptr); @@ -80,6 +79,15 @@ private: void ExecFormTaskTimeout( const int64_t formId, FormEventTimeout timeoutMs, FormFsmEvent event, FormFsmStatus status); + /** + * @brief Executing a State Machine Task + * @param formId The ID of the form + * @param event The event to trigger + * @param func The function to handle the event (default is nullptr) + * @return True on success, false on fail. + */ + bool ExecStatusMachineTask(const int64_t formId, const FormFsmEvent event, std::function func = nullptr); + /** * @brief Form task execution function * @param processType Form processing policy type diff --git a/services/src/status_mgr_center/form_status_mgr.cpp b/services/src/status_mgr_center/form_status_mgr.cpp index 9466b5a65c..b01d5ef0bc 100644 --- a/services/src/status_mgr_center/form_status_mgr.cpp +++ b/services/src/status_mgr_center/form_status_mgr.cpp @@ -24,9 +24,6 @@ namespace OHOS { namespace AppExecFwk { -namespace { -constexpr int32_t FORM_TASK_DELAY_TIME = 20; // ms -} FormStatusMgr::FormStatusMgr() { HILOG_DEBUG("create FormStatusMgr"); @@ -40,36 +37,10 @@ FormStatusMgr::~FormStatusMgr() void FormStatusMgr::PostFormEvent(const int64_t formId, const FormFsmEvent event, std::function func) { auto task = [formId, event, func]() { - // get status machine info - if (!FormStatus::GetInstance().HasFormStatus(formId)) { - HILOG_INFO("create new status."); - FormStatus::GetInstance().SetFormStatus(formId, FormFsmStatus::INIT); - } - FormFsmStatus status = FormStatus::GetInstance().GetFormStatus(formId); - - FormStatusMachineInfo info; - if (!FormStatusTable::GetInstance().GetFormStatusInfo(status, event, info)) { - return; - } - - HILOG_INFO("state transition, formId:%{public}" PRId64 - ", status is %{public}d, event is %{public}d, nextStatus is %{public}d.", - formId, - static_cast(status), - static_cast(event), - static_cast(info.nextStatus)); - - // state machine switches to the next state. - FormStatus::GetInstance().SetFormStatus(formId, info.nextStatus); - - // state machine timeout process - FormStatusMgr::GetInstance().ExecFormTaskTimeout(formId, info.timeoutMs, event, status); - - // state machine excute - FormStatusMgr::GetInstance().ExecFormTask(info.processType, formId, event, func); + FormStatusMgr::GetInstance().ExecStatusMachineTask(formId, event, func); }; - FormStatusQueue::GetInstance().ScheduleTask(FORM_TASK_DELAY_TIME, task); + FormStatusQueue::GetInstance().ScheduleTask(0, task); } void FormStatusMgr::CancelFormEventTimeout(const int64_t formId, std::string eventId) @@ -97,13 +68,45 @@ void FormStatusMgr::ExecFormTaskTimeout( static_cast(event), static_cast(status), formId); - FormStatusMgr::GetInstance().PostFormEvent(formId, FormFsmEvent::EXECUTION_TIMEOUT); + FormStatusMgr::GetInstance().ExecStatusMachineTask(formId, FormFsmEvent::EXECUTION_TIMEOUT); FormEventTimeoutQueue::GetInstance().CancelDelayTask(std::make_pair(formId, eventId)); }; FormEventTimeoutQueue::GetInstance().ScheduleDelayTask( std::make_pair(formId, eventId), static_cast(timeoutMs), timeoutTask); } +bool FormStatusMgr::ExecStatusMachineTask(const int64_t formId, const FormFsmEvent event, std::function func) +{ + // get status machine info + if (!FormStatus::GetInstance().HasFormStatus(formId)) { + HILOG_INFO("create new status."); + FormStatus::GetInstance().SetFormStatus(formId, FormFsmStatus::INIT); + } + FormFsmStatus status = FormStatus::GetInstance().GetFormStatus(formId); + + FormStatusMachineInfo info; + if (!FormStatusTable::GetInstance().GetFormStatusInfo(status, event, info)) { + return false; + } + + HILOG_INFO("state transition, formId:%{public}" PRId64 + ", status is %{public}d, event is %{public}d, nextStatus is %{public}d.", + formId, + static_cast(status), + static_cast(event), + static_cast(info.nextStatus)); + + // state machine switches to the next state. + FormStatus::GetInstance().SetFormStatus(formId, info.nextStatus); + + // state machine timeout process + FormStatusMgr::GetInstance().ExecFormTaskTimeout(formId, info.timeoutMs, event, status); + + // state machine excute + FormStatusMgr::GetInstance().ExecFormTask(info.processType, formId, event, func); + return true; +} + void FormStatusMgr::ExecFormTask( FormFsmProcessType processType, const int64_t formId, const FormFsmEvent event, std::function func) { @@ -229,7 +232,8 @@ void FormStatusMgr::ProcessTaskFromQueue(const int64_t formId) if (event == FormFsmEvent::RECYCLE_FORM) { FormDataMgr::GetInstance().UpdateFormRecordSetIsExistRecycleTask(formId, false); } - FormStatusMgr::GetInstance().PostFormEvent(formId, event, func); + + FormStatusMgr::GetInstance().ExecStatusMachineTask(formId, event, func); } void FormStatusMgr::ProcessTaskDelete(const int64_t formId) @@ -263,7 +267,7 @@ void FormStatusMgr::ProcessTaskFromRetry(const int64_t formId) auto func = formEventInfo.getFunc(); auto event = formEventInfo.getFormEvent(); - FormStatusMgr::GetInstance().PostFormEvent(formId, event, func); + FormStatusMgr::GetInstance().ExecStatusMachineTask(formId, event, func); } bool FormStatusMgr::HasFormEventQueue(const int64_t formId) diff --git a/test/unittest/fms_form_status_mgr_center_test/fms_form_status_mgr_test.cpp b/test/unittest/fms_form_status_mgr_center_test/fms_form_status_mgr_test.cpp index c7e2f35387..7b895decc1 100644 --- a/test/unittest/fms_form_status_mgr_center_test/fms_form_status_mgr_test.cpp +++ b/test/unittest/fms_form_status_mgr_center_test/fms_form_status_mgr_test.cpp @@ -233,4 +233,32 @@ HWTEST_F(FormStatusMgrTest, FormStatusMgrTest_0007, TestSize.Level0) GTEST_LOG_(INFO) << "FormStatusMgrTest_0007 end"; } + +/** + * @tc.name: FormStatusMgrTest_ExecStatusMachineTask + * @tc.desc: Verify ExecStatusMachineTask + * @tc.type: FUNC + */ +HWTEST_F(FormStatusMgrTest, FormStatusMgrTest_ExecStatusMachineTask, TestSize.Level0) +{ + GTEST_LOG_(INFO) << "FormStatusMgrTest_ExecStatusMachineTask start"; + + int64_t formId = FORM_ID; + FormStatusMgr::GetInstance().DeleteFormEventId(formId); + static bool result = false; + auto task = []() { + GTEST_LOG_(INFO) << "FormStatusMgrTest_ExecStatusMachineTask Task called zlx"; + result = true; + }; + bool ret = FormStatusMgr::GetInstance().ExecStatusMachineTask(formId, FormFsmEvent::RENDER_FORM_DONE, task); + EXPECT_EQ(ret, false); + EXPECT_EQ(result, false); + + FormStatus::GetInstance().SetFormStatus(formId, FormFsmStatus::RENDERED); + ret = FormStatusMgr::GetInstance().ExecStatusMachineTask(formId, FormFsmEvent::RENDER_FORM, task); + EXPECT_EQ(ret, true); + EXPECT_EQ(result, true); + + GTEST_LOG_(INFO) << "FormStatusMgrTest_ExecStatusMachineTask end"; +} } // namespace \ No newline at end of file -- Gitee From 02340b76e40b112cfa8b7a797812a8a8d7cd8553 Mon Sep 17 00:00:00 2001 From: zhaolixue Date: Tue, 5 Aug 2025 20:43:34 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E6=9C=BA=E9=80=BB=E8=BE=91=EF=BC=8C=E8=A7=A3=E5=86=B3post?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=97=B6=E5=BA=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhaolixue --- services/src/status_mgr_center/form_status_mgr.cpp | 11 ++++++----- .../fms_form_status_mgr_test.cpp | 6 +++--- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/services/src/status_mgr_center/form_status_mgr.cpp b/services/src/status_mgr_center/form_status_mgr.cpp index b01d5ef0bc..1c6f38ca55 100644 --- a/services/src/status_mgr_center/form_status_mgr.cpp +++ b/services/src/status_mgr_center/form_status_mgr.cpp @@ -83,14 +83,15 @@ bool FormStatusMgr::ExecStatusMachineTask(const int64_t formId, const FormFsmEve FormStatus::GetInstance().SetFormStatus(formId, FormFsmStatus::INIT); } FormFsmStatus status = FormStatus::GetInstance().GetFormStatus(formId); - + FormStatusMachineInfo info; if (!FormStatusTable::GetInstance().GetFormStatusInfo(status, event, info)) { + HILOG_ERROR("get form status info failed, formId:%{public}" PRId64, formId); return false; } - + HILOG_INFO("state transition, formId:%{public}" PRId64 - ", status is %{public}d, event is %{public}d, nextStatus is %{public}d.", + ", status is %{public}d, event is %{public}d, nextStatus is %{public}d.", formId, static_cast(status), static_cast(event), @@ -98,10 +99,10 @@ bool FormStatusMgr::ExecStatusMachineTask(const int64_t formId, const FormFsmEve // state machine switches to the next state. FormStatus::GetInstance().SetFormStatus(formId, info.nextStatus); - + // state machine timeout process FormStatusMgr::GetInstance().ExecFormTaskTimeout(formId, info.timeoutMs, event, status); - + // state machine excute FormStatusMgr::GetInstance().ExecFormTask(info.processType, formId, event, func); return true; diff --git a/test/unittest/fms_form_status_mgr_center_test/fms_form_status_mgr_test.cpp b/test/unittest/fms_form_status_mgr_center_test/fms_form_status_mgr_test.cpp index 7b895decc1..427259c41d 100644 --- a/test/unittest/fms_form_status_mgr_center_test/fms_form_status_mgr_test.cpp +++ b/test/unittest/fms_form_status_mgr_center_test/fms_form_status_mgr_test.cpp @@ -245,9 +245,9 @@ HWTEST_F(FormStatusMgrTest, FormStatusMgrTest_ExecStatusMachineTask, TestSize.Le int64_t formId = FORM_ID; FormStatusMgr::GetInstance().DeleteFormEventId(formId); - static bool result = false; - auto task = []() { - GTEST_LOG_(INFO) << "FormStatusMgrTest_ExecStatusMachineTask Task called zlx"; + bool result = false; + auto task = [&result]() mutable { + GTEST_LOG_(INFO) << "FormStatusMgrTest_ExecStatusMachineTask Task called"; result = true; }; bool ret = FormStatusMgr::GetInstance().ExecStatusMachineTask(formId, FormFsmEvent::RENDER_FORM_DONE, task); -- Gitee