diff --git a/services/samgr/native/source/collect/device_status_collect_manager.cpp b/services/samgr/native/source/collect/device_status_collect_manager.cpp index 6803cd337de034a835a2a74de8ef897d590535b2..6ca3a0ff465e5383438b5782056d8f91410e2b33 100644 --- a/services/samgr/native/source/collect/device_status_collect_manager.cpp +++ b/services/samgr/native/source/collect/device_status_collect_manager.cpp @@ -311,7 +311,7 @@ void DeviceStatusCollectManager::PostTask(std::function callback) void DeviceStatusCollectManager::PostDelayTask(std::function callback, int32_t delayTime) { - HILOGI("DeviceStaMgr PostDelayTask begin"); + HILOGI("DeviceStaMgr PostDelayTask begin, delayTime:%{public}d", delayTime); if (delayTime < 0 || delayTime > std::numeric_limits::max() / TO_MILLISECOND) { HILOGE("DeviceStaMgr PostDelayTask Failed : delayTime out of range %{public}d", delayTime); return; diff --git a/services/samgr/native/source/collect/device_timed_collect.cpp b/services/samgr/native/source/collect/device_timed_collect.cpp index a9a34b91b2aebe4f70ce6104a0ab69b4f077263d..533167066e5e4e15eaa8fc274da641ec931137fc 100644 --- a/services/samgr/native/source/collect/device_timed_collect.cpp +++ b/services/samgr/native/source/collect/device_timed_collect.cpp @@ -100,8 +100,11 @@ void DeviceTimedCollect::ProcessPersistenceTimedTask(int64_t disTime, std::strin void DeviceTimedCollect::ProcessPersistenceLoopTask(int64_t disTime, int64_t triggerTime, std::string strInterval) { int64_t interval = atoi(strInterval.c_str()); - if (persitenceLoopTasks_.count(interval) > 0) { - return; + { + lock_guard autoLock(persitenceLoopEventSetLock_); + if (persitenceLoopTasks_.count(interval) > 0) { + return; + } } #ifdef PREFERENCES_ENABLE int64_t currentTime = TimeUtils::GetTimestamp(); @@ -114,10 +117,20 @@ void DeviceTimedCollect::ProcessPersistenceLoopTask(int64_t disTime, int64_t tri HILOGW("interval is not true"); return; } - persitenceLoopTasks_[interval] = [this, interval] () { - ReportEventByTimeInfo(interval, true); - PostPersistenceDelayTask(persitenceLoopTasks_[interval], interval, interval); + auto task = [this, interval] () { + lock_guard autoLock(persitenceLoopEventSetLock_); + if (persitenceLoopTasks_.find(interval) != persitenceLoopTasks_.end()) { + HILOGI("DeviceTimedCollect Persistence ReportEvent interval: %{public}" PRId64, interval); + ReportEventByTimeInfo(interval, true); + PostPersistenceDelayTask(persitenceLoopTasks_[interval], interval, interval); + } else { + HILOGI("DeviceTimedCollect Persistence interval %{public}" PRId64 " has been remove", interval); + } }; + { + lock_guard autoLock(persitenceLoopEventSetLock_); + persitenceLoopTasks_[interval] = task; + } if (disTime <= 0) { ReportEventByTimeInfo(interval, true); // In order to enable the timer to start on time next time and make up for the missing time @@ -194,8 +207,14 @@ void DeviceTimedCollect::PostPersistenceLoopTaskLocked(int32_t interval) return; } persitenceLoopTasks_[interval] = [this, interval] () { - ReportEventByTimeInfo(interval, true); - PostPersistenceDelayTask(persitenceLoopTasks_[interval], interval, interval); + lock_guard autoLock(persitenceLoopEventSetLock_); + if (persitenceLoopTasks_.find(interval) != persitenceLoopTasks_.end()) { + HILOGI("DeviceTimedCollect PostPersistence ReportEvent interval: %{public}d", interval); + ReportEventByTimeInfo(interval, true); + PostPersistenceDelayTask(persitenceLoopTasks_[interval], interval, interval); + } else { + HILOGI("DeviceTimedCollect PostPersistence interval %{public}d has been remove", interval); + } }; PostPersistenceDelayTask(persitenceLoopTasks_[interval], interval, interval); } diff --git a/services/samgr/native/test/unittest/src/device_timed_collect_test.cpp b/services/samgr/native/test/unittest/src/device_timed_collect_test.cpp index cd3831498602b72b12713daca6f4d461852cfd85..c68dc4749877f0468b6ba038fa61c3d7ec9c479d 100644 --- a/services/samgr/native/test/unittest/src/device_timed_collect_test.cpp +++ b/services/samgr/native/test/unittest/src/device_timed_collect_test.cpp @@ -865,6 +865,44 @@ HWTEST_F(DeviceTimedCollectTest, ProcessPersistenceLoopTask001, TestSize.Level3) DTEST_LOG << " ProcessPersistenceLoopTask001 end" << std::endl; } +HWTEST_F(DeviceTimedCollectTest, PostPersistenceLoopTaskLocked001, TestSize.Level3) +{ + DTEST_LOG << " PostPersistenceLoopTaskLocked001 begin" << std::endl; + sptr collect = new DeviceStatusCollectManager(); + collect->collectHandler_ = std::make_shared("collect"); + sptr deviceTimedCollect = new DeviceTimedCollect(collect); + EXPECT_EQ(true, deviceTimedCollect != nullptr); + deviceTimedCollect->preferencesUtil_ = PreferencesUtil::GetInstance(); + TimeInfo info; + info.awake = false; + info.normal = true; + deviceTimedCollect->timeInfos_[1] = info; + deviceTimedCollect->PostPersistenceLoopTaskLocked(1); + deviceTimedCollect->persitenceLoopTasks_.erase(1); + usleep(1500 * 1000); + EXPECT_TRUE(deviceTimedCollect->persitenceLoopTasks_.empty()); + DTEST_LOG << " PostPersistenceLoopTaskLocked001 end" << std::endl; +} + +HWTEST_F(DeviceTimedCollectTest, PostPersistenceLoopTaskLocked002, TestSize.Level3) +{ + DTEST_LOG << " PostPersistenceLoopTaskLocked002 begin" << std::endl; + sptr collect = new DeviceStatusCollectManager(); + collect->collectHandler_ = std::make_shared("collect"); + sptr deviceTimedCollect = new DeviceTimedCollect(collect); + EXPECT_EQ(true, deviceTimedCollect != nullptr); + deviceTimedCollect->preferencesUtil_ = PreferencesUtil::GetInstance(); + TimeInfo info; + info.awake = false; + info.normal = true; + deviceTimedCollect->timeInfos_[1] = info; + deviceTimedCollect->PostPersistenceLoopTaskLocked(1); + EXPECT_FALSE(deviceTimedCollect->persitenceLoopTasks_.empty()); + usleep(1100 * 1000); + deviceTimedCollect->persitenceLoopTasks_.erase(1); + DTEST_LOG << " PostPersistenceLoopTaskLocked002 end" << std::endl; +} + HWTEST_F(DeviceTimedCollectTest, PostNonPersistenceLoopTaskLocked001, TestSize.Level3) { DTEST_LOG << " PostNonPersistenceLoopTaskLocked001 begin" << std::endl;