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