15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2009-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Filename: utils.c 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Description: Contains helper functions 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <errno.h> 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <pthread.h> 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <time.h> 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_hci_bdroid.h" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "utils.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Static variables 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic pthread_mutex_t utils_mutex; 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** UTILS INTERFACE FUNCTIONS 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/ 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function utils_init 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Utils initialization 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid utils_init (void) 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_mutex_init(&utils_mutex, NULL); 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function utils_cleanup 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Utils cleanup 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid utils_cleanup (void) 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function utils_queue_init 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Initialize the given buffer queue 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid utils_queue_init (BUFFER_Q *p_q) 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_q->p_first = p_q->p_last = NULL; 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_q->count = 0; 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function utils_enqueue 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Enqueue a buffer at the tail of the given queue 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid utils_enqueue (BUFFER_Q *p_q, void *p_buf) 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HC_BUFFER_HDR_T *p_hdr; 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hdr = (HC_BUFFER_HDR_T *) ((uint8_t *) p_buf - BT_HC_BUFFER_HDR_SIZE); 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_mutex_lock(&utils_mutex); 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_q->p_last) 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HC_BUFFER_HDR_T *p_last_hdr = \ 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (HC_BUFFER_HDR_T *)((uint8_t *)p_q->p_last - BT_HC_BUFFER_HDR_SIZE); 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_last_hdr->p_next = p_hdr; 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_q->p_first = p_buf; 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_q->p_last = p_buf; 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_q->count++; 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hdr->p_next = NULL; 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_mutex_unlock(&utils_mutex); 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function utils_dequeue 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Dequeues a buffer from the head of the given queue 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns NULL if queue is empty, else buffer 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid *utils_dequeue (BUFFER_Q *p_q) 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_mutex_lock(&utils_mutex); 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project void* p_buf = utils_dequeue_unlocked(p_q); 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_mutex_unlock(&utils_mutex); 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_buf; 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function utils_dequeue_unlocked 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Dequeues a buffer from the head of the given queue without lock 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns NULL if queue is empty, else buffer 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid *utils_dequeue_unlocked (BUFFER_Q *p_q) 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HC_BUFFER_HDR_T *p_hdr; 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_q || !p_q->count) 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (NULL); 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hdr=(HC_BUFFER_HDR_T *)((uint8_t *)p_q->p_first-BT_HC_BUFFER_HDR_SIZE); 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_hdr->p_next) 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_q->p_first = ((uint8_t *)p_hdr->p_next + BT_HC_BUFFER_HDR_SIZE); 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_q->p_first = NULL; 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_q->p_last = NULL; 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_q->count--; 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hdr->p_next = NULL; 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ((uint8_t *)p_hdr + BT_HC_BUFFER_HDR_SIZE); 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function utils_getnext 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Return a pointer to the next buffer linked to the given 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** buffer 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns NULL if the given buffer does not point to any next buffer, 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** else next buffer address 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid *utils_getnext (void *p_buf) 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HC_BUFFER_HDR_T *p_hdr; 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hdr = (HC_BUFFER_HDR_T *) ((uint8_t *) p_buf - BT_HC_BUFFER_HDR_SIZE); 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_hdr->p_next) 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ((uint8_t *)p_hdr->p_next + BT_HC_BUFFER_HDR_SIZE); 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (NULL); 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function utils_remove_from_queue 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Dequeue the given buffer from the middle of the given queue 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns NULL if the given queue is empty, else the given buffer 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid *utils_remove_from_queue (BUFFER_Q *p_q, void *p_buf) 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_mutex_lock(&utils_mutex); 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf = utils_remove_from_queue_unlocked(p_q, p_buf); 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_mutex_unlock(&utils_mutex); 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_buf; 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function utils_remove_from_queue_unlocked 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Dequeue the given buffer from the middle of the given queue 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns NULL if the given queue is empty, else the given buffer 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid *utils_remove_from_queue_unlocked (BUFFER_Q *p_q, void *p_buf) 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HC_BUFFER_HDR_T *p_prev; 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HC_BUFFER_HDR_T *p_buf_hdr; 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_buf == p_q->p_first) 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (utils_dequeue_unlocked (p_q)); 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf_hdr = (HC_BUFFER_HDR_T *)((uint8_t *)p_buf - BT_HC_BUFFER_HDR_SIZE); 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_prev=(HC_BUFFER_HDR_T *)((uint8_t *)p_q->p_first-BT_HC_BUFFER_HDR_SIZE); 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for ( ; p_prev; p_prev = p_prev->p_next) 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If the previous points to this one, move the pointers around */ 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_prev->p_next == p_buf_hdr) 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_prev->p_next = p_buf_hdr->p_next; 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If we are removing the last guy in the queue, update p_last */ 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_buf == p_q->p_last) 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_q->p_last = p_prev + 1; 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* One less in the queue */ 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_q->count--; 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* The buffer is now unlinked */ 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf_hdr->p_next = NULL; 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (p_buf); 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (NULL); 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function utils_delay 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description sleep unconditionally for timeout milliseconds 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid utils_delay (uint32_t timeout) 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project struct timespec delay; 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int err; 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project delay.tv_sec = timeout / 1000; 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project delay.tv_nsec = 1000 * 1000 * (timeout%1000); 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* [u]sleep can't be used because it uses SIGALRM */ 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project do { 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project err = nanosleep(&delay, &delay); 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } while (err < 0 && errno ==EINTR); 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function utils_lock 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description application calls this function before entering critical 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** section 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid utils_lock (void) 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_mutex_lock(&utils_mutex); 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function utils_unlock 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description application calls this function when leaving critical 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** section 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid utils_unlock (void) 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_mutex_unlock(&utils_mutex); 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 309