xref: /aosp_15_r20/frameworks/av/media/utils/SchedulingPolicyService.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
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