From fbbf33cf28de1ce6a9d8d8f556ddb0ecf2768168 Mon Sep 17 00:00:00 2001 From: lixiangpeng5 Date: Wed, 23 Aug 2023 13:51:24 +0000 Subject: [PATCH 1/3] fix vibrator thread exit Signed-off-by: lixiangpeng5 Change-Id: I962a0093d7560a08eee3138601887fe588a3867b --- .../include/vibrator_thread.h | 6 +-- .../src/miscdevice_service.cpp | 12 ++---- .../src/vibrator_thread.cpp | 37 +++++++------------ 3 files changed, 20 insertions(+), 35 deletions(-) diff --git a/services/miscdevice_service/include/vibrator_thread.h b/services/miscdevice_service/include/vibrator_thread.h index a214460..9ce5054 100755 --- a/services/miscdevice_service/include/vibrator_thread.h +++ b/services/miscdevice_service/include/vibrator_thread.h @@ -36,13 +36,11 @@ protected: virtual bool Run(); private: - void SetReadyStatus(bool status); VibrateInfo currentVibration_; - std::condition_variable cv_; std::mutex currentVibrationMutex_; - std::mutex readyMutex_; std::mutex vibrateMutex_; - bool ready_ = false; + std::condition_variable cv_; + bool exitFlag_ = false; }; #define VibratorDevice VibratorHdiConnection::GetInstance() } // namespace Sensors diff --git a/services/miscdevice_service/src/miscdevice_service.cpp b/services/miscdevice_service/src/miscdevice_service.cpp index 931263d..de39cfc 100644 --- a/services/miscdevice_service/src/miscdevice_service.cpp +++ b/services/miscdevice_service/src/miscdevice_service.cpp @@ -63,9 +63,8 @@ MiscdeviceService::MiscdeviceService() MiscdeviceService::~MiscdeviceService() { if (vibratorThread_ != nullptr) { - while (vibratorThread_->IsRunning()) { + if (vibratorThread_->IsRunning()) { vibratorThread_->NotifyExit(); - vibratorThread_->NotifyExitSync(); } } } @@ -242,10 +241,9 @@ int32_t MiscdeviceService::StopVibrator(int32_t vibratorId) return ERROR; } #endif // OHOS_BUILD_ENABLE_VIBRATOR_CUSTOM - while (vibratorThread_->IsRunning()) { + if (vibratorThread_->IsRunning()) { MISC_HILOGD("Notify the vibratorThread, vibratorId:%{public}d", vibratorId); vibratorThread_->NotifyExit(); - vibratorThread_->NotifyExitSync(); } return NO_ERROR; } @@ -290,9 +288,8 @@ void MiscdeviceService::StartVibrateThread(VibrateInfo info) if (vibratorThread_ == nullptr) { vibratorThread_ = std::make_shared(); } - while (vibratorThread_->IsRunning()) { + if (vibratorThread_->IsRunning()) { vibratorThread_->NotifyExit(); - vibratorThread_->NotifyExitSync(); } #ifdef OHOS_BUILD_ENABLE_VIBRATOR_CUSTOM while (vibratorHdiConnection_.IsVibratorRunning()) { @@ -316,10 +313,9 @@ int32_t MiscdeviceService::StopVibrator(int32_t vibratorId, const std::string &m MISC_HILOGE("Stop vibration information mismatch"); return ERROR; } - while (vibratorThread_->IsRunning()) { + if (vibratorThread_->IsRunning()) { MISC_HILOGD("Notify the vibratorThread, vibratorId:%{public}d", vibratorId); vibratorThread_->NotifyExit(); - vibratorThread_->NotifyExitSync(); } return NO_ERROR; } diff --git a/services/miscdevice_service/src/vibrator_thread.cpp b/services/miscdevice_service/src/vibrator_thread.cpp index 0f88e1b..dc4a0a8 100755 --- a/services/miscdevice_service/src/vibrator_thread.cpp +++ b/services/miscdevice_service/src/vibrator_thread.cpp @@ -28,39 +28,33 @@ bool VibratorThread::Run() VibrateInfo info = GetCurrentVibrateInfo(); std::unique_lock vibrateLck(vibrateMutex_); if (info.mode == "time") { + if (exitFlag_) { + MISC_HILOGI("Stop duration:%{public}d, package:%{public}s", info.duration, info.packageName.c_str()); + return false; + } int32_t ret = VibratorDevice.StartOnce(static_cast(info.duration)); if (ret != SUCCESS) { MISC_HILOGE("StartOnce fail, duration:%{public}d, package:%{public}s", info.duration, info.packageName.c_str()); return false; } - cv_.wait_for(vibrateLck, std::chrono::milliseconds(info.duration)); + cv_.wait_for(vibrateLck, std::chrono::milliseconds(info.duration), [this] { return exitFlag_; }); VibratorDevice.Stop(HDF_VIBRATOR_MODE_ONCE); - std::unique_lock readyLck(readyMutex_); - if (ready_) { - MISC_HILOGI("Stop duration:%{public}d, package:%{public}s", - info.duration, info.packageName.c_str()); - SetReadyStatus(false); - return false; - } } else if (info.mode == "preset") { for (int32_t i = 0; i < info.count; ++i) { std::string effect = info.effect; + if (exitFlag_) { + MISC_HILOGI("Stop effect:%{public}s, package:%{public}s", effect.c_str(), info.packageName.c_str()); + return false; + } int32_t ret = VibratorDevice.Start(effect); if (ret != SUCCESS) { MISC_HILOGE("Vibrate effect %{public}s failed, package:%{public}s", effect.c_str(), info.packageName.c_str()); return false; } - cv_.wait_for(vibrateLck, std::chrono::milliseconds(info.duration)); + cv_.wait_for(vibrateLck, std::chrono::milliseconds(info.duration), [this] { return exitFlag_; }); VibratorDevice.Stop(HDF_VIBRATOR_MODE_PRESET); - std::unique_lock readyLck(readyMutex_); - if (ready_) { - MISC_HILOGI("Stop effect %{public}s, package:%{public}s", - effect.c_str(), info.packageName.c_str()); - SetReadyStatus(false); - return false; - } } } return false; @@ -78,16 +72,13 @@ VibrateInfo VibratorThread::GetCurrentVibrateInfo() return currentVibration_; } -void VibratorThread::SetReadyStatus(bool status) -{ - ready_ = status; -} - void VibratorThread::NotifyExit() { - std::unique_lock readyLck(readyMutex_); - SetReadyStatus(true); + exitFlag_ = true; cv_.notify_one(); + ThreadStatus status = NotifyExitSync(); + MISC_HILOGI("lxp--status: %{public}d", status); + exitFlag_ = false; } } // namespace Sensors } // namespace OHOS -- Gitee From 4caf4644341a8b5962b558f6b9f63c87d8969351 Mon Sep 17 00:00:00 2001 From: lixiangpeng5 Date: Mon, 16 Oct 2023 12:32:16 +0000 Subject: [PATCH 2/3] fix by review Signed-off-by: lixiangpeng5 Change-Id: Ibb4d946e97e342a9cb6e83aac17a42a9f5537ecd --- services/miscdevice_service/src/vibrator_thread.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/services/miscdevice_service/src/vibrator_thread.cpp b/services/miscdevice_service/src/vibrator_thread.cpp index dc4a0a8..7fc5954 100644 --- a/services/miscdevice_service/src/vibrator_thread.cpp +++ b/services/miscdevice_service/src/vibrator_thread.cpp @@ -77,7 +77,6 @@ void VibratorThread::NotifyExit() exitFlag_ = true; cv_.notify_one(); ThreadStatus status = NotifyExitSync(); - MISC_HILOGI("lxp--status: %{public}d", status); exitFlag_ = false; } } // namespace Sensors -- Gitee From 27e9422d8d7b3c4b0b0e4c7411bfd4c37d6bfa02 Mon Sep 17 00:00:00 2001 From: lixiangpeng5 Date: Mon, 16 Oct 2023 13:22:02 +0000 Subject: [PATCH 3/3] supplement commit Signed-off-by: lixiangpeng5 Change-Id: I3c08673cbb079247404056f689daa28f59c97c16 --- services/miscdevice_service/src/miscdevice_service.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/miscdevice_service/src/miscdevice_service.cpp b/services/miscdevice_service/src/miscdevice_service.cpp index de39cfc..e37cc34 100644 --- a/services/miscdevice_service/src/miscdevice_service.cpp +++ b/services/miscdevice_service/src/miscdevice_service.cpp @@ -232,7 +232,7 @@ int32_t MiscdeviceService::StopVibrator(int32_t vibratorId) MISC_HILOGE("No vibration, no need to stop"); return ERROR; } - while (vibratorHdiConnection_.IsVibratorRunning()) { + if (vibratorHdiConnection_.IsVibratorRunning()) { vibratorHdiConnection_.Stop(HDF_VIBRATOR_MODE_PRESET); } #else @@ -292,7 +292,7 @@ void MiscdeviceService::StartVibrateThread(VibrateInfo info) vibratorThread_->NotifyExit(); } #ifdef OHOS_BUILD_ENABLE_VIBRATOR_CUSTOM - while (vibratorHdiConnection_.IsVibratorRunning()) { + if (vibratorHdiConnection_.IsVibratorRunning()) { vibratorHdiConnection_.Stop(HDF_VIBRATOR_MODE_PRESET); } #endif // OHOS_BUILD_ENABLE_VIBRATOR_CUSTOM -- Gitee