bt_utils.cc revision 96363ff2b78c10e2b2e106464f337b58ec1a616a
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
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <cutils/properties.h>
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <cutils/sched_policy.h>
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <errno.h>
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <pthread.h>
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <sys/resource.h>
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h>
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdlib.h>
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <unistd.h>
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <utils/ThreadDefs.h>
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define LOG_TAG "BT_UTILS"
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <utils/Log.h>
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "data_types.h"
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_utils.h"
4496363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson#include "module.h"
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Type definitions for callback functions
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project********************************************************************************/
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic pthread_once_t g_DoSchedulingGroupOnce[TASK_HIGH_MAX];
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN g_DoSchedulingGroup[TASK_HIGH_MAX];
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic pthread_mutex_t         gIdxLock;
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int g_TaskIdx;
534128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xustatic int g_TaskIDs[TASK_HIGH_MAX];
544128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu#define INVALID_TASK_ID  (-1)
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5696363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnsonstatic future_t *init(void) {
5796363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson  int i;
5896363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson  pthread_mutexattr_t lock_attr;
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6096363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson  for(i = 0; i < TASK_HIGH_MAX; i++) {
6196363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson    g_DoSchedulingGroupOnce[i] = PTHREAD_ONCE_INIT;
6296363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson    g_DoSchedulingGroup[i] = TRUE;
6396363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson    g_TaskIDs[i] = INVALID_TASK_ID;
6496363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson  }
6596363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson
6696363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson  pthread_mutexattr_init(&lock_attr);
6796363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson  pthread_mutex_init(&gIdxLock, &lock_attr);
6896363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson  return NULL;
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7196363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnsonstatic future_t *clean_up(void) {
7296363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson  pthread_mutex_destroy(&gIdxLock);
7396363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson  return NULL;
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7696363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnsonconst module_t bt_utils_module = {
7796363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson  .name = BT_UTILS_MODULE,
7896363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson  .init = init,
7996363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson  .start_up = NULL,
8096363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson  .shut_down = NULL,
8196363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson  .clean_up = clean_up,
8296363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson  .dependencies = {
8396363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson    NULL
8496363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson  }
8596363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson};
8696363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson
8796363ff2b78c10e2b2e106464f337b58ec1a616aZach Johnson
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function        check_do_scheduling_group
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description     check if it is ok to change schedule group
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns         void
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void check_do_scheduling_group(void) {
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char buf[PROPERTY_VALUE_MAX];
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int len = property_get("debug.sys.noschedgroups", buf, "");
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (len > 0) {
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        int temp;
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (sscanf(buf, "%d", &temp) == 1) {
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            g_DoSchedulingGroup[g_TaskIdx] = temp == 0;
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**
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function        raise_priority_a2dp
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description     Raise task priority for A2DP streaming
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns         void
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid raise_priority_a2dp(tHIGH_PRIORITY_TASK high_task) {
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int rc = 0;
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int tid = gettid();
1203eae42f2a383adaaf83336dc4c92afd2de2c4112Mattias Agren    int priority = ANDROID_PRIORITY_AUDIO;
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pthread_mutex_lock(&gIdxLock);
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    g_TaskIdx = high_task;
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pthread_once(&g_DoSchedulingGroupOnce[g_TaskIdx], check_do_scheduling_group);
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (g_DoSchedulingGroup[g_TaskIdx]) {
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        // set_sched_policy does not support tid == 0
128f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach        rc = set_sched_policy(tid, SP_AUDIO_SYS);
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1304128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu    g_TaskIDs[high_task] = tid;
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pthread_mutex_unlock(&gIdxLock);
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (rc) {
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ALOGW("failed to change sched policy, tid %d, err: %d", tid, errno);
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1373eae42f2a383adaaf83336dc4c92afd2de2c4112Mattias Agren    // always use urgent priority for HCI worker thread until we can adjust
1383eae42f2a383adaaf83336dc4c92afd2de2c4112Mattias Agren    // its prio individually. All other threads can be dynamically adjusted voa
1393eae42f2a383adaaf83336dc4c92afd2de2c4112Mattias Agren    // adjust_priority_a2dp()
1403eae42f2a383adaaf83336dc4c92afd2de2c4112Mattias Agren
1413eae42f2a383adaaf83336dc4c92afd2de2c4112Mattias Agren    if (high_task == TASK_HIGH_HCI_WORKER)
1423eae42f2a383adaaf83336dc4c92afd2de2c4112Mattias Agren       priority = ANDROID_PRIORITY_URGENT_AUDIO;
1433eae42f2a383adaaf83336dc4c92afd2de2c4112Mattias Agren
1443eae42f2a383adaaf83336dc4c92afd2de2c4112Mattias Agren    if (setpriority(PRIO_PROCESS, tid, priority) < 0) {
1453eae42f2a383adaaf83336dc4c92afd2de2c4112Mattias Agren        ALOGW("failed to change priority tid: %d to %d", tid, priority);
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1494128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu/*****************************************************************************
1504128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu**
1514128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu** Function        adjust_priority_a2dp
1524128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu**
1534128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu** Description     increase the a2dp consumer task priority temporarily when start
1544128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu**                 audio playing, to avoid overflow the audio packet queue, restore
1554128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu**                 the a2dp consumer task priority when stop audio playing.
1564128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu**
1574128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu** Returns         void
1584128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu**
1594128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu*******************************************************************************/
1604128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xuvoid adjust_priority_a2dp(int start) {
1614128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu    int priority = start ? ANDROID_PRIORITY_URGENT_AUDIO : ANDROID_PRIORITY_AUDIO;
1624128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu    int tid;
1634128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu    int i;
1644128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu
1653eae42f2a383adaaf83336dc4c92afd2de2c4112Mattias Agren    for (i = 0; i < TASK_HIGH_MAX; i++)
1664128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu    {
1674128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu        tid = g_TaskIDs[i];
1684128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu        if (tid != INVALID_TASK_ID)
1694128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu        {
1704128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu            if (setpriority(PRIO_PROCESS, tid, priority) < 0)
1714128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu            {
1724128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu                ALOGW("failed to change priority tid: %d to %d", tid, priority);
1734128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu            }
1744128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu        }
1754128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu    }
1764128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu}
177