bt_utils.cc revision f8027005333c88a2f097cfd70d15c3d54c7764ae
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 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:      bt_utils.c
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Description:   Miscellaneous helper functions
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ***********************************************************************************/
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton#define LOG_TAG "bt_utils"
2944802768c447ab480d4227b3a852a97d923b816dSharvil Nanavati
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <cutils/properties.h>
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <cutils/sched_policy.h>
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <errno.h>
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <pthread.h>
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <sys/resource.h>
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h>
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdlib.h>
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <unistd.h>
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <utils/ThreadDefs.h>
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4083e2c342e8b40009f3509425722d309c0b8189b9Chris Manton#include "bt_types.h"
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_utils.h"
4295b74f252f534ec757aab1fc08e086e02b2cfe8dSharvil Nanavati#include "btcore/include/module.h"
4344802768c447ab480d4227b3a852a97d923b816dSharvil Nanavati#include "osi/include/log.h"
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Type definitions for callback functions
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project********************************************************************************/
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic pthread_once_t g_DoSchedulingGroupOnce[TASK_HIGH_MAX];
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN g_DoSchedulingGroup[TASK_HIGH_MAX];
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic pthread_mutex_t         gIdxLock;
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int g_TaskIdx;
524128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xustatic int g_TaskIDs[TASK_HIGH_MAX];
534128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu#define INVALID_TASK_ID  (-1)
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5596363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnsonstatic future_t *init(void) {
5696363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson  int i;
5796363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson  pthread_mutexattr_t lock_attr;
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5996363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson  for(i = 0; i < TASK_HIGH_MAX; i++) {
6096363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson    g_DoSchedulingGroupOnce[i] = PTHREAD_ONCE_INIT;
6196363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson    g_DoSchedulingGroup[i] = TRUE;
6296363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson    g_TaskIDs[i] = INVALID_TASK_ID;
6396363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson  }
6496363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson
6596363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson  pthread_mutexattr_init(&lock_attr);
6696363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson  pthread_mutex_init(&gIdxLock, &lock_attr);
6796363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson  return NULL;
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7096363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnsonstatic future_t *clean_up(void) {
7196363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson  pthread_mutex_destroy(&gIdxLock);
7296363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson  return NULL;
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7596363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnsonconst module_t bt_utils_module = {
7696363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson  .name = BT_UTILS_MODULE,
7796363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson  .init = init,
7896363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson  .start_up = NULL,
7996363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson  .shut_down = NULL,
8096363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson  .clean_up = clean_up,
8196363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson  .dependencies = {
8296363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson    NULL
8396363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson  }
8496363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson};
8596363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson
8696363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function        check_do_scheduling_group
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description     check if it is ok to change schedule group
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns         void
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void check_do_scheduling_group(void) {
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char buf[PROPERTY_VALUE_MAX];
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int len = property_get("debug.sys.noschedgroups", buf, "");
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (len > 0) {
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        int temp;
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (sscanf(buf, "%d", &temp) == 1) {
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            g_DoSchedulingGroup[g_TaskIdx] = temp == 0;
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function        raise_priority_a2dp
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description     Raise task priority for A2DP streaming
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns         void
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid raise_priority_a2dp(tHIGH_PRIORITY_TASK high_task) {
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int rc = 0;
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int tid = gettid();
1193eae42f2a383adaaf83336dc4c92afd2de2c4112Mattias Agren    int priority = ANDROID_PRIORITY_AUDIO;
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pthread_mutex_lock(&gIdxLock);
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    g_TaskIdx = high_task;
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pthread_once(&g_DoSchedulingGroupOnce[g_TaskIdx], check_do_scheduling_group);
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (g_DoSchedulingGroup[g_TaskIdx]) {
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        // set_sched_policy does not support tid == 0
127f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach        rc = set_sched_policy(tid, SP_AUDIO_SYS);
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1294128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu    g_TaskIDs[high_task] = tid;
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pthread_mutex_unlock(&gIdxLock);
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (rc) {
13344802768c447ab480d4227b3a852a97d923b816dSharvil Nanavati        LOG_WARN("failed to change sched policy, tid %d, err: %d", tid, errno);
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1363eae42f2a383adaaf83336dc4c92afd2de2c4112Mattias Agren    // always use urgent priority for HCI worker thread until we can adjust
1373eae42f2a383adaaf83336dc4c92afd2de2c4112Mattias Agren    // its prio individually. All other threads can be dynamically adjusted voa
1383eae42f2a383adaaf83336dc4c92afd2de2c4112Mattias Agren    // adjust_priority_a2dp()
1393eae42f2a383adaaf83336dc4c92afd2de2c4112Mattias Agren
1403eae42f2a383adaaf83336dc4c92afd2de2c4112Mattias Agren    if (high_task == TASK_HIGH_HCI_WORKER)
1413eae42f2a383adaaf83336dc4c92afd2de2c4112Mattias Agren       priority = ANDROID_PRIORITY_URGENT_AUDIO;
1423eae42f2a383adaaf83336dc4c92afd2de2c4112Mattias Agren
1433eae42f2a383adaaf83336dc4c92afd2de2c4112Mattias Agren    if (setpriority(PRIO_PROCESS, tid, priority) < 0) {
14444802768c447ab480d4227b3a852a97d923b816dSharvil Nanavati        LOG_WARN("failed to change priority tid: %d to %d", tid, priority);
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1484128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu/*****************************************************************************
1494128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu**
1504128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu** Function        adjust_priority_a2dp
1514128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu**
1524128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu** Description     increase the a2dp consumer task priority temporarily when start
1534128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu**                 audio playing, to avoid overflow the audio packet queue, restore
1544128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu**                 the a2dp consumer task priority when stop audio playing.
1554128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu**
1564128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu** Returns         void
1574128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu**
1584128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu*******************************************************************************/
1594128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xuvoid adjust_priority_a2dp(int start) {
1604128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu    int priority = start ? ANDROID_PRIORITY_URGENT_AUDIO : ANDROID_PRIORITY_AUDIO;
1614128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu    int tid;
1624128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu    int i;
1634128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu
1643eae42f2a383adaaf83336dc4c92afd2de2c4112Mattias Agren    for (i = 0; i < TASK_HIGH_MAX; i++)
1654128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu    {
1664128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu        tid = g_TaskIDs[i];
1674128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu        if (tid != INVALID_TASK_ID)
1684128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu        {
1694128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu            if (setpriority(PRIO_PROCESS, tid, priority) < 0)
1704128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu            {
17144802768c447ab480d4227b3a852a97d923b816dSharvil Nanavati                LOG_WARN("failed to change priority tid: %d to %d", tid, priority);
1724128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu            }
1734128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu        }
1744128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu    }
1754128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu}
176