OSDN Git Service

Use a mutex to protect the consistency of the tBTA_PM_TIMER state
authorPavlin Radoslavov <pavlin@google.com>
Wed, 26 Jul 2017 06:55:04 +0000 (23:55 -0700)
committerPavlin Radoslavov <pavlin@google.com>
Wed, 26 Jul 2017 18:15:31 +0000 (11:15 -0700)
Bug: 63689331
Test: Code compilation
Change-Id: Id8ab78473e1f766d5a76b967024b7ff4af499667
(cherry picked from commit f470def4e91301b7b161b88b0428476ecce4f324)

bta/dm/bta_dm_pm.cc

index aad921c..89cf80d 100644 (file)
@@ -26,6 +26,8 @@
 #include <base/logging.h>
 #include <string.h>
 
+#include <mutex>
+
 #include "bt_common.h"
 #include "bta_api.h"
 #include "bta_dm_api.h"
@@ -63,6 +65,7 @@ static void bta_dm_pm_ssr(BD_ADDR peer_addr);
 #endif
 
 tBTA_DM_CONNECTED_SRVCS bta_dm_conn_srvcs;
+static std::recursive_mutex pm_timer_mutex;
 
 /*******************************************************************************
  *
@@ -267,6 +270,7 @@ static void bta_dm_pm_stop_timer_by_srvc_id(BD_ADDR peer_addr,
 static void bta_dm_pm_start_timer(tBTA_PM_TIMER* p_timer, uint8_t timer_idx,
                                   period_ms_t timeout_ms, uint8_t srvc_id,
                                   uint8_t pm_action) {
+  std::unique_lock<std::recursive_mutex> lock(pm_timer_mutex);
   p_timer->in_use = true;
 
   if (p_timer->srvc_id[timer_idx] == BTA_ID_MAX) p_timer->active++;
@@ -275,6 +279,7 @@ static void bta_dm_pm_start_timer(tBTA_PM_TIMER* p_timer, uint8_t timer_idx,
     p_timer->pm_action[timer_idx] = pm_action;
 
   p_timer->srvc_id[timer_idx] = srvc_id;
+  lock.unlock();
 
   alarm_set_on_queue(p_timer->timer[timer_idx], timeout_ms,
                      bta_dm_pm_timer_cback, p_timer->timer[timer_idx],
@@ -301,6 +306,8 @@ static void bta_dm_pm_stop_timer_by_index(tBTA_PM_TIMER* p_timer,
   CHECK(p_timer->in_use && (p_timer->active > 0));
 
   alarm_cancel(p_timer->timer[timer_idx]);
+
+  std::lock_guard<std::recursive_mutex> lock(pm_timer_mutex);
   p_timer->srvc_id[timer_idx] = BTA_ID_MAX;
   /* NOTE: pm_action[timer_idx] intentionally not reset */
 
@@ -871,6 +878,7 @@ static void bta_dm_pm_timer_cback(void* data) {
   uint8_t i, j;
   alarm_t* alarm = (alarm_t*)data;
 
+  std::unique_lock<std::recursive_mutex> lock(pm_timer_mutex);
   for (i = 0; i < BTA_DM_NUM_PM_TIMER; i++) {
     APPL_TRACE_DEBUG("dm_pm_timer[%d] in use? %d", i,
                      bta_dm_cb.pm_timer[i].in_use);
@@ -888,6 +896,7 @@ static void bta_dm_pm_timer_cback(void* data) {
       if (j < BTA_DM_PM_MODE_TIMER_MAX) break;
     }
   }
+  lock.unlock();
 
   /* no more timers */
   if (i == BTA_DM_NUM_PM_TIMER) return;