From 5af58cedffe1341ca97208d59c7625996d8bf1af Mon Sep 17 00:00:00 2001 From: li-tiangang4 Date: Wed, 21 Feb 2024 10:48:01 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=BC=82=E6=AD=A5=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=BC=95=E8=B5=B7=E5=81=B6=E7=8E=B0crash?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: li-tiangang4 --- .../src/distributed_input_source_manager.cpp | 46 +++++++++++++------ .../distributed_input_sourcemanager_test.cpp | 32 +++++++++++++ 2 files changed, 64 insertions(+), 14 deletions(-) diff --git a/services/source/sourcemanager/src/distributed_input_source_manager.cpp b/services/source/sourcemanager/src/distributed_input_source_manager.cpp index 610c426..a8d396b 100644 --- a/services/source/sourcemanager/src/distributed_input_source_manager.cpp +++ b/services/source/sourcemanager/src/distributed_input_source_manager.cpp @@ -1201,15 +1201,22 @@ void DistributedInputSourceManager::RunRelayPrepareCallback(const std::string &s { FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_PREPARE_START, DINPUT_PREPARE_TASK); std::lock_guard lock(prepareMutex_); + bool isCbRun = false; + sptr cb = nullptr; for (auto iter = relayPreCallbacks_.begin(); iter != relayPreCallbacks_.end(); ++iter) { if (iter->srcId == srcId && iter->sinkId == sinkId) { DHLOGI("ProcessEvent DINPUT_SOURCE_MANAGER_RELAY_PREPARE_RESULT_MMI"); - iter->preCallback->OnResult(sinkId, status); + cb = iter->preCallback; relayPreCallbacks_.erase(iter); - return; + isCbRun = true; + break; } } - DHLOGE("ProcessEvent DINPUT_SOURCE_MANAGER_RELAY_PREPARE_RESULT_MMI relayPreCallbacks_ is null."); + if (isCbRun && cb != nullptr) { + cb->OnResult(sinkId, status); + } else { + DHLOGE("ProcessEvent DINPUT_SOURCE_MANAGER_RELAY_PREPARE_RESULT_MMI relayPreCallbacks_ is null."); + } } void DistributedInputSourceManager::RunRelayUnprepareCallback(const std::string &srcId, const std::string &sinkId, @@ -1217,15 +1224,22 @@ void DistributedInputSourceManager::RunRelayUnprepareCallback(const std::string { FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_UNPREPARE_START, DINPUT_UNPREPARE_TASK); std::lock_guard lock(prepareMutex_); + bool isCbRun = false; + sptr cb = nullptr; for (auto iter = relayUnpreCallbacks_.begin(); iter != relayUnpreCallbacks_.end(); ++iter) { if (iter->srcId == srcId && iter->sinkId == sinkId) { DHLOGI("ProcessEvent DINPUT_SOURCE_MANAGER_RELAY_UNPREPARE_RESULT_MMI"); - iter->unpreCallback->OnResult(sinkId, status); + cb = iter->unpreCallback; relayUnpreCallbacks_.erase(iter); - return; + isCbRun = true; + break; } } - DHLOGE("ProcessEvent DINPUT_SOURCE_MANAGER_RELAY_UNPREPARE_RESULT_MMI relayUnpreCallbacks_ is null."); + if (isCbRun && cb != nullptr) { + cb->OnResult(sinkId, status); + } else { + DHLOGE("ProcessEvent DINPUT_SOURCE_MANAGER_RELAY_UNPREPARE_RESULT_MMI relayUnpreCallbacks_ is null."); + } } void DistributedInputSourceManager::RunUnprepareCallback(const std::string &devId, const int32_t &status) @@ -1330,18 +1344,20 @@ void DistributedInputSourceManager::RunRelayStartDhidCallback(const std::string DHLOGI("ProcessEvent DINPUT_SOURCE_MANAGER_RELAY_STARTDHID_RESULT_MMI dhIds:%s, vec-size:%d", dhids.c_str(), dhidsVec.size()); bool isCbRun = false; - for (std::vector::iterator iter = relayStaDhidCallbacks_.begin(); - iter != relayStaDhidCallbacks_.end(); ++iter) { + sptr cb = nullptr; + for (auto iter = relayStaDhidCallbacks_.begin(); iter != relayStaDhidCallbacks_.end(); ++iter) { if (iter->srcId != srcId || iter->sinkId != sinkId || !IsStringDataSame(iter->dhIds, dhidsVec)) { continue; } DHLOGI("ProcessEvent DINPUT_SOURCE_MANAGER_RELAY_STARTDHID_RESULT_MMI call OnResultDhids"); - iter->callback->OnResultDhids(sinkId, status); + cb = iter->callback; relayStaDhidCallbacks_.erase(iter); isCbRun = true; break; } - if (!isCbRun) { + if (isCbRun && cb != nullptr) { + cb->OnResultDhids(sinkId, status); + } else { DHLOGE("ProcessEvent DINPUT_SOURCE_MANAGER_RELAY_STARTDHID_RESULT_MMI relayStaDhidCallbacks_ is null."); } } @@ -1352,18 +1368,20 @@ void DistributedInputSourceManager::RunRelayStopDhidCallback(const std::string & std::vector dhidsVec; SplitStringToVector(dhids, INPUT_STRING_SPLIT_POINT, dhidsVec); bool isCbRun = false; - for (std::vector::iterator iter = relayStpDhidCallbacks_.begin(); - iter != relayStpDhidCallbacks_.end(); ++iter) { + sptr cb = nullptr; + for (auto iter = relayStpDhidCallbacks_.begin(); iter != relayStpDhidCallbacks_.end(); ++iter) { if (iter->srcId != srcId || iter->sinkId != sinkId || !IsStringDataSame(iter->dhIds, dhidsVec)) { continue; } DHLOGI("ProcessEvent DINPUT_SOURCE_MANAGER_RELAY_STOPDHID_RESULT_MMI call OnResultDhids"); - iter->callback->OnResultDhids(sinkId, status); + cb = iter->callback; relayStpDhidCallbacks_.erase(iter); isCbRun = true; break; } - if (!isCbRun) { + if (isCbRun && cb != nullptr) { + cb->OnResultDhids(sinkId, status); + } else { DHLOGE("ProcessEvent DINPUT_SOURCE_MANAGER_RELAY_STOPDHID_RESULT_MMI relayStpDhidCallbacks_ is null."); } } diff --git a/services/source/sourcemanager/test/sourcemanagerunittest/distributed_input_sourcemanager_test.cpp b/services/source/sourcemanager/test/sourcemanagerunittest/distributed_input_sourcemanager_test.cpp index b6d6911..390e3fe 100644 --- a/services/source/sourcemanager/test/sourcemanagerunittest/distributed_input_sourcemanager_test.cpp +++ b/services/source/sourcemanager/test/sourcemanagerunittest/distributed_input_sourcemanager_test.cpp @@ -1479,6 +1479,22 @@ HWTEST_F(DistributedInputSourceManagerTest, RunRelayStartDhidCallback_01, testin EXPECT_EQ(1, sourceManager_->relayStaDhidCallbacks_.size()); } +HWTEST_F(DistributedInputSourceManagerTest, RunRelayStartDhidCallback_02, testing::ext::TestSize.Level1) +{ + std::string srcId = "networkidc08647073e02e7a78f09473aa122ff57fc81c00"; + std::string sinkId = "umkyu1b165e1be98151891erbe8r91ev"; + int32_t status = 0; + std::string dhId = "input_slkdiek3kddkeojfe"; + std::vector dhIds; + dhIds.push_back(dhId); + sourceManager_->relayStaDhidCallbacks_.clear(); + sptr cb = nullptr; + DistributedInputSourceManager::DInputClientStartDhidInfo startDhIdInfo {srcId, sinkId, dhIds, cb}; + sourceManager_->relayStaDhidCallbacks_.push_back(startDhIdInfo); + sourceManager_->RunRelayStartDhidCallback(srcId, sinkId, status, dhId); + EXPECT_EQ(0, sourceManager_->relayStaDhidCallbacks_.size()); +} + HWTEST_F(DistributedInputSourceManagerTest, RunRelayStopDhidCallback_01, testing::ext::TestSize.Level1) { std::string srcId = "networkidc08647073e02e7a78f09473aa122ff57fc81c00"; @@ -1509,6 +1525,22 @@ HWTEST_F(DistributedInputSourceManagerTest, RunRelayStopDhidCallback_01, testing EXPECT_EQ(1, sourceManager_->relayStpDhidCallbacks_.size()); } +HWTEST_F(DistributedInputSourceManagerTest, RunRelayStopDhidCallback_02, testing::ext::TestSize.Level1) +{ + std::string srcId = "networkidc08647073e02e7a78f09473aa122ff57fc81c00"; + std::string sinkId = "umkyu1b165e1be98151891erbe8r91ev"; + int32_t status = 0; + std::string dhId = "input_slkdiek3kddkeojfe"; + std::vector dhIds; + dhIds.push_back(dhId); + sourceManager_->relayStpDhidCallbacks_.clear(); + sptr cb = nullptr; + DistributedInputSourceManager::DInputClientStopDhidInfo stopDhIdInfo {srcId, sinkId, dhIds, cb}; + sourceManager_->relayStpDhidCallbacks_.push_back(stopDhIdInfo); + sourceManager_->RunRelayStopDhidCallback(srcId, sinkId, status, dhId); + EXPECT_EQ(0, sourceManager_->relayStpDhidCallbacks_.size()); +} + HWTEST_F(DistributedInputSourceManagerTest, RunRelayStartTypeCallback_01, testing::ext::TestSize.Level1) { std::string srcId = "networkidc08647073e02e7a78f09473aa122ff57fc81c00"; -- Gitee