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