11dc28b794587be22c90a97070d928f94586db638Glenn Kasten/* 21dc28b794587be22c90a97070d928f94586db638Glenn Kasten * Copyright (C) 2012 The Android Open Source Project 31dc28b794587be22c90a97070d928f94586db638Glenn Kasten * 41dc28b794587be22c90a97070d928f94586db638Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 51dc28b794587be22c90a97070d928f94586db638Glenn Kasten * you may not use this file except in compliance with the License. 61dc28b794587be22c90a97070d928f94586db638Glenn Kasten * You may obtain a copy of the License at 71dc28b794587be22c90a97070d928f94586db638Glenn Kasten * 81dc28b794587be22c90a97070d928f94586db638Glenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 91dc28b794587be22c90a97070d928f94586db638Glenn Kasten * 101dc28b794587be22c90a97070d928f94586db638Glenn Kasten * Unless required by applicable law or agreed to in writing, software 111dc28b794587be22c90a97070d928f94586db638Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 121dc28b794587be22c90a97070d928f94586db638Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131dc28b794587be22c90a97070d928f94586db638Glenn Kasten * See the License for the specific language governing permissions and 141dc28b794587be22c90a97070d928f94586db638Glenn Kasten * limitations under the License. 151dc28b794587be22c90a97070d928f94586db638Glenn Kasten */ 161dc28b794587be22c90a97070d928f94586db638Glenn Kasten 17f59a4b393f4844c5bbc8d6212364bdddea33d232Eric Laurent#define LOG_TAG "SchedulingPolicyService" 18f59a4b393f4844c5bbc8d6212364bdddea33d232Eric Laurent//#define LOG_NDEBUG 0 19f59a4b393f4844c5bbc8d6212364bdddea33d232Eric Laurent 201dc28b794587be22c90a97070d928f94586db638Glenn Kasten#include <binder/IServiceManager.h> 211dc28b794587be22c90a97070d928f94586db638Glenn Kasten#include <utils/Mutex.h> 221dc28b794587be22c90a97070d928f94586db638Glenn Kasten#include "ISchedulingPolicyService.h" 23f99498ee4de7123e2fd71778c6877be44fbd1506Eino-Ville Talvala#include "mediautils/SchedulingPolicyService.h" 241dc28b794587be22c90a97070d928f94586db638Glenn Kasten 251dc28b794587be22c90a97070d928f94586db638Glenn Kastennamespace android { 261dc28b794587be22c90a97070d928f94586db638Glenn Kasten 271dc28b794587be22c90a97070d928f94586db638Glenn Kastenstatic sp<ISchedulingPolicyService> sSchedulingPolicyService; 281dc28b794587be22c90a97070d928f94586db638Glenn Kastenstatic const String16 _scheduling_policy("scheduling_policy"); 291dc28b794587be22c90a97070d928f94586db638Glenn Kastenstatic Mutex sMutex; 301dc28b794587be22c90a97070d928f94586db638Glenn Kasten 3183f042776b131b149f803fff6ab184ae2c4d98cdMikhail Naganovint requestPriority(pid_t pid, pid_t tid, int32_t prio, bool isForApp, bool asynchronous) 321dc28b794587be22c90a97070d928f94586db638Glenn Kasten{ 331dc28b794587be22c90a97070d928f94586db638Glenn Kasten // FIXME merge duplicated code related to service lookup, caching, and error recovery 34f59a4b393f4844c5bbc8d6212364bdddea33d232Eric Laurent int ret; 351dc28b794587be22c90a97070d928f94586db638Glenn Kasten for (;;) { 361dc28b794587be22c90a97070d928f94586db638Glenn Kasten sMutex.lock(); 37f59a4b393f4844c5bbc8d6212364bdddea33d232Eric Laurent sp<ISchedulingPolicyService> sps = sSchedulingPolicyService; 381dc28b794587be22c90a97070d928f94586db638Glenn Kasten sMutex.unlock(); 39f59a4b393f4844c5bbc8d6212364bdddea33d232Eric Laurent if (sps == 0) { 40f59a4b393f4844c5bbc8d6212364bdddea33d232Eric Laurent sp<IBinder> binder = defaultServiceManager()->checkService(_scheduling_policy); 41f59a4b393f4844c5bbc8d6212364bdddea33d232Eric Laurent if (binder == 0) { 42f59a4b393f4844c5bbc8d6212364bdddea33d232Eric Laurent sleep(1); 43f59a4b393f4844c5bbc8d6212364bdddea33d232Eric Laurent continue; 44f59a4b393f4844c5bbc8d6212364bdddea33d232Eric Laurent } 451dc28b794587be22c90a97070d928f94586db638Glenn Kasten sps = interface_cast<ISchedulingPolicyService>(binder); 461dc28b794587be22c90a97070d928f94586db638Glenn Kasten sMutex.lock(); 471dc28b794587be22c90a97070d928f94586db638Glenn Kasten sSchedulingPolicyService = sps; 481dc28b794587be22c90a97070d928f94586db638Glenn Kasten sMutex.unlock(); 49f59a4b393f4844c5bbc8d6212364bdddea33d232Eric Laurent } 5083f042776b131b149f803fff6ab184ae2c4d98cdMikhail Naganov ret = sps->requestPriority(pid, tid, prio, isForApp, asynchronous); 51f59a4b393f4844c5bbc8d6212364bdddea33d232Eric Laurent if (ret != DEAD_OBJECT) { 521dc28b794587be22c90a97070d928f94586db638Glenn Kasten break; 531dc28b794587be22c90a97070d928f94586db638Glenn Kasten } 54f59a4b393f4844c5bbc8d6212364bdddea33d232Eric Laurent ALOGW("SchedulingPolicyService died"); 55f59a4b393f4844c5bbc8d6212364bdddea33d232Eric Laurent sMutex.lock(); 56f59a4b393f4844c5bbc8d6212364bdddea33d232Eric Laurent sSchedulingPolicyService.clear(); 57f59a4b393f4844c5bbc8d6212364bdddea33d232Eric Laurent sMutex.unlock(); 581dc28b794587be22c90a97070d928f94586db638Glenn Kasten } 59f59a4b393f4844c5bbc8d6212364bdddea33d232Eric Laurent return ret; 601dc28b794587be22c90a97070d928f94586db638Glenn Kasten} 611dc28b794587be22c90a97070d928f94586db638Glenn Kasten 6279d2b28f3a04d7914bb932a65d87117c0c7c11cfChong Zhangint requestCpusetBoost(bool enable, const sp<IInterface> &client) 6379d2b28f3a04d7914bb932a65d87117c0c7c11cfChong Zhang{ 6479d2b28f3a04d7914bb932a65d87117c0c7c11cfChong Zhang int ret; 6579d2b28f3a04d7914bb932a65d87117c0c7c11cfChong Zhang sMutex.lock(); 6679d2b28f3a04d7914bb932a65d87117c0c7c11cfChong Zhang sp<ISchedulingPolicyService> sps = sSchedulingPolicyService; 6779d2b28f3a04d7914bb932a65d87117c0c7c11cfChong Zhang sMutex.unlock(); 6879d2b28f3a04d7914bb932a65d87117c0c7c11cfChong Zhang if (sps == 0) { 6979d2b28f3a04d7914bb932a65d87117c0c7c11cfChong Zhang sp<IBinder> binder = defaultServiceManager()->checkService(_scheduling_policy); 7079d2b28f3a04d7914bb932a65d87117c0c7c11cfChong Zhang if (binder == 0) { 7179d2b28f3a04d7914bb932a65d87117c0c7c11cfChong Zhang return DEAD_OBJECT; 7279d2b28f3a04d7914bb932a65d87117c0c7c11cfChong Zhang } 7379d2b28f3a04d7914bb932a65d87117c0c7c11cfChong Zhang sps = interface_cast<ISchedulingPolicyService>(binder); 7479d2b28f3a04d7914bb932a65d87117c0c7c11cfChong Zhang sMutex.lock(); 7579d2b28f3a04d7914bb932a65d87117c0c7c11cfChong Zhang sSchedulingPolicyService = sps; 7679d2b28f3a04d7914bb932a65d87117c0c7c11cfChong Zhang sMutex.unlock(); 7779d2b28f3a04d7914bb932a65d87117c0c7c11cfChong Zhang } 7879d2b28f3a04d7914bb932a65d87117c0c7c11cfChong Zhang ret = sps->requestCpusetBoost(enable, client); 7979d2b28f3a04d7914bb932a65d87117c0c7c11cfChong Zhang if (ret != DEAD_OBJECT) { 8079d2b28f3a04d7914bb932a65d87117c0c7c11cfChong Zhang return ret; 8179d2b28f3a04d7914bb932a65d87117c0c7c11cfChong Zhang } 8279d2b28f3a04d7914bb932a65d87117c0c7c11cfChong Zhang ALOGW("SchedulingPolicyService died"); 8379d2b28f3a04d7914bb932a65d87117c0c7c11cfChong Zhang sMutex.lock(); 8479d2b28f3a04d7914bb932a65d87117c0c7c11cfChong Zhang sSchedulingPolicyService.clear(); 8579d2b28f3a04d7914bb932a65d87117c0c7c11cfChong Zhang sMutex.unlock(); 8679d2b28f3a04d7914bb932a65d87117c0c7c11cfChong Zhang return ret; 8779d2b28f3a04d7914bb932a65d87117c0c7c11cfChong Zhang} 8879d2b28f3a04d7914bb932a65d87117c0c7c11cfChong Zhang 891dc28b794587be22c90a97070d928f94586db638Glenn Kasten} // namespace android 90