diff options
Diffstat (limited to 'system/bta/dm/bta_dm_act.cc')
-rw-r--r-- | system/bta/dm/bta_dm_act.cc | 82 |
1 files changed, 59 insertions, 23 deletions
diff --git a/system/bta/dm/bta_dm_act.cc b/system/bta/dm/bta_dm_act.cc index cc6b7930bf..52bb6448f0 100644 --- a/system/bta/dm/bta_dm_act.cc +++ b/system/bta/dm/bta_dm_act.cc @@ -44,6 +44,7 @@ #include "main/shim/shim.h" #include "osi/include/allocator.h" #include "osi/include/compat.h" +#include "osi/include/fixed_queue.h" #include "osi/include/log.h" #include "osi/include/osi.h" #include "stack/btm/btm_ble_int.h" @@ -320,6 +321,8 @@ void BTA_dm_on_hw_off() { /* hw is ready, go on with BTA DM initialization */ alarm_free(bta_dm_search_cb.search_timer); alarm_free(bta_dm_search_cb.gatt_close_timer); + osi_free(bta_dm_search_cb.p_pending_search); + fixed_queue_free(bta_dm_search_cb.pending_discovery_queue, osi_free); memset(&bta_dm_search_cb, 0, sizeof(bta_dm_search_cb)); } @@ -339,6 +342,8 @@ void BTA_dm_on_hw_on() { /* hw is ready, go on with BTA DM initialization */ alarm_free(bta_dm_search_cb.search_timer); alarm_free(bta_dm_search_cb.gatt_close_timer); + osi_free(bta_dm_search_cb.p_pending_search); + fixed_queue_free(bta_dm_search_cb.pending_discovery_queue, osi_free); memset(&bta_dm_search_cb, 0, sizeof(bta_dm_search_cb)); /* * TODO: Should alarm_free() the bta_dm_search_cb timers during @@ -347,6 +352,7 @@ void BTA_dm_on_hw_on() { bta_dm_search_cb.search_timer = alarm_new("bta_dm_search.search_timer"); bta_dm_search_cb.gatt_close_timer = alarm_new("bta_dm_search.gatt_close_timer"); + bta_dm_search_cb.pending_discovery_queue = fixed_queue_new(SIZE_MAX); memset(&bta_dm_conn_srvcs, 0, sizeof(bta_dm_conn_srvcs)); memset(&bta_dm_di_cb, 0, sizeof(tBTA_DM_DI_CB)); @@ -990,7 +996,7 @@ static bool bta_dm_read_remote_device_name(const RawAddress& bd_addr, void bta_dm_inq_cmpl(uint8_t num) { if (bta_dm_search_get_state() == BTA_DM_SEARCH_CANCELLING) { bta_dm_search_set_state(BTA_DM_SEARCH_IDLE); - bta_dm_search_cancel_cmpl(); + bta_dm_execute_queued_request(); return; } @@ -1289,6 +1295,7 @@ void bta_dm_search_cmpl() { /* no BLE connection, i.e. Classic service discovery end */ if (conn_id == GATT_INVALID_CONN_ID) { bta_dm_search_cb.p_search_cback(BTA_DM_DISC_CMPL_EVT, nullptr); + bta_dm_execute_queued_request(); return; } @@ -1299,6 +1306,7 @@ void bta_dm_search_cmpl() { if (count == 0) { LOG_INFO("Empty GATT database - no BLE services discovered"); bta_dm_search_cb.p_search_cback(BTA_DM_DISC_CMPL_EVT, nullptr); + bta_dm_execute_queued_request(); return; } @@ -1323,6 +1331,8 @@ void bta_dm_search_cmpl() { bta_dm_search_cb.p_search_cback(BTA_DM_DISC_BLE_RES_EVT, &result); bta_dm_search_cb.p_search_cback(BTA_DM_DISC_CMPL_EVT, nullptr); + + bta_dm_execute_queued_request(); } /******************************************************************************* @@ -1419,13 +1429,13 @@ void bta_dm_free_sdp_db() { * * Function bta_dm_queue_search * - * Description Queues search command while search is being cancelled + * Description Queues search command * * Returns void * ******************************************************************************/ void bta_dm_queue_search(tBTA_DM_MSG* p_data) { - bta_dm_search_clear_queue(); + osi_free_and_reset((void**)&bta_dm_search_cb.p_pending_search); bta_dm_search_cb.p_pending_search = (tBTA_DM_MSG*)osi_malloc(sizeof(tBTA_DM_API_SEARCH)); memcpy(bta_dm_search_cb.p_pending_search, p_data, sizeof(tBTA_DM_API_SEARCH)); @@ -1435,50 +1445,76 @@ void bta_dm_queue_search(tBTA_DM_MSG* p_data) { * * Function bta_dm_queue_disc * - * Description Queues discovery command while search is being cancelled + * Description Queues discovery command * * Returns void * ******************************************************************************/ void bta_dm_queue_disc(tBTA_DM_MSG* p_data) { - bta_dm_search_clear_queue(); - bta_dm_search_cb.p_pending_discovery = + tBTA_DM_MSG* p_pending_discovery = (tBTA_DM_MSG*)osi_malloc(sizeof(tBTA_DM_API_DISCOVER)); - memcpy(bta_dm_search_cb.p_pending_discovery, p_data, - sizeof(tBTA_DM_API_DISCOVER)); + memcpy(p_pending_discovery, p_data, sizeof(tBTA_DM_API_DISCOVER)); + fixed_queue_enqueue(bta_dm_search_cb.pending_discovery_queue, + p_pending_discovery); } /******************************************************************************* * - * Function bta_dm_search_clear_queue + * Function bta_dm_execute_queued_request * - * Description Clears the queue if API search cancel is called + * Description Executes queued request if one exists * * Returns void * ******************************************************************************/ -void bta_dm_search_clear_queue() { - osi_free_and_reset((void**)&bta_dm_search_cb.p_pending_search); - osi_free_and_reset((void**)&bta_dm_search_cb.p_pending_discovery); +void bta_dm_execute_queued_request() { + if (bta_dm_search_cb.p_pending_search) { + // Updated queued event to search event to trigger start search + if (bta_dm_search_cb.p_pending_search->hdr.event == + BTA_DM_API_QUEUE_SEARCH_EVT) { + bta_dm_search_cb.p_pending_search->hdr.event = BTA_DM_API_SEARCH_EVT; + } + LOG_INFO("%s Start pending search", __func__); + bta_sys_sendmsg(bta_dm_search_cb.p_pending_search); + bta_dm_search_cb.p_pending_search = NULL; + } else { + tBTA_DM_MSG* p_pending_discovery = (tBTA_DM_MSG*)fixed_queue_try_dequeue( + bta_dm_search_cb.pending_discovery_queue); + if (p_pending_discovery) { + if (p_pending_discovery->hdr.event == BTA_DM_API_QUEUE_DISCOVER_EVT) { + p_pending_discovery->hdr.event = BTA_DM_API_DISCOVER_EVT; + } + LOG_INFO("%s Start pending discovery", __func__); + bta_sys_sendmsg(p_pending_discovery); + } + } +} + +/******************************************************************************* + * + * Function bta_dm_is_search_request_queued + * + * Description Checks if there is a queued search request + * + * Returns bool + * + ******************************************************************************/ +bool bta_dm_is_search_request_queued() { + return bta_dm_search_cb.p_pending_search != NULL; } /******************************************************************************* * - * Function bta_dm_search_cancel_cmpl + * Function bta_dm_search_clear_queue * - * Description Search cancel is complete + * Description Clears the queue if API search cancel is called * * Returns void * ******************************************************************************/ -void bta_dm_search_cancel_cmpl() { - if (bta_dm_search_cb.p_pending_search) { - bta_sys_sendmsg(bta_dm_search_cb.p_pending_search); - bta_dm_search_cb.p_pending_search = NULL; - } else if (bta_dm_search_cb.p_pending_discovery) { - bta_sys_sendmsg(bta_dm_search_cb.p_pending_discovery); - bta_dm_search_cb.p_pending_discovery = NULL; - } +void bta_dm_search_clear_queue() { + osi_free_and_reset((void**)&bta_dm_search_cb.p_pending_search); + fixed_queue_flush(bta_dm_search_cb.pending_discovery_queue, osi_free); } /******************************************************************************* |