1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2012 The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker *
4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker *
8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker *
10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker */
16*ec779b8eSAndroid Build Coastguard Worker
17*ec779b8eSAndroid Build Coastguard Worker #define LOG_TAG "SchedulingPolicyService"
18*ec779b8eSAndroid Build Coastguard Worker //#define LOG_NDEBUG 0
19*ec779b8eSAndroid Build Coastguard Worker
20*ec779b8eSAndroid Build Coastguard Worker #include <audio_utils/threads.h>
21*ec779b8eSAndroid Build Coastguard Worker #include <binder/IServiceManager.h>
22*ec779b8eSAndroid Build Coastguard Worker #include <cutils/android_filesystem_config.h>
23*ec779b8eSAndroid Build Coastguard Worker #include <cutils/properties.h>
24*ec779b8eSAndroid Build Coastguard Worker #include <utils/Mutex.h>
25*ec779b8eSAndroid Build Coastguard Worker #include "ISchedulingPolicyService.h"
26*ec779b8eSAndroid Build Coastguard Worker #include "mediautils/SchedulingPolicyService.h"
27*ec779b8eSAndroid Build Coastguard Worker
28*ec779b8eSAndroid Build Coastguard Worker namespace android {
29*ec779b8eSAndroid Build Coastguard Worker
30*ec779b8eSAndroid Build Coastguard Worker static sp<ISchedulingPolicyService> sSchedulingPolicyService;
31*ec779b8eSAndroid Build Coastguard Worker static const String16 _scheduling_policy("scheduling_policy");
32*ec779b8eSAndroid Build Coastguard Worker static Mutex sMutex;
33*ec779b8eSAndroid Build Coastguard Worker
requestPriority(pid_t pid,pid_t tid,int32_t prio,bool isForApp,bool asynchronous)34*ec779b8eSAndroid Build Coastguard Worker int requestPriority(pid_t pid, pid_t tid, int32_t prio, bool isForApp, bool asynchronous)
35*ec779b8eSAndroid Build Coastguard Worker {
36*ec779b8eSAndroid Build Coastguard Worker // audioserver thread priority boosted internally to reduce binder latency and boot time.
37*ec779b8eSAndroid Build Coastguard Worker if (!isForApp && pid == getpid() && getuid() == AID_AUDIOSERVER && prio >= 1 && prio <= 3) {
38*ec779b8eSAndroid Build Coastguard Worker const status_t status = audio_utils::set_thread_priority(
39*ec779b8eSAndroid Build Coastguard Worker tid, audio_utils::rtprio_to_unified_priority(prio));
40*ec779b8eSAndroid Build Coastguard Worker if (status == NO_ERROR) return NO_ERROR;
41*ec779b8eSAndroid Build Coastguard Worker ALOGD("%s: set priority %d, status:%d needs to fallback to SchedulingPolicyService",
42*ec779b8eSAndroid Build Coastguard Worker __func__, prio, status);
43*ec779b8eSAndroid Build Coastguard Worker }
44*ec779b8eSAndroid Build Coastguard Worker
45*ec779b8eSAndroid Build Coastguard Worker // FIXME merge duplicated code related to service lookup, caching, and error recovery
46*ec779b8eSAndroid Build Coastguard Worker int ret;
47*ec779b8eSAndroid Build Coastguard Worker for (;;) {
48*ec779b8eSAndroid Build Coastguard Worker sMutex.lock();
49*ec779b8eSAndroid Build Coastguard Worker sp<ISchedulingPolicyService> sps = sSchedulingPolicyService;
50*ec779b8eSAndroid Build Coastguard Worker sMutex.unlock();
51*ec779b8eSAndroid Build Coastguard Worker if (sps == 0) {
52*ec779b8eSAndroid Build Coastguard Worker sp<IBinder> binder = defaultServiceManager()->checkService(_scheduling_policy);
53*ec779b8eSAndroid Build Coastguard Worker if (binder == 0) {
54*ec779b8eSAndroid Build Coastguard Worker sleep(1);
55*ec779b8eSAndroid Build Coastguard Worker continue;
56*ec779b8eSAndroid Build Coastguard Worker }
57*ec779b8eSAndroid Build Coastguard Worker sps = interface_cast<ISchedulingPolicyService>(binder);
58*ec779b8eSAndroid Build Coastguard Worker sMutex.lock();
59*ec779b8eSAndroid Build Coastguard Worker sSchedulingPolicyService = sps;
60*ec779b8eSAndroid Build Coastguard Worker sMutex.unlock();
61*ec779b8eSAndroid Build Coastguard Worker }
62*ec779b8eSAndroid Build Coastguard Worker ret = sps->requestPriority(pid, tid, prio, isForApp, asynchronous);
63*ec779b8eSAndroid Build Coastguard Worker if (ret != DEAD_OBJECT) {
64*ec779b8eSAndroid Build Coastguard Worker break;
65*ec779b8eSAndroid Build Coastguard Worker }
66*ec779b8eSAndroid Build Coastguard Worker ALOGW("SchedulingPolicyService died");
67*ec779b8eSAndroid Build Coastguard Worker sMutex.lock();
68*ec779b8eSAndroid Build Coastguard Worker sSchedulingPolicyService.clear();
69*ec779b8eSAndroid Build Coastguard Worker sMutex.unlock();
70*ec779b8eSAndroid Build Coastguard Worker }
71*ec779b8eSAndroid Build Coastguard Worker return ret;
72*ec779b8eSAndroid Build Coastguard Worker }
73*ec779b8eSAndroid Build Coastguard Worker
requestCpusetBoost(bool enable,const sp<IBinder> & client)74*ec779b8eSAndroid Build Coastguard Worker int requestCpusetBoost(bool enable, const sp<IBinder> &client)
75*ec779b8eSAndroid Build Coastguard Worker {
76*ec779b8eSAndroid Build Coastguard Worker int ret;
77*ec779b8eSAndroid Build Coastguard Worker sMutex.lock();
78*ec779b8eSAndroid Build Coastguard Worker sp<ISchedulingPolicyService> sps = sSchedulingPolicyService;
79*ec779b8eSAndroid Build Coastguard Worker sMutex.unlock();
80*ec779b8eSAndroid Build Coastguard Worker if (sps == 0) {
81*ec779b8eSAndroid Build Coastguard Worker sp<IBinder> binder = defaultServiceManager()->checkService(_scheduling_policy);
82*ec779b8eSAndroid Build Coastguard Worker if (binder == 0) {
83*ec779b8eSAndroid Build Coastguard Worker return DEAD_OBJECT;
84*ec779b8eSAndroid Build Coastguard Worker }
85*ec779b8eSAndroid Build Coastguard Worker sps = interface_cast<ISchedulingPolicyService>(binder);
86*ec779b8eSAndroid Build Coastguard Worker sMutex.lock();
87*ec779b8eSAndroid Build Coastguard Worker sSchedulingPolicyService = sps;
88*ec779b8eSAndroid Build Coastguard Worker sMutex.unlock();
89*ec779b8eSAndroid Build Coastguard Worker }
90*ec779b8eSAndroid Build Coastguard Worker ret = sps->requestCpusetBoost(enable, client);
91*ec779b8eSAndroid Build Coastguard Worker if (ret != DEAD_OBJECT) {
92*ec779b8eSAndroid Build Coastguard Worker return ret;
93*ec779b8eSAndroid Build Coastguard Worker }
94*ec779b8eSAndroid Build Coastguard Worker ALOGW("SchedulingPolicyService died");
95*ec779b8eSAndroid Build Coastguard Worker sMutex.lock();
96*ec779b8eSAndroid Build Coastguard Worker sSchedulingPolicyService.clear();
97*ec779b8eSAndroid Build Coastguard Worker sMutex.unlock();
98*ec779b8eSAndroid Build Coastguard Worker return ret;
99*ec779b8eSAndroid Build Coastguard Worker }
100*ec779b8eSAndroid Build Coastguard Worker
requestSpatializerPriority(pid_t pid,pid_t tid)101*ec779b8eSAndroid Build Coastguard Worker int requestSpatializerPriority(pid_t pid, pid_t tid) {
102*ec779b8eSAndroid Build Coastguard Worker if (pid == -1 || tid == -1) return BAD_VALUE;
103*ec779b8eSAndroid Build Coastguard Worker
104*ec779b8eSAndroid Build Coastguard Worker // update priority to RT if specified.
105*ec779b8eSAndroid Build Coastguard Worker constexpr int32_t kRTPriorityMin = 1;
106*ec779b8eSAndroid Build Coastguard Worker constexpr int32_t kRTPriorityMax = 3;
107*ec779b8eSAndroid Build Coastguard Worker const int32_t priorityBoost =
108*ec779b8eSAndroid Build Coastguard Worker property_get_int32("audio.spatializer.priority", kRTPriorityMin);
109*ec779b8eSAndroid Build Coastguard Worker if (priorityBoost >= kRTPriorityMin && priorityBoost <= kRTPriorityMax) {
110*ec779b8eSAndroid Build Coastguard Worker const status_t status = requestPriority(
111*ec779b8eSAndroid Build Coastguard Worker pid, tid, priorityBoost, false /* isForApp */, true /*asynchronous*/);
112*ec779b8eSAndroid Build Coastguard Worker if (status != OK) {
113*ec779b8eSAndroid Build Coastguard Worker ALOGW("%s: Cannot request spatializer priority boost %d, status:%d",
114*ec779b8eSAndroid Build Coastguard Worker __func__, priorityBoost, status);
115*ec779b8eSAndroid Build Coastguard Worker return status < 0 ? status : UNKNOWN_ERROR;
116*ec779b8eSAndroid Build Coastguard Worker }
117*ec779b8eSAndroid Build Coastguard Worker return priorityBoost;
118*ec779b8eSAndroid Build Coastguard Worker }
119*ec779b8eSAndroid Build Coastguard Worker return 0; // no boost requested
120*ec779b8eSAndroid Build Coastguard Worker }
121*ec779b8eSAndroid Build Coastguard Worker
122*ec779b8eSAndroid Build Coastguard Worker } // namespace android
123