From 8beec828f7ff8d6fdc517fbf0489794162d547f9 Mon Sep 17 00:00:00 2001 From: roynatech2544 Date: Sat, 22 Oct 2022 11:56:30 +0900 Subject: [PATCH] universal7885: fm-aidl: Fix deadlock on get mutex locked - We started the function ensuring mutex is locked, and in the middle trying to lock again for return. This will cause deadlock or returning false forever. Therefore, put an if condition before locking at start of the function --- .../apps/aidl-support/fm/default/FMDevControl.cpp | 8 ++++++-- .../apps/aidl-support/fm/default/FMSupport.cpp | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/universal7885-common/apps/aidl-support/fm/default/FMDevControl.cpp b/universal7885-common/apps/aidl-support/fm/default/FMDevControl.cpp index c3c3dfb..24157ad 100644 --- a/universal7885-common/apps/aidl-support/fm/default/FMDevControl.cpp +++ b/universal7885-common/apps/aidl-support/fm/default/FMDevControl.cpp @@ -37,7 +37,9 @@ namespace aidl::vendor::eureka::hardware::fmradio { } ::ndk::ScopedAStatus FMDevControl::getValue(GetType type, int *_aidl_return) { - RETURN_IF_FAILED_LOCK; + if (type != GetType::GET_TYPE_FM_MUTEX_LOCKED) { + RETURN_IF_FAILED_LOCK; + } assert(fd > 0); switch (type) { case GetType::GET_TYPE_FM_FREQ: @@ -85,7 +87,9 @@ namespace aidl::vendor::eureka::hardware::fmradio { default: break; }; - lock.unlock(); + if (type != GetType::GET_TYPE_FM_MUTEX_LOCKED) { + lock.unlock(); + } return ::ndk::ScopedAStatus::ok(); } diff --git a/universal7885-common/apps/aidl-support/fm/default/FMSupport.cpp b/universal7885-common/apps/aidl-support/fm/default/FMSupport.cpp index bbb541b..df1f715 100644 --- a/universal7885-common/apps/aidl-support/fm/default/FMSupport.cpp +++ b/universal7885-common/apps/aidl-support/fm/default/FMSupport.cpp @@ -33,7 +33,9 @@ constexpr const char *FM_FREQ_SEEK = FM_SYSFS_BASE "/radio_freq_seek"; ::ndk::ScopedAStatus FMSupport::open(void) { NOT_SUPPORTED; } ::ndk::ScopedAStatus FMSupport::getValue(GetType type, int *_aidl_return) { - RETURN_IF_FAILED_LOCK; + if (type != GetType::GET_TYPE_FM_MUTEX_LOCKED) { + RETURN_IF_FAILED_LOCK; + } switch (type) { case GetType::GET_TYPE_FM_FREQ: *_aidl_return = FileIO::readline(FM_FREQ_CTL); @@ -76,7 +78,9 @@ constexpr const char *FM_FREQ_SEEK = FM_SYSFS_BASE "/radio_freq_seek"; default: break; }; - lock.unlock(); + if (type != GetType::GET_TYPE_FM_MUTEX_LOCKED) { + lock.unlock(); + } return ndk::ScopedAStatus::ok(); } ::ndk::ScopedAStatus FMSupport::setValue(SetType type, int value) {