From 424ffd0da56d818510000acd56b23824c960d7d7 Mon Sep 17 00:00:00 2001 From: Lianchao Song Date: Mon, 25 Dec 2017 17:29:40 +0800 Subject: [PATCH] BT Interface: fix hci cmd timeout Add mutex in function Send() and OnTimeout() to do mutual exclusive access on lpm_wake_deasserted. If lpm_wake_deasserted is out of sync with the actual wake state, then platforms which use the lpm hint will break. Bug: 64299848 Test: run affected platform for a long period of time and find that hci commands do not time out Change-Id: I9f630d6f40f84b9c047c6488632cd44d6602bb14 --- bluetooth/1.0/default/vendor_interface.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bluetooth/1.0/default/vendor_interface.cc b/bluetooth/1.0/default/vendor_interface.cc index 6ce2f11fb4..a8f5bb403d 100644 --- a/bluetooth/1.0/default/vendor_interface.cc +++ b/bluetooth/1.0/default/vendor_interface.cc @@ -49,6 +49,7 @@ uint32_t lpm_timeout_ms; bool recent_activity_flag; VendorInterface* g_vendor_interface = nullptr; +std::mutex wakeup_mutex_; HC_BT_HDR* WrapPacketAndCopy(uint16_t event, const hidl_vec& data) { size_t packet_size = data.size() + sizeof(HC_BT_HDR); @@ -308,6 +309,7 @@ void VendorInterface::Close() { } size_t VendorInterface::Send(uint8_t type, const uint8_t* data, size_t length) { + std::unique_lock lock(wakeup_mutex_); recent_activity_flag = true; if (lpm_wake_deasserted == true) { @@ -350,6 +352,7 @@ void VendorInterface::OnFirmwareConfigured(uint8_t result) { void VendorInterface::OnTimeout() { ALOGV("%s", __func__); + std::unique_lock lock(wakeup_mutex_); if (recent_activity_flag == false) { lpm_wake_deasserted = true; bt_vendor_lpm_wake_state_t wakeState = BT_VND_LPM_WAKE_DEASSERT;