diff options
author | Pavlin Radoslavov <pavlin@google.com> | 2017-08-05 23:47:50 -0700 |
---|---|---|
committer | Pavlin Radoslavov <pavlin@google.com> | 2017-08-06 00:03:06 -0700 |
commit | a8ba0bd7c8758cc7250a76db343558cbccd315cd (patch) | |
tree | b66848483cb2e7fa60de895ba25d8115c3463dde | |
parent | ecadb0d01d305f717e01d03391e3062fbaa2b42e (diff) | |
download | android_system_bt-a8ba0bd7c8758cc7250a76db343558cbccd315cd.tar.gz android_system_bt-a8ba0bd7c8758cc7250a76db343558cbccd315cd.tar.bz2 android_system_bt-a8ba0bd7c8758cc7250a76db343558cbccd315cd.zip |
Use a mutex to protect the scheduling of tBTA_PM_TIMER
Bug: 63689331
Test: Code compilation
Change-Id: If062f7b3e2c17cb5a1ac2c8ef0813a2fe5c5a5f5
(cherry picked from commit a34d33ff2a3fe3562c1e003d870a0716f83568bf)
-rw-r--r-- | bta/dm/bta_dm_pm.cc | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/bta/dm/bta_dm_pm.cc b/bta/dm/bta_dm_pm.cc index 89cf80dfd..472b7e1c8 100644 --- a/bta/dm/bta_dm_pm.cc +++ b/bta/dm/bta_dm_pm.cc @@ -65,7 +65,8 @@ 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; +static std::recursive_mutex pm_timer_schedule_mutex; +static std::recursive_mutex pm_timer_state_mutex; /******************************************************************************* * @@ -270,7 +271,8 @@ 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); + std::unique_lock<std::recursive_mutex> schedule_lock(pm_timer_schedule_mutex); + std::unique_lock<std::recursive_mutex> state_lock(pm_timer_state_mutex); p_timer->in_use = true; if (p_timer->srvc_id[timer_idx] == BTA_ID_MAX) p_timer->active++; @@ -279,7 +281,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(); + state_lock.unlock(); alarm_set_on_queue(p_timer->timer[timer_idx], timeout_ms, bta_dm_pm_timer_cback, p_timer->timer[timer_idx], @@ -300,19 +302,21 @@ static void bta_dm_pm_stop_timer_by_index(tBTA_PM_TIMER* p_timer, uint8_t timer_idx) { if ((p_timer == NULL) || (timer_idx >= BTA_DM_PM_MODE_TIMER_MAX)) return; + std::unique_lock<std::recursive_mutex> schedule_lock(pm_timer_schedule_mutex); + std::unique_lock<std::recursive_mutex> state_lock(pm_timer_state_mutex); if (p_timer->srvc_id[timer_idx] == BTA_ID_MAX) return; /* The timer was not scheduled */ 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 */ p_timer->active--; if (p_timer->active == 0) p_timer->in_use = false; + state_lock.unlock(); + + alarm_cancel(p_timer->timer[timer_idx]); } /******************************************************************************* @@ -878,7 +882,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); + std::unique_lock<std::recursive_mutex> state_lock(pm_timer_state_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); @@ -896,7 +900,7 @@ static void bta_dm_pm_timer_cback(void* data) { if (j < BTA_DM_PM_MODE_TIMER_MAX) break; } } - lock.unlock(); + state_lock.unlock(); /* no more timers */ if (i == BTA_DM_NUM_PM_TIMER) return; |