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{ 687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta pthread_mutex_destroy(&utils_mutex); 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function utils_queue_init 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Initialize the given buffer queue 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid utils_queue_init (BUFFER_Q *p_q) 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_q->p_first = p_q->p_last = NULL; 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_q->count = 0; 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function utils_enqueue 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Enqueue a buffer at the tail of the given queue 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid utils_enqueue (BUFFER_Q *p_q, void *p_buf) 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HC_BUFFER_HDR_T *p_hdr; 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hdr = (HC_BUFFER_HDR_T *) ((uint8_t *) p_buf - BT_HC_BUFFER_HDR_SIZE); 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_mutex_lock(&utils_mutex); 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_q->p_last) 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HC_BUFFER_HDR_T *p_last_hdr = \ 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (HC_BUFFER_HDR_T *)((uint8_t *)p_q->p_last - BT_HC_BUFFER_HDR_SIZE); 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_last_hdr->p_next = p_hdr; 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_q->p_first = p_buf; 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_q->p_last = p_buf; 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_q->count++; 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hdr->p_next = NULL; 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_mutex_unlock(&utils_mutex); 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function utils_dequeue 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Dequeues a buffer from the head of the given queue 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns NULL if queue is empty, else buffer 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid *utils_dequeue (BUFFER_Q *p_q) 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_mutex_lock(&utils_mutex); 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project void* p_buf = utils_dequeue_unlocked(p_q); 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_mutex_unlock(&utils_mutex); 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_buf; 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function utils_dequeue_unlocked 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Dequeues a buffer from the head of the given queue without lock 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns NULL if queue is empty, else buffer 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid *utils_dequeue_unlocked (BUFFER_Q *p_q) 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HC_BUFFER_HDR_T *p_hdr; 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_q || !p_q->count) 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (NULL); 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hdr=(HC_BUFFER_HDR_T *)((uint8_t *)p_q->p_first-BT_HC_BUFFER_HDR_SIZE); 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_hdr->p_next) 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_q->p_first = ((uint8_t *)p_hdr->p_next + BT_HC_BUFFER_HDR_SIZE); 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_q->p_first = NULL; 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_q->p_last = NULL; 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_q->count--; 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hdr->p_next = NULL; 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ((uint8_t *)p_hdr + BT_HC_BUFFER_HDR_SIZE); 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function utils_getnext 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Return a pointer to the next buffer linked to the given 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** buffer 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns NULL if the given buffer does not point to any next buffer, 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** else next buffer address 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid *utils_getnext (void *p_buf) 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HC_BUFFER_HDR_T *p_hdr; 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hdr = (HC_BUFFER_HDR_T *) ((uint8_t *) p_buf - BT_HC_BUFFER_HDR_SIZE); 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_hdr->p_next) 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ((uint8_t *)p_hdr->p_next + BT_HC_BUFFER_HDR_SIZE); 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (NULL); 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function utils_remove_from_queue 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Dequeue the given buffer from the middle of the given queue 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns NULL if the given queue is empty, else the given buffer 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid *utils_remove_from_queue (BUFFER_Q *p_q, void *p_buf) 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_mutex_lock(&utils_mutex); 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf = utils_remove_from_queue_unlocked(p_q, p_buf); 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_mutex_unlock(&utils_mutex); 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_buf; 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function utils_remove_from_queue_unlocked 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Dequeue the given buffer from the middle of the given queue 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns NULL if the given queue is empty, else the given buffer 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid *utils_remove_from_queue_unlocked (BUFFER_Q *p_q, void *p_buf) 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HC_BUFFER_HDR_T *p_prev; 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HC_BUFFER_HDR_T *p_buf_hdr; 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_buf == p_q->p_first) 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (utils_dequeue_unlocked (p_q)); 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf_hdr = (HC_BUFFER_HDR_T *)((uint8_t *)p_buf - BT_HC_BUFFER_HDR_SIZE); 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_prev=(HC_BUFFER_HDR_T *)((uint8_t *)p_q->p_first-BT_HC_BUFFER_HDR_SIZE); 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for ( ; p_prev; p_prev = p_prev->p_next) 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If the previous points to this one, move the pointers around */ 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_prev->p_next == p_buf_hdr) 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_prev->p_next = p_buf_hdr->p_next; 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If we are removing the last guy in the queue, update p_last */ 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_buf == p_q->p_last) 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_q->p_last = p_prev + 1; 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* One less in the queue */ 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_q->count--; 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* The buffer is now unlinked */ 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf_hdr->p_next = NULL; 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (p_buf); 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (NULL); 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function utils_delay 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description sleep unconditionally for timeout milliseconds 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid utils_delay (uint32_t timeout) 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project struct timespec delay; 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int err; 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project delay.tv_sec = timeout / 1000; 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project delay.tv_nsec = 1000 * 1000 * (timeout%1000); 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* [u]sleep can't be used because it uses SIGALRM */ 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project do { 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project err = nanosleep(&delay, &delay); 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } while (err < 0 && errno ==EINTR); 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function utils_lock 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description application calls this function before entering critical 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** section 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid utils_lock (void) 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_mutex_lock(&utils_mutex); 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function utils_unlock 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description application calls this function when leaving critical 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** section 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid utils_unlock (void) 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_mutex_unlock(&utils_mutex); 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 310