1231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu/* 2231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu** 3231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu** Copyright 2015, The Android Open Source Project 4231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu** 5231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu** Licensed under the Apache License, Version 2.0 (the "License"); 6231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu** you may not use this file except in compliance with the License. 7231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu** You may obtain a copy of the License at 8231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu** 9231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu** http://www.apache.org/licenses/LICENSE-2.0 10231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu** 11231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu** Unless required by applicable law or agreed to in writing, software 12231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu** distributed under the License is distributed on an "AS IS" BASIS, 13231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu** See the License for the specific language governing permissions and 15231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu** limitations under the License. 16231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu*/ 17231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 18231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu//#define LOG_NDEBUG 0 19231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu#define LOG_TAG "ResourceManagerService" 20231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu#include <utils/Log.h> 21231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 22231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu#include <binder/IServiceManager.h> 23231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu#include <dirent.h> 24231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu#include <media/stagefright/ProcessInfo.h> 25231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu#include <string.h> 26231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu#include <sys/types.h> 27231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu#include <sys/stat.h> 28231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu#include <sys/time.h> 29231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu#include <unistd.h> 30231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 31231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu#include "ResourceManagerService.h" 32a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu#include "ServiceLog.h" 33231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 34231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wunamespace android { 35231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 36231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wutemplate <typename T> 37231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wustatic String8 getString(const Vector<T> &items) { 38231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu String8 itemsStr; 39231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu for (size_t i = 0; i < items.size(); ++i) { 40231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu itemsStr.appendFormat("%s ", items[i].toString().string()); 41231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 42231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu return itemsStr; 43231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu} 44231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 45231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wustatic bool hasResourceType(String8 type, Vector<MediaResource> resources) { 46231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu for (size_t i = 0; i < resources.size(); ++i) { 47231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu if (resources[i].mType == type) { 48231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu return true; 49231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 50231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 51231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu return false; 52231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu} 53231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 54231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wustatic bool hasResourceType(String8 type, ResourceInfos infos) { 55231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu for (size_t i = 0; i < infos.size(); ++i) { 56231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu if (hasResourceType(type, infos[i].resources)) { 57231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu return true; 58231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 59231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 60231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu return false; 61231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu} 62231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 63231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wustatic ResourceInfos& getResourceInfosForEdit( 64231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu int pid, 65231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu PidResourceInfosMap& map) { 66231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu ssize_t index = map.indexOfKey(pid); 67231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu if (index < 0) { 68231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu // new pid 69231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu ResourceInfos infosForPid; 70231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu map.add(pid, infosForPid); 71231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 72231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 73231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu return map.editValueFor(pid); 74231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu} 75231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 76231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wustatic ResourceInfo& getResourceInfoForEdit( 77231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu int64_t clientId, 78231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu const sp<IResourceManagerClient> client, 79231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu ResourceInfos& infos) { 80231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu for (size_t i = 0; i < infos.size(); ++i) { 81231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu if (infos[i].clientId == clientId) { 82231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu return infos.editItemAt(i); 83231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 84231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 85231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu ResourceInfo info; 86231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu info.clientId = clientId; 87231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu info.client = client; 88231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu infos.push_back(info); 89231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu return infos.editItemAt(infos.size() - 1); 90231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu} 91231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 92a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wustatus_t ResourceManagerService::dump(int fd, const Vector<String16>& /* args */) { 938f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu Mutex::Autolock lock(mLock); 948f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu 958f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu String8 result; 968f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu const size_t SIZE = 256; 978f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu char buffer[SIZE]; 988f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu 998f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu snprintf(buffer, SIZE, "ResourceManagerService: %p\n", this); 1008f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu result.append(buffer); 1018f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu result.append(" Policies:\n"); 1028f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu snprintf(buffer, SIZE, " SupportsMultipleSecureCodecs: %d\n", mSupportsMultipleSecureCodecs); 1038f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu result.append(buffer); 1048f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu snprintf(buffer, SIZE, " SupportsSecureWithNonSecureCodec: %d\n", mSupportsSecureWithNonSecureCodec); 1058f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu result.append(buffer); 1068f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu 107a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu result.append(" Processes:\n"); 1088f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu for (size_t i = 0; i < mMap.size(); ++i) { 1098f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu snprintf(buffer, SIZE, " Pid: %d\n", mMap.keyAt(i)); 1108f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu result.append(buffer); 1118f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu 1128f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu const ResourceInfos &infos = mMap.valueAt(i); 1138f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu for (size_t j = 0; j < infos.size(); ++j) { 114a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu result.append(" Client:\n"); 1158f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu snprintf(buffer, SIZE, " Id: %lld\n", (long long)infos[j].clientId); 1168f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu result.append(buffer); 1178f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu 1188f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu snprintf(buffer, SIZE, " Name: %s\n", infos[j].client->getName().string()); 1198f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu result.append(buffer); 1208f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu 1218f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu Vector<MediaResource> resources = infos[j].resources; 122a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu result.append(" Resources:\n"); 1238f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu for (size_t k = 0; k < resources.size(); ++k) { 1248f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu snprintf(buffer, SIZE, " %s\n", resources[k].toString().string()); 1258f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu result.append(buffer); 1268f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu } 1278f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu } 1288f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu } 129022ed72e650f756288492ac7a10a7b41e0b14f82Ronghua Wu result.append(" Events logs (most recent at top):\n"); 130022ed72e650f756288492ac7a10a7b41e0b14f82Ronghua Wu result.append(mServiceLog->toString(" " /* linePrefix */)); 1318f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu 1328f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu write(fd, result.string(), result.size()); 1338f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu return OK; 1348f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu} 1358f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu 136231c3d169ad029689f9d688b68179af7e96b8d78Ronghua WuResourceManagerService::ResourceManagerService() 137231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu : mProcessInfo(new ProcessInfo()), 138a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu mServiceLog(new ServiceLog()), 139231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu mSupportsMultipleSecureCodecs(true), 140231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu mSupportsSecureWithNonSecureCodec(true) {} 141231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 142231c3d169ad029689f9d688b68179af7e96b8d78Ronghua WuResourceManagerService::ResourceManagerService(sp<ProcessInfoInterface> processInfo) 143231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu : mProcessInfo(processInfo), 144a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu mServiceLog(new ServiceLog()), 145231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu mSupportsMultipleSecureCodecs(true), 146231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu mSupportsSecureWithNonSecureCodec(true) {} 147231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 148231c3d169ad029689f9d688b68179af7e96b8d78Ronghua WuResourceManagerService::~ResourceManagerService() {} 149231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 150231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wuvoid ResourceManagerService::config(const Vector<MediaResourcePolicy> &policies) { 151a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu String8 log = String8::format("config(%s)", getString(policies).string()); 152a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu mServiceLog->add(log); 153231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 154231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu Mutex::Autolock lock(mLock); 155231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu for (size_t i = 0; i < policies.size(); ++i) { 156231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu String8 type = policies[i].mType; 1579ba21b9418d10ddcc39f08901e24fbf43d82b2bcRonghua Wu String8 value = policies[i].mValue; 158231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu if (type == kPolicySupportsMultipleSecureCodecs) { 1599ba21b9418d10ddcc39f08901e24fbf43d82b2bcRonghua Wu mSupportsMultipleSecureCodecs = (value == "true"); 160231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } else if (type == kPolicySupportsSecureWithNonSecureCodec) { 1619ba21b9418d10ddcc39f08901e24fbf43d82b2bcRonghua Wu mSupportsSecureWithNonSecureCodec = (value == "true"); 162231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 163231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 164231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu} 165231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 166231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wuvoid ResourceManagerService::addResource( 167231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu int pid, 168231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu int64_t clientId, 169231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu const sp<IResourceManagerClient> client, 170231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu const Vector<MediaResource> &resources) { 171a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu String8 log = String8::format("addResource(pid %d, clientId %lld, resources %s)", 172231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu pid, (long long) clientId, getString(resources).string()); 173a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu mServiceLog->add(log); 174231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 175231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu Mutex::Autolock lock(mLock); 176231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu ResourceInfos& infos = getResourceInfosForEdit(pid, mMap); 177231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu ResourceInfo& info = getResourceInfoForEdit(clientId, client, infos); 17867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu // TODO: do the merge instead of append. 179231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu info.resources.appendVector(resources); 180231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu} 181231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 18237c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wuvoid ResourceManagerService::removeResource(int pid, int64_t clientId) { 18337c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu String8 log = String8::format( 18437c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu "removeResource(pid %d, clientId %lld)", 18537c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu pid, (long long) clientId); 186a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu mServiceLog->add(log); 187231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 188231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu Mutex::Autolock lock(mLock); 18937c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu ssize_t index = mMap.indexOfKey(pid); 19037c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu if (index < 0) { 19137c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu ALOGV("removeResource: didn't find pid %d for clientId %lld", pid, (long long) clientId); 19237c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu return; 19337c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu } 194231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu bool found = false; 19537c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu ResourceInfos &infos = mMap.editValueAt(index); 19637c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu for (size_t j = 0; j < infos.size(); ++j) { 19737c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu if (infos[j].clientId == clientId) { 19837c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu j = infos.removeAt(j); 19937c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu found = true; 200231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu break; 201231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 202231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 203231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu if (!found) { 204231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu ALOGV("didn't find client"); 205231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 206231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu} 207231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 20805d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wuvoid ResourceManagerService::getClientForResource_l( 20905d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu int callingPid, const MediaResource *res, Vector<sp<IResourceManagerClient>> *clients) { 21005d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu if (res == NULL) { 21105d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu return; 21205d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu } 21305d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu sp<IResourceManagerClient> client; 21405d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu if (getLowestPriorityBiggestClient_l(callingPid, res->mType, &client)) { 21505d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu clients->push_back(client); 21605d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu } 21705d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu} 21805d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu 219231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wubool ResourceManagerService::reclaimResource( 220231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu int callingPid, const Vector<MediaResource> &resources) { 221a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu String8 log = String8::format("reclaimResource(callingPid %d, resources %s)", 222231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu callingPid, getString(resources).string()); 223a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu mServiceLog->add(log); 224231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 225231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu Vector<sp<IResourceManagerClient>> clients; 226231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu { 227231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu Mutex::Autolock lock(mLock); 22805d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu const MediaResource *secureCodec = NULL; 22905d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu const MediaResource *nonSecureCodec = NULL; 23005d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu const MediaResource *graphicMemory = NULL; 231231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu for (size_t i = 0; i < resources.size(); ++i) { 232231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu String8 type = resources[i].mType; 23305d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu if (resources[i].mType == kResourceSecureCodec) { 23405d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu secureCodec = &resources[i]; 23505d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu } else if (type == kResourceNonSecureCodec) { 23605d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu nonSecureCodec = &resources[i]; 23705d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu } else if (type == kResourceGraphicMemory) { 23805d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu graphicMemory = &resources[i]; 23905d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu } 24005d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu } 24105d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu 24205d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu // first pass to handle secure/non-secure codec conflict 24305d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu if (secureCodec != NULL) { 24405d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu if (!mSupportsMultipleSecureCodecs) { 24505d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu if (!getAllClients_l(callingPid, String8(kResourceSecureCodec), &clients)) { 24605d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu return false; 247231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 24805d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu } 24905d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu if (!mSupportsSecureWithNonSecureCodec) { 25005d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu if (!getAllClients_l(callingPid, String8(kResourceNonSecureCodec), &clients)) { 25105d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu return false; 252231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 25305d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu } 25405d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu } 25505d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu if (nonSecureCodec != NULL) { 25605d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu if (!mSupportsSecureWithNonSecureCodec) { 25705d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu if (!getAllClients_l(callingPid, String8(kResourceSecureCodec), &clients)) { 25805d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu return false; 259231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 260231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 261231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 262231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 263231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu if (clients.size() == 0) { 264231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu // if no secure/non-secure codec conflict, run second pass to handle other resources. 26505d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu getClientForResource_l(callingPid, graphicMemory, &clients); 266231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 26767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 26867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu if (clients.size() == 0) { 26967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu // if we are here, run the third pass to free one codec with the same type. 27005d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu getClientForResource_l(callingPid, secureCodec, &clients); 27105d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu getClientForResource_l(callingPid, nonSecureCodec, &clients); 27205d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu } 27305d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu 27405d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu if (clients.size() == 0) { 27505d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu // if we are here, run the fourth pass to free one codec with the different type. 27605d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu if (secureCodec != NULL) { 27705d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu MediaResource temp(String8(kResourceNonSecureCodec), 1); 27805d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu getClientForResource_l(callingPid, &temp, &clients); 27905d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu } 28005d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu if (nonSecureCodec != NULL) { 28105d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu MediaResource temp(String8(kResourceSecureCodec), 1); 28205d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu getClientForResource_l(callingPid, &temp, &clients); 28367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu } 28467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu } 285231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 286231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 287231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu if (clients.size() == 0) { 288231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu return false; 289231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 290231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 29167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu sp<IResourceManagerClient> failedClient; 292231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu for (size_t i = 0; i < clients.size(); ++i) { 293a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu log = String8::format("reclaimResource from client %p", clients[i].get()); 294a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu mServiceLog->add(log); 295231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu if (!clients[i]->reclaimResource()) { 29667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu failedClient = clients[i]; 29767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu break; 298231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 299231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 30067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 30167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu { 30267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu Mutex::Autolock lock(mLock); 30367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu bool found = false; 30467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu for (size_t i = 0; i < mMap.size(); ++i) { 30567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu ResourceInfos &infos = mMap.editValueAt(i); 30667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu for (size_t j = 0; j < infos.size();) { 30767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu if (infos[j].client == failedClient) { 30867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu j = infos.removeAt(j); 30967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu found = true; 31067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu } else { 31167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu ++j; 31267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu } 31367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu } 31467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu if (found) { 31567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu break; 31667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu } 31767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu } 31867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu if (!found) { 31967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu ALOGV("didn't find failed client"); 32067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu } 32167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu } 32267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 32367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu return (failedClient == NULL); 324231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu} 325231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 326231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wubool ResourceManagerService::getAllClients_l( 327231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu int callingPid, const String8 &type, Vector<sp<IResourceManagerClient>> *clients) { 328231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu Vector<sp<IResourceManagerClient>> temp; 329231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu for (size_t i = 0; i < mMap.size(); ++i) { 330231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu ResourceInfos &infos = mMap.editValueAt(i); 331231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu for (size_t j = 0; j < infos.size(); ++j) { 332231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu if (hasResourceType(type, infos[j].resources)) { 333231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu if (!isCallingPriorityHigher_l(callingPid, mMap.keyAt(i))) { 334231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu // some higher/equal priority process owns the resource, 335231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu // this request can't be fulfilled. 336231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu ALOGE("getAllClients_l: can't reclaim resource %s from pid %d", 337231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu type.string(), mMap.keyAt(i)); 338231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu return false; 339231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 340231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu temp.push_back(infos[j].client); 341231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 342231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 343231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 344231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu if (temp.size() == 0) { 345231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu ALOGV("getAllClients_l: didn't find any resource %s", type.string()); 346231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu return true; 347231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 348231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu clients->appendVector(temp); 349231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu return true; 350231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu} 351231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 352231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wubool ResourceManagerService::getLowestPriorityBiggestClient_l( 353231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu int callingPid, const String8 &type, sp<IResourceManagerClient> *client) { 354231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu int lowestPriorityPid; 355231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu int lowestPriority; 356231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu int callingPriority; 357231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu if (!mProcessInfo->getPriority(callingPid, &callingPriority)) { 358231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu ALOGE("getLowestPriorityBiggestClient_l: can't get process priority for pid %d", 359231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu callingPid); 360231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu return false; 361231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 362231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu if (!getLowestPriorityPid_l(type, &lowestPriorityPid, &lowestPriority)) { 363231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu return false; 364231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 365231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu if (lowestPriority <= callingPriority) { 366231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu ALOGE("getLowestPriorityBiggestClient_l: lowest priority %d vs caller priority %d", 367231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu lowestPriority, callingPriority); 368231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu return false; 369231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 370231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 371231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu if (!getBiggestClient_l(lowestPriorityPid, type, client)) { 372231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu return false; 373231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 374231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu return true; 375231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu} 376231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 377231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wubool ResourceManagerService::getLowestPriorityPid_l( 378231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu const String8 &type, int *lowestPriorityPid, int *lowestPriority) { 379231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu int pid = -1; 380231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu int priority = -1; 381231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu for (size_t i = 0; i < mMap.size(); ++i) { 382231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu if (mMap.valueAt(i).size() == 0) { 383231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu // no client on this process. 384231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu continue; 385231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 386231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu if (!hasResourceType(type, mMap.valueAt(i))) { 387231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu // doesn't have the requested resource type 388231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu continue; 389231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 390231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu int tempPid = mMap.keyAt(i); 391231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu int tempPriority; 392231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu if (!mProcessInfo->getPriority(tempPid, &tempPriority)) { 393231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu ALOGV("getLowestPriorityPid_l: can't get priority of pid %d, skipped", tempPid); 394231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu // TODO: remove this pid from mMap? 395231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu continue; 396231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 397231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu if (pid == -1 || tempPriority > priority) { 398231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu // initial the value 399231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu pid = tempPid; 400231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu priority = tempPriority; 401231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 402231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 403231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu if (pid != -1) { 404231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu *lowestPriorityPid = pid; 405231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu *lowestPriority = priority; 406231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 407231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu return (pid != -1); 408231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu} 409231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 410231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wubool ResourceManagerService::isCallingPriorityHigher_l(int callingPid, int pid) { 411231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu int callingPidPriority; 412231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu if (!mProcessInfo->getPriority(callingPid, &callingPidPriority)) { 413231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu return false; 414231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 415231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 416231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu int priority; 417231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu if (!mProcessInfo->getPriority(pid, &priority)) { 418231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu return false; 419231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 420231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 421231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu return (callingPidPriority < priority); 422231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu} 423231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 424231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wubool ResourceManagerService::getBiggestClient_l( 425231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu int pid, const String8 &type, sp<IResourceManagerClient> *client) { 426231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu ssize_t index = mMap.indexOfKey(pid); 427231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu if (index < 0) { 428231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu ALOGE("getBiggestClient_l: can't find resource info for pid %d", pid); 429231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu return false; 430231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 431231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 432231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu sp<IResourceManagerClient> clientTemp; 433231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu uint64_t largestValue = 0; 434231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu const ResourceInfos &infos = mMap.valueAt(index); 435231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu for (size_t i = 0; i < infos.size(); ++i) { 436231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu Vector<MediaResource> resources = infos[i].resources; 437231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu for (size_t j = 0; j < resources.size(); ++j) { 438231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu if (resources[j].mType == type) { 439231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu if (resources[j].mValue > largestValue) { 440231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu largestValue = resources[j].mValue; 441231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu clientTemp = infos[i].client; 442231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 443231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 444231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 445231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 446231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 447231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu if (clientTemp == NULL) { 448231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu ALOGE("getBiggestClient_l: can't find resource type %s for pid %d", type.string(), pid); 449231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu return false; 450231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu } 451231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 452231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu *client = clientTemp; 453231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu return true; 454231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu} 455231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu 456231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu} // namespace android 457