From: Chris Manton Date: Thu, 18 Sep 2014 23:19:26 +0000 (-0700) Subject: Replace BUFFER_Q with list_t X-Git-Tag: android-x86-7.1-r1~1277^2~100 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=9de511d7b2bff064949799081f447342db036d2e;p=android-x86%2Fsystem-bt.git Replace BUFFER_Q with list_t soc_queue --- diff --git a/btif/src/btif_hl.c b/btif/src/btif_hl.c index c3ffc16de..210734cc3 100644 --- a/btif/src/btif_hl.c +++ b/btif/src/btif_hl.c @@ -26,15 +26,25 @@ ***********************************************************************************/ #define LOG_TAG "BTIF_HL" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include -#include #include -#include +#include +#include #include +#include #include #include -#include #include #include #include @@ -53,10 +63,14 @@ #include "gki.h" #include "bta_api.h" #include "bta_hl_api.h" -#include "mca_api.h" +#include "btif_common.h" #include "btif_hl.h" #include "btif_storage.h" +#include "btif_util.h" #include "btu.h" +#include "gki.h" +#include "list.h" +#include "mca_api.h" #define MAX_DATATYPE_SUPPORTED 8 @@ -90,7 +104,7 @@ static int listen_s = -1; static int connected_s = -1; static int select_thread_id = -1; static int signal_fds[2] = { -1, -1 }; -static BUFFER_Q soc_queue; +static list_t *soc_queue; static int reg_counter; static inline int btif_hl_select_wakeup(void); @@ -4495,29 +4509,16 @@ const bthl_interface_t *btif_hl_get_interface(){ ** Returns int ** *******************************************************************************/ -int btif_hl_update_maxfd( int max_org_s){ - btif_hl_soc_cb_t *p_scb = NULL; - int maxfd=0; +int btif_hl_update_maxfd(int max_org_s) { + int maxfd = max_org_s; BTIF_TRACE_DEBUG("btif_hl_update_maxfd max_org_s= %d", max_org_s); - - maxfd = max_org_s; - if (!GKI_queue_is_empty(&soc_queue)) - { - p_scb = (btif_hl_soc_cb_t *)GKI_getfirst((void *)&soc_queue); - if (maxfd < p_scb->max_s) - { + for (const list_node_t *node = list_begin(soc_queue); + node != list_end(soc_queue); node = list_next(node)) { + btif_hl_soc_cb_t *p_scb = list_node(node); + if (maxfd < p_scb->max_s) { maxfd = p_scb->max_s; - BTIF_TRACE_DEBUG("btif_hl_update_maxfd 1 maxfd=%d", maxfd); - } - while (p_scb != NULL) - { - if (maxfd < p_scb->max_s) - { - maxfd = p_scb->max_s; - BTIF_TRACE_DEBUG("btif_hl_update_maxfd 2 maxfd=%d", maxfd); - } - p_scb = (btif_hl_soc_cb_t *)GKI_getnext((void *)p_scb ); + BTIF_TRACE_DEBUG("btif_hl_update_maxfd maxfd=%d", maxfd); } } @@ -4635,7 +4636,7 @@ BOOLEAN btif_hl_create_socket(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx){ memcpy(p_scb->bd_addr, p_mcb->bd_addr,sizeof(BD_ADDR)); btif_hl_set_socket_state(p_scb, BTIF_HL_SOC_STATE_W4_ADD); p_scb->max_s = p_scb->socket_id[1]; - GKI_enqueue(&soc_queue, (void *) p_scb); + list_append(soc_queue, (void *)p_scb); btif_hl_select_wakeup(); status = TRUE; } @@ -4658,8 +4659,7 @@ BOOLEAN btif_hl_create_socket(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx){ ** Returns void ** *******************************************************************************/ -void btif_hl_add_socket_to_set( fd_set *p_org_set){ - btif_hl_soc_cb_t *p_scb = NULL; +void btif_hl_add_socket_to_set(fd_set *p_org_set) { btif_hl_mdl_cb_t *p_dcb = NULL; btif_hl_mcl_cb_t *p_mcb = NULL; btif_hl_app_cb_t *p_acb = NULL; @@ -4669,42 +4669,37 @@ void btif_hl_add_socket_to_set( fd_set *p_org_set){ BTIF_TRACE_DEBUG("entering %s",__FUNCTION__); - if (!GKI_queue_is_empty(&soc_queue)) - { - p_scb = (btif_hl_soc_cb_t *)GKI_getfirst((void *)&soc_queue); + for (const list_node_t *node = list_begin(soc_queue); + node != list_end(soc_queue); node = list_next(node)) { + btif_hl_soc_cb_t *p_scb = list_node(node); + BTIF_TRACE_DEBUG("btif_hl_add_socket_to_set first p_scb=0x%x", p_scb); - while (p_scb != NULL) - { - if (btif_hl_get_socket_state(p_scb) == BTIF_HL_SOC_STATE_W4_ADD) - { - btif_hl_set_socket_state(p_scb, BTIF_HL_SOC_STATE_W4_READ); - FD_SET(p_scb->socket_id[1], p_org_set); - BTIF_TRACE_DEBUG("found and set socket_id=%d is_set=%d", p_scb->socket_id[1], FD_ISSET(p_scb->socket_id[1], p_org_set)); - p_mcb = BTIF_HL_GET_MCL_CB_PTR(p_scb->app_idx, p_scb->mcl_idx); - p_dcb = BTIF_HL_GET_MDL_CB_PTR(p_scb->app_idx, p_scb->mcl_idx, p_scb->mdl_idx); - p_acb = BTIF_HL_GET_APP_CB_PTR(p_scb->app_idx); - if (p_mcb && p_dcb) - { - btif_hl_stop_timer_using_handle(p_mcb->mcl_handle); - evt_param.chan_cb.app_id = p_acb->app_id; - memcpy(evt_param.chan_cb.bd_addr, p_mcb->bd_addr, sizeof(BD_ADDR)); - evt_param.chan_cb.channel_id = p_dcb->channel_id; - evt_param.chan_cb.fd = p_scb->socket_id[0]; - evt_param.chan_cb.mdep_cfg_index = (int ) p_dcb->local_mdep_cfg_idx; - evt_param.chan_cb.cb_state = BTIF_HL_CHAN_CB_STATE_CONNECTED_PENDING; - len = sizeof(btif_hl_send_chan_state_cb_t); - status = btif_transfer_context (btif_hl_proc_cb_evt, BTIF_HL_SEND_CONNECTED_CB, - (char*) &evt_param, len, NULL); - ASSERTC(status == BT_STATUS_SUCCESS, "context transfer failed", status); - } + if (btif_hl_get_socket_state(p_scb) == BTIF_HL_SOC_STATE_W4_ADD) { + btif_hl_set_socket_state(p_scb, BTIF_HL_SOC_STATE_W4_READ); + FD_SET(p_scb->socket_id[1], p_org_set); + BTIF_TRACE_DEBUG("found and set socket_id=%d is_set=%d", + p_scb->socket_id[1], FD_ISSET(p_scb->socket_id[1], p_org_set)); + p_mcb = BTIF_HL_GET_MCL_CB_PTR(p_scb->app_idx, p_scb->mcl_idx); + p_dcb = BTIF_HL_GET_MDL_CB_PTR(p_scb->app_idx, p_scb->mcl_idx, p_scb->mdl_idx); + p_acb = BTIF_HL_GET_APP_CB_PTR(p_scb->app_idx); + if (p_mcb && p_dcb) { + btif_hl_stop_timer_using_handle(p_mcb->mcl_handle); + evt_param.chan_cb.app_id = p_acb->app_id; + memcpy(evt_param.chan_cb.bd_addr, p_mcb->bd_addr, sizeof(BD_ADDR)); + evt_param.chan_cb.channel_id = p_dcb->channel_id; + evt_param.chan_cb.fd = p_scb->socket_id[0]; + evt_param.chan_cb.mdep_cfg_index = (int ) p_dcb->local_mdep_cfg_idx; + evt_param.chan_cb.cb_state = BTIF_HL_CHAN_CB_STATE_CONNECTED_PENDING; + len = sizeof(btif_hl_send_chan_state_cb_t); + status = btif_transfer_context (btif_hl_proc_cb_evt, BTIF_HL_SEND_CONNECTED_CB, + (char*) &evt_param, len, NULL); + ASSERTC(status == BT_STATUS_SUCCESS, "context transfer failed", status); } - p_scb = (btif_hl_soc_cb_t *)GKI_getnext((void *)p_scb ); - BTIF_TRACE_DEBUG("next p_scb=0x%x", p_scb); } } - BTIF_TRACE_DEBUG("leaving %s",__FUNCTION__); } + /******************************************************************************* ** ** Function btif_hl_close_socket @@ -4715,77 +4710,55 @@ void btif_hl_add_socket_to_set( fd_set *p_org_set){ ** *******************************************************************************/ void btif_hl_close_socket( fd_set *p_org_set){ - btif_hl_soc_cb_t *p_scb = NULL; - BOOLEAN element_removed = FALSE; - btif_hl_mdl_cb_t *p_dcb = NULL ; - btif_hl_app_cb_t *p_acb = NULL ; - btif_hl_evt_cb_t evt_param; - int len; - int app_idx; - bt_status_t status; - BTIF_TRACE_DEBUG("entering %s",__FUNCTION__); - if (!GKI_queue_is_empty(&soc_queue)) - { - p_scb = (btif_hl_soc_cb_t *)GKI_getfirst((void *)&soc_queue); - while (p_scb != NULL) - { - if (btif_hl_get_socket_state(p_scb) == BTIF_HL_SOC_STATE_W4_REL) - { - BTIF_TRACE_DEBUG("app_idx=%d mcl_id=%d, mdl_idx=%d", - p_scb->app_idx, p_scb->mcl_idx, p_scb->mdl_idx); - btif_hl_set_socket_state(p_scb, BTIF_HL_SOC_STATE_IDLE); - if (p_scb->socket_id[1] != -1) - { - FD_CLR(p_scb->socket_id[1] , p_org_set); - shutdown(p_scb->socket_id[1], SHUT_RDWR); - close(p_scb->socket_id[1]); - - evt_param.chan_cb.app_id = (int) btif_hl_get_app_id(p_scb->channel_id); - memcpy(evt_param.chan_cb.bd_addr, p_scb->bd_addr, sizeof(BD_ADDR)); - evt_param.chan_cb.channel_id = p_scb->channel_id; - evt_param.chan_cb.fd = p_scb->socket_id[0]; - evt_param.chan_cb.mdep_cfg_index = (int ) p_scb->mdep_cfg_idx; - evt_param.chan_cb.cb_state = BTIF_HL_CHAN_CB_STATE_DISCONNECTED_PENDING; - len = sizeof(btif_hl_send_chan_state_cb_t); - status = btif_transfer_context (btif_hl_proc_cb_evt, BTIF_HL_SEND_DISCONNECTED_CB, - (char*) &evt_param, len, NULL); - ASSERTC(status == BT_STATUS_SUCCESS, "context transfer failed", status); - - - } + for (const list_node_t *node = list_begin(soc_queue); + node != list_end(soc_queue); node = list_next(node)) { + btif_hl_soc_cb_t *p_scb = list_node(node); + if (btif_hl_get_socket_state(p_scb) == BTIF_HL_SOC_STATE_W4_REL) { + BTIF_TRACE_DEBUG("app_idx=%d mcl_id=%d, mdl_idx=%d", + p_scb->app_idx, p_scb->mcl_idx, p_scb->mdl_idx); + btif_hl_set_socket_state(p_scb, BTIF_HL_SOC_STATE_IDLE); + if (p_scb->socket_id[1] != -1) { + FD_CLR(p_scb->socket_id[1] , p_org_set); + shutdown(p_scb->socket_id[1], SHUT_RDWR); + close(p_scb->socket_id[1]); + + btif_hl_evt_cb_t evt_param; + evt_param.chan_cb.app_id = (int) btif_hl_get_app_id(p_scb->channel_id); + memcpy(evt_param.chan_cb.bd_addr, p_scb->bd_addr, sizeof(BD_ADDR)); + evt_param.chan_cb.channel_id = p_scb->channel_id; + evt_param.chan_cb.fd = p_scb->socket_id[0]; + evt_param.chan_cb.mdep_cfg_index = (int ) p_scb->mdep_cfg_idx; + evt_param.chan_cb.cb_state = BTIF_HL_CHAN_CB_STATE_DISCONNECTED_PENDING; + int len = sizeof(btif_hl_send_chan_state_cb_t); + bt_status_t status = btif_transfer_context (btif_hl_proc_cb_evt, + BTIF_HL_SEND_DISCONNECTED_CB, + (char*) &evt_param, len, NULL); + ASSERTC(status == BT_STATUS_SUCCESS, "context transfer failed", status); } - p_scb = (btif_hl_soc_cb_t *)GKI_getnext((void *)p_scb ); - BTIF_TRACE_DEBUG("while loop next p_scb=0x%x", p_scb); } + } - p_scb = (btif_hl_soc_cb_t *)GKI_getfirst((void *)&soc_queue); - while (p_scb != NULL) - { - if (btif_hl_get_socket_state(p_scb) == BTIF_HL_SOC_STATE_IDLE) - { - p_dcb = BTIF_HL_GET_MDL_CB_PTR(p_scb->app_idx, p_scb->mcl_idx, p_scb->mdl_idx); - BTIF_TRACE_DEBUG("idle socket app_idx=%d mcl_id=%d, mdl_idx=%d p_dcb->in_use=%d", - p_scb->app_idx, p_scb->mcl_idx, p_scb->mdl_idx, p_dcb->in_use); - GKI_remove_from_queue((void *)&soc_queue, p_scb); - btif_hl_free_buf((void **)&p_scb); - p_dcb->p_scb = NULL; - element_removed = TRUE; - } - BTIF_TRACE_DEBUG("element_removed=%d p_scb=0x%x", element_removed, p_scb); - if (element_removed) - { - element_removed = FALSE; - p_scb = (btif_hl_soc_cb_t *)GKI_getfirst((void *)&soc_queue); - } - else - p_scb = (btif_hl_soc_cb_t *)GKI_getnext((void *)p_scb ); - - BTIF_TRACE_DEBUG("while loop p_scb=0x%x", p_scb); + for (const list_node_t *node = list_begin(soc_queue); + node != list_end(soc_queue); ) { + // We may mutate this list so we need keep track of + // the current node and only remove items behind. + btif_hl_soc_cb_t *p_scb = list_node(node); + node = list_next(node); + if (btif_hl_get_socket_state(p_scb) == BTIF_HL_SOC_STATE_IDLE) { + btif_hl_mdl_cb_t *p_dcb = BTIF_HL_GET_MDL_CB_PTR(p_scb->app_idx, + p_scb->mcl_idx, p_scb->mdl_idx); + BTIF_TRACE_DEBUG("idle socket app_idx=%d mcl_id=%d, mdl_idx=%d p_dcb->in_use=%d", + p_scb->app_idx, p_scb->mcl_idx, p_scb->mdl_idx, p_dcb->in_use); + list_remove(soc_queue, p_scb); + btif_hl_free_buf((void **)&p_scb); + p_dcb->p_scb = NULL; } + BTIF_TRACE_DEBUG("p_scb=0x%x", p_scb); } BTIF_TRACE_DEBUG("leaving %s",__FUNCTION__); } + /******************************************************************************* ** ** Function btif_hl_select_wakeup_callback @@ -4819,65 +4792,49 @@ void btif_hl_select_wakeup_callback( fd_set *p_org_set , int wakeup_signal){ ** Returns void ** *******************************************************************************/ -void btif_hl_select_monitor_callback( fd_set *p_cur_set , fd_set *p_org_set){ - btif_hl_soc_cb_t *p_scb = NULL; - btif_hl_mdl_cb_t *p_dcb = NULL; - int r; +void btif_hl_select_monitor_callback(fd_set *p_cur_set ,fd_set *p_org_set) { UNUSED(p_org_set); BTIF_TRACE_DEBUG("entering %s",__FUNCTION__); - if (!GKI_queue_is_empty(&soc_queue)) - { - p_scb = (btif_hl_soc_cb_t *)GKI_getfirst((void *)&soc_queue); - BTIF_TRACE_DEBUG(" GKI queue is not empty "); - while (p_scb != NULL) - { - if (btif_hl_get_socket_state(p_scb) == BTIF_HL_SOC_STATE_W4_READ) - { - if (FD_ISSET(p_scb->socket_id[1], p_cur_set)) - { - BTIF_TRACE_DEBUG("read data"); - BTIF_TRACE_DEBUG("state= BTIF_HL_SOC_STATE_W4_READ"); - p_dcb = BTIF_HL_GET_MDL_CB_PTR(p_scb->app_idx, p_scb->mcl_idx, p_scb->mdl_idx); - if (p_dcb->p_tx_pkt) - { - BTIF_TRACE_ERROR("Rcv new pkt but the last pkt is still not been sent tx_size=%d", p_dcb->tx_size); - btif_hl_free_buf((void **) &p_dcb->p_tx_pkt); - } - p_dcb->p_tx_pkt = btif_hl_get_buf (p_dcb->mtu); - if (p_dcb ) - { - //do - // { - // r = recv(p_scb->socket_id[1], p_dcb->p_tx_pkt, p_dcb->mtu , MSG_DONTWAIT)); - // } while (r == SOCKET_ERROR && errno == EINTR); - - if ((r = (int)recv(p_scb->socket_id[1], p_dcb->p_tx_pkt, p_dcb->mtu , MSG_DONTWAIT)) > 0) - { - BTIF_TRACE_DEBUG("btif_hl_select_monitor_callback send data r =%d", r); - p_dcb->tx_size = r; - BTIF_TRACE_DEBUG("btif_hl_select_monitor_callback send data tx_size=%d", p_dcb->tx_size ); - BTA_HlSendData(p_dcb->mdl_handle, p_dcb->tx_size ); - } - - if (r <= 0 ) - { - BTIF_TRACE_DEBUG("btif_hl_select_monitor_callback receive failed r=%d",r); - BTA_HlDchClose(p_dcb->mdl_handle ); - } + for (const list_node_t *node = list_begin(soc_queue); + node != list_end(soc_queue); node = list_next(node)) { + btif_hl_soc_cb_t *p_scb = list_node(node); + if (btif_hl_get_socket_state(p_scb) == BTIF_HL_SOC_STATE_W4_READ) { + if (FD_ISSET(p_scb->socket_id[1], p_cur_set)) { + BTIF_TRACE_DEBUG("read data state= BTIF_HL_SOC_STATE_W4_READ"); + btif_hl_mdl_cb_t *p_dcb = BTIF_HL_GET_MDL_CB_PTR(p_scb->app_idx, + p_scb->mcl_idx, p_scb->mdl_idx); + assert(p_dcb != NULL); + if (p_dcb->p_tx_pkt) { + BTIF_TRACE_ERROR("Rcv new pkt but the last pkt is still not been" + " sent tx_size=%d", p_dcb->tx_size); + btif_hl_free_buf((void **) &p_dcb->p_tx_pkt); + } + p_dcb->p_tx_pkt = btif_hl_get_buf (p_dcb->mtu); + if (p_dcb) { + int r = (int)recv(p_scb->socket_id[1], p_dcb->p_tx_pkt, + p_dcb->mtu, MSG_DONTWAIT); + if (r > 0) { + BTIF_TRACE_DEBUG("btif_hl_select_monitor_callback send data r =%d", r); + p_dcb->tx_size = r; + BTIF_TRACE_DEBUG("btif_hl_select_monitor_callback send data tx_size=%d", p_dcb->tx_size ); + BTA_HlSendData(p_dcb->mdl_handle, p_dcb->tx_size); + } else { + BTIF_TRACE_DEBUG("btif_hl_select_monitor_callback receive failed r=%d",r); + BTA_HlDchClose(p_dcb->mdl_handle); } } } - p_scb = (btif_hl_soc_cb_t *)GKI_getnext((void *)p_scb ); } } - else - { + + if (list_is_empty(soc_queue)) BTIF_TRACE_DEBUG("btif_hl_select_monitor_queue is empty"); - } + BTIF_TRACE_DEBUG("leaving %s",__FUNCTION__); } + /******************************************************************************* ** ** Function btif_hl_select_wakeup_init @@ -4955,6 +4912,7 @@ static inline int btif_hl_close_select_thread(void) select_thread_id = -1; } } + list_free(soc_queue); return result; } @@ -5106,7 +5064,9 @@ static inline pthread_t create_thread(void *(*start_routine)(void *), void * arg *******************************************************************************/ void btif_hl_soc_thread_init(void){ BTIF_TRACE_DEBUG("%s", __FUNCTION__); - GKI_init_q(&soc_queue); + soc_queue = list_new(NULL); + if (soc_queue == NULL) + ALOGE("%s unable to allocate resources for thread", __func__); select_thread_id = create_thread(btif_hl_select_thread, NULL); } /*******************************************************************************