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