Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4709934d authored by Sungsoo Lim's avatar Sungsoo Lim Committed by Jack He
Browse files

Prevent an infinite waiting of ACL connection to drain

There is a case that BTM_GetNumAclLinks > 0, but
force_disconnect_all_acl_connections() == false. In that case,
bta_dm_wait_for_acl_to_drain_cback() is not called twice, and it
enters infinite waiting. This CL prevents the infinite waiting.

Bug: 208477587
Tag: #refactor
Test: atest CtsBluetoothTestCases bluetooth_test_gd_unit
Change-Id: Ife1891f99a085a9ddefeed63b9b807827f963ccb
parent a12d6b4f
Loading
Loading
Loading
Loading
+9 −11
Original line number Diff line number Diff line
@@ -495,21 +495,19 @@ static void bta_dm_wait_for_acl_to_drain_cback(void* data) {
  const WaitForAllAclConnectionsToDrain* pass =
      WaitForAllAclConnectionsToDrain::FromAlarmCallbackData(data);

  if (BTM_GetNumAclLinks() &&
  if (BTM_GetNumAclLinks() && force_disconnect_all_acl_connections() &&
      WaitForAllAclConnectionsToDrain::IsFirstPass(pass)) {
    /* DISABLE_EVT still need to be sent out to avoid java layer disable timeout
     */
    if (force_disconnect_all_acl_connections()) {
    LOG_DEBUG(
        "Set timer for second pass to wait for all ACL connections to "
        "close:%lu ms ",
        second_pass.TimeToWaitInMs());
      alarm_set_on_mloop(
          bta_dm_cb.disable_timer, second_pass.time_to_wait_in_ms,
          bta_dm_wait_for_acl_to_drain_cback, second_pass.AlarmCallbackData());
    }
    alarm_set_on_mloop(bta_dm_cb.disable_timer, second_pass.time_to_wait_in_ms,
                       bta_dm_wait_for_acl_to_drain_cback,
                       second_pass.AlarmCallbackData());
  } else {
    // No ACL links were up or is second pass at ACL closure
    // No ACL links to close were up or is second pass at ACL closure
    LOG_INFO("Ensuring all ACL connections have been properly flushed");
    bluetooth::shim::ACL_Shutdown();