summaryrefslogtreecommitdiff
path: root/system/bta/dm/bta_dm_act.cc
diff options
context:
space:
mode:
Diffstat (limited to 'system/bta/dm/bta_dm_act.cc')
-rw-r--r--system/bta/dm/bta_dm_act.cc82
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);
}
/*******************************************************************************