diff --git a/services/miscdevice_service/include/vibrator_thread.h b/services/miscdevice_service/include/vibrator_thread.h index a214460e096925c63886b6c67b82fab8c92c30cb..9ce50542f98f72f5044121d3abd97bff269eb77f 100644 --- 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 931263d820706140e0c5c9f48da7750508a49207..e37cc3408917b39ce755c7aa0442996a97e0cc23 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(); } } } @@ -233,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 @@ -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,12 +288,11 @@ 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()) { + if (vibratorHdiConnection_.IsVibratorRunning()) { vibratorHdiConnection_.Stop(HDF_VIBRATOR_MODE_PRESET); } #endif // OHOS_BUILD_ENABLE_VIBRATOR_CUSTOM @@ -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 0f88e1b7fa34d35edccf07f9c5846f8a4db41ba0..7fc5954d3edc3a2a7caafa6a202c8ddd1a1b9126 100644 --- 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,12 @@ 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(); + exitFlag_ = false; } } // namespace Sensors } // namespace OHOS