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 31f8197a6a9d9363cb52bb8a2c15c0e5a52064355eGlenn Kastenint requestPriority(pid_t pid, pid_t tid, int32_t prio, 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 } 50f59a4b393f4844c5bbc8d6212364bdddea33d232Eric Laurent ret = sps->requestPriority(pid, tid, prio, 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 621dc28b794587be22c90a97070d928f94586db638Glenn Kasten} // namespace android 63