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