1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker **
3*ec779b8eSAndroid Build Coastguard Worker ** Copyright 2015, The Android Open Source Project
4*ec779b8eSAndroid Build Coastguard Worker **
5*ec779b8eSAndroid Build Coastguard Worker ** Licensed under the Apache License, Version 2.0 (the "License");
6*ec779b8eSAndroid Build Coastguard Worker ** you may not use this file except in compliance with the License.
7*ec779b8eSAndroid Build Coastguard Worker ** You may obtain a copy of the License at
8*ec779b8eSAndroid Build Coastguard Worker **
9*ec779b8eSAndroid Build Coastguard Worker ** http://www.apache.org/licenses/LICENSE-2.0
10*ec779b8eSAndroid Build Coastguard Worker **
11*ec779b8eSAndroid Build Coastguard Worker ** Unless required by applicable law or agreed to in writing, software
12*ec779b8eSAndroid Build Coastguard Worker ** distributed under the License is distributed on an "AS IS" BASIS,
13*ec779b8eSAndroid Build Coastguard Worker ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*ec779b8eSAndroid Build Coastguard Worker ** See the License for the specific language governing permissions and
15*ec779b8eSAndroid Build Coastguard Worker ** limitations under the License.
16*ec779b8eSAndroid Build Coastguard Worker */
17*ec779b8eSAndroid Build Coastguard Worker
18*ec779b8eSAndroid Build Coastguard Worker //#define LOG_NDEBUG 0
19*ec779b8eSAndroid Build Coastguard Worker #define LOG_TAG "ResourceManagerService"
20*ec779b8eSAndroid Build Coastguard Worker #include <utils/Log.h>
21*ec779b8eSAndroid Build Coastguard Worker
22*ec779b8eSAndroid Build Coastguard Worker #include <android/binder_manager.h>
23*ec779b8eSAndroid Build Coastguard Worker #include <android/binder_process.h>
24*ec779b8eSAndroid Build Coastguard Worker #include <binder/IPCThreadState.h>
25*ec779b8eSAndroid Build Coastguard Worker #include <binder/IServiceManager.h>
26*ec779b8eSAndroid Build Coastguard Worker #include <cutils/sched_policy.h>
27*ec779b8eSAndroid Build Coastguard Worker #include <media/MediaResourcePolicy.h>
28*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/foundation/ABase.h>
29*ec779b8eSAndroid Build Coastguard Worker #include <mediautils/BatteryNotifier.h>
30*ec779b8eSAndroid Build Coastguard Worker #include <mediautils/ProcessInfo.h>
31*ec779b8eSAndroid Build Coastguard Worker #include <mediautils/SchedulingPolicyService.h>
32*ec779b8eSAndroid Build Coastguard Worker #include <com_android_media_codec_flags.h>
33*ec779b8eSAndroid Build Coastguard Worker
34*ec779b8eSAndroid Build Coastguard Worker #include "ResourceManagerMetrics.h"
35*ec779b8eSAndroid Build Coastguard Worker #include "ResourceManagerServiceNew.h"
36*ec779b8eSAndroid Build Coastguard Worker #include "ResourceObserverService.h"
37*ec779b8eSAndroid Build Coastguard Worker #include "ServiceLog.h"
38*ec779b8eSAndroid Build Coastguard Worker
39*ec779b8eSAndroid Build Coastguard Worker namespace CodecFeatureFlags = com::android::media::codec::flags;
40*ec779b8eSAndroid Build Coastguard Worker
41*ec779b8eSAndroid Build Coastguard Worker namespace android {
42*ec779b8eSAndroid Build Coastguard Worker
getResourceDump(std::string & resourceLog) const43*ec779b8eSAndroid Build Coastguard Worker void ResourceManagerService::getResourceDump(std::string& resourceLog) const {
44*ec779b8eSAndroid Build Coastguard Worker PidResourceInfosMap mapCopy;
45*ec779b8eSAndroid Build Coastguard Worker std::map<int, int> overridePidMapCopy;
46*ec779b8eSAndroid Build Coastguard Worker {
47*ec779b8eSAndroid Build Coastguard Worker std::scoped_lock lock{mLock};
48*ec779b8eSAndroid Build Coastguard Worker mapCopy = mMap; // Shadow copy, real copy will happen on write.
49*ec779b8eSAndroid Build Coastguard Worker overridePidMapCopy = mOverridePidMap;
50*ec779b8eSAndroid Build Coastguard Worker }
51*ec779b8eSAndroid Build Coastguard Worker
52*ec779b8eSAndroid Build Coastguard Worker const size_t SIZE = 256;
53*ec779b8eSAndroid Build Coastguard Worker char buffer[SIZE];
54*ec779b8eSAndroid Build Coastguard Worker resourceLog.append(" Processes:\n");
55*ec779b8eSAndroid Build Coastguard Worker for (const auto& [pid, infos] : mapCopy) {
56*ec779b8eSAndroid Build Coastguard Worker snprintf(buffer, SIZE, " Pid: %d\n", pid);
57*ec779b8eSAndroid Build Coastguard Worker resourceLog.append(buffer);
58*ec779b8eSAndroid Build Coastguard Worker int priority = 0;
59*ec779b8eSAndroid Build Coastguard Worker if (getPriority_l(pid, &priority)) {
60*ec779b8eSAndroid Build Coastguard Worker snprintf(buffer, SIZE, " Priority: %d\n", priority);
61*ec779b8eSAndroid Build Coastguard Worker } else {
62*ec779b8eSAndroid Build Coastguard Worker snprintf(buffer, SIZE, " Priority: <unknown>\n");
63*ec779b8eSAndroid Build Coastguard Worker }
64*ec779b8eSAndroid Build Coastguard Worker resourceLog.append(buffer);
65*ec779b8eSAndroid Build Coastguard Worker
66*ec779b8eSAndroid Build Coastguard Worker for (const auto& [infoKey, info] : infos) {
67*ec779b8eSAndroid Build Coastguard Worker resourceLog.append(" Client:\n");
68*ec779b8eSAndroid Build Coastguard Worker snprintf(buffer, SIZE, " Id: %lld\n", (long long)info.clientId);
69*ec779b8eSAndroid Build Coastguard Worker resourceLog.append(buffer);
70*ec779b8eSAndroid Build Coastguard Worker
71*ec779b8eSAndroid Build Coastguard Worker std::string clientName = info.name;
72*ec779b8eSAndroid Build Coastguard Worker snprintf(buffer, SIZE, " Name: %s\n", clientName.c_str());
73*ec779b8eSAndroid Build Coastguard Worker resourceLog.append(buffer);
74*ec779b8eSAndroid Build Coastguard Worker
75*ec779b8eSAndroid Build Coastguard Worker const ResourceList& resources = info.resources;
76*ec779b8eSAndroid Build Coastguard Worker resourceLog.append(" Resources:\n");
77*ec779b8eSAndroid Build Coastguard Worker resourceLog.append(resources.toString());
78*ec779b8eSAndroid Build Coastguard Worker }
79*ec779b8eSAndroid Build Coastguard Worker }
80*ec779b8eSAndroid Build Coastguard Worker
81*ec779b8eSAndroid Build Coastguard Worker resourceLog.append(" Process Pid override:\n");
82*ec779b8eSAndroid Build Coastguard Worker for (auto it = overridePidMapCopy.begin(); it != overridePidMapCopy.end(); ++it) {
83*ec779b8eSAndroid Build Coastguard Worker snprintf(buffer, SIZE, " Original Pid: %d, Override Pid: %d\n",
84*ec779b8eSAndroid Build Coastguard Worker it->first, it->second);
85*ec779b8eSAndroid Build Coastguard Worker resourceLog.append(buffer);
86*ec779b8eSAndroid Build Coastguard Worker }
87*ec779b8eSAndroid Build Coastguard Worker }
88*ec779b8eSAndroid Build Coastguard Worker
dump(int fd,const char **,uint32_t)89*ec779b8eSAndroid Build Coastguard Worker binder_status_t ResourceManagerService::dump(int fd, const char** /*args*/, uint32_t /*numArgs*/) {
90*ec779b8eSAndroid Build Coastguard Worker String8 result;
91*ec779b8eSAndroid Build Coastguard Worker
92*ec779b8eSAndroid Build Coastguard Worker if (checkCallingPermission(String16("android.permission.DUMP")) == false) {
93*ec779b8eSAndroid Build Coastguard Worker result.format("Permission Denial: "
94*ec779b8eSAndroid Build Coastguard Worker "can't dump ResourceManagerService from pid=%d, uid=%d\n",
95*ec779b8eSAndroid Build Coastguard Worker AIBinder_getCallingPid(),
96*ec779b8eSAndroid Build Coastguard Worker AIBinder_getCallingUid());
97*ec779b8eSAndroid Build Coastguard Worker write(fd, result.c_str(), result.size());
98*ec779b8eSAndroid Build Coastguard Worker return PERMISSION_DENIED;
99*ec779b8eSAndroid Build Coastguard Worker }
100*ec779b8eSAndroid Build Coastguard Worker
101*ec779b8eSAndroid Build Coastguard Worker bool supportsMultipleSecureCodecs;
102*ec779b8eSAndroid Build Coastguard Worker bool supportsSecureWithNonSecureCodec;
103*ec779b8eSAndroid Build Coastguard Worker String8 serviceLog;
104*ec779b8eSAndroid Build Coastguard Worker {
105*ec779b8eSAndroid Build Coastguard Worker std::scoped_lock lock{mLock};
106*ec779b8eSAndroid Build Coastguard Worker supportsMultipleSecureCodecs = mSupportsMultipleSecureCodecs;
107*ec779b8eSAndroid Build Coastguard Worker supportsSecureWithNonSecureCodec = mSupportsSecureWithNonSecureCodec;
108*ec779b8eSAndroid Build Coastguard Worker serviceLog = mServiceLog->toString(" " /* linePrefix */);
109*ec779b8eSAndroid Build Coastguard Worker }
110*ec779b8eSAndroid Build Coastguard Worker
111*ec779b8eSAndroid Build Coastguard Worker // Get all the resource (and overload pid) log.
112*ec779b8eSAndroid Build Coastguard Worker std::string resourceLog;
113*ec779b8eSAndroid Build Coastguard Worker getResourceDump(resourceLog);
114*ec779b8eSAndroid Build Coastguard Worker
115*ec779b8eSAndroid Build Coastguard Worker // Get all the metrics log.
116*ec779b8eSAndroid Build Coastguard Worker std::string metricsLog;
117*ec779b8eSAndroid Build Coastguard Worker {
118*ec779b8eSAndroid Build Coastguard Worker std::scoped_lock lock{mLock};
119*ec779b8eSAndroid Build Coastguard Worker metricsLog = mResourceManagerMetrics->dump();
120*ec779b8eSAndroid Build Coastguard Worker }
121*ec779b8eSAndroid Build Coastguard Worker
122*ec779b8eSAndroid Build Coastguard Worker const size_t SIZE = 256;
123*ec779b8eSAndroid Build Coastguard Worker char buffer[SIZE];
124*ec779b8eSAndroid Build Coastguard Worker snprintf(buffer, SIZE, "ResourceManagerService: %p\n", this);
125*ec779b8eSAndroid Build Coastguard Worker result.append(buffer);
126*ec779b8eSAndroid Build Coastguard Worker result.append(" Policies:\n");
127*ec779b8eSAndroid Build Coastguard Worker snprintf(buffer, SIZE, " SupportsMultipleSecureCodecs: %d\n", supportsMultipleSecureCodecs);
128*ec779b8eSAndroid Build Coastguard Worker result.append(buffer);
129*ec779b8eSAndroid Build Coastguard Worker snprintf(buffer, SIZE, " SupportsSecureWithNonSecureCodec: %d\n",
130*ec779b8eSAndroid Build Coastguard Worker supportsSecureWithNonSecureCodec);
131*ec779b8eSAndroid Build Coastguard Worker result.append(buffer);
132*ec779b8eSAndroid Build Coastguard Worker
133*ec779b8eSAndroid Build Coastguard Worker // Add resource log.
134*ec779b8eSAndroid Build Coastguard Worker result.append(resourceLog.c_str());
135*ec779b8eSAndroid Build Coastguard Worker
136*ec779b8eSAndroid Build Coastguard Worker // Add service log.
137*ec779b8eSAndroid Build Coastguard Worker result.append(" Events logs (most recent at top):\n");
138*ec779b8eSAndroid Build Coastguard Worker result.append(serviceLog);
139*ec779b8eSAndroid Build Coastguard Worker
140*ec779b8eSAndroid Build Coastguard Worker // Add metrics log.
141*ec779b8eSAndroid Build Coastguard Worker result.append(metricsLog.c_str());
142*ec779b8eSAndroid Build Coastguard Worker
143*ec779b8eSAndroid Build Coastguard Worker write(fd, result.c_str(), result.size());
144*ec779b8eSAndroid Build Coastguard Worker return OK;
145*ec779b8eSAndroid Build Coastguard Worker }
146*ec779b8eSAndroid Build Coastguard Worker
147*ec779b8eSAndroid Build Coastguard Worker struct SystemCallbackImpl : public ResourceManagerService::SystemCallbackInterface {
SystemCallbackImplandroid::SystemCallbackImpl148*ec779b8eSAndroid Build Coastguard Worker SystemCallbackImpl() : mClientToken(new BBinder()) {}
149*ec779b8eSAndroid Build Coastguard Worker
noteStartVideoandroid::SystemCallbackImpl150*ec779b8eSAndroid Build Coastguard Worker virtual void noteStartVideo(int uid) override {
151*ec779b8eSAndroid Build Coastguard Worker BatteryNotifier::getInstance().noteStartVideo(uid);
152*ec779b8eSAndroid Build Coastguard Worker }
noteStopVideoandroid::SystemCallbackImpl153*ec779b8eSAndroid Build Coastguard Worker virtual void noteStopVideo(int uid) override {
154*ec779b8eSAndroid Build Coastguard Worker BatteryNotifier::getInstance().noteStopVideo(uid);
155*ec779b8eSAndroid Build Coastguard Worker }
noteResetVideoandroid::SystemCallbackImpl156*ec779b8eSAndroid Build Coastguard Worker virtual void noteResetVideo() override {
157*ec779b8eSAndroid Build Coastguard Worker BatteryNotifier::getInstance().noteResetVideo();
158*ec779b8eSAndroid Build Coastguard Worker }
requestCpusetBoostandroid::SystemCallbackImpl159*ec779b8eSAndroid Build Coastguard Worker virtual bool requestCpusetBoost(bool enable) override {
160*ec779b8eSAndroid Build Coastguard Worker return android::requestCpusetBoost(enable, mClientToken);
161*ec779b8eSAndroid Build Coastguard Worker }
162*ec779b8eSAndroid Build Coastguard Worker
163*ec779b8eSAndroid Build Coastguard Worker protected:
~SystemCallbackImplandroid::SystemCallbackImpl164*ec779b8eSAndroid Build Coastguard Worker virtual ~SystemCallbackImpl() {}
165*ec779b8eSAndroid Build Coastguard Worker
166*ec779b8eSAndroid Build Coastguard Worker private:
167*ec779b8eSAndroid Build Coastguard Worker DISALLOW_EVIL_CONSTRUCTORS(SystemCallbackImpl);
168*ec779b8eSAndroid Build Coastguard Worker sp<IBinder> mClientToken;
169*ec779b8eSAndroid Build Coastguard Worker };
170*ec779b8eSAndroid Build Coastguard Worker
ResourceManagerService()171*ec779b8eSAndroid Build Coastguard Worker ResourceManagerService::ResourceManagerService()
172*ec779b8eSAndroid Build Coastguard Worker : ResourceManagerService(new ProcessInfo(), new SystemCallbackImpl()) {}
173*ec779b8eSAndroid Build Coastguard Worker
ResourceManagerService(const sp<ProcessInfoInterface> & processInfo,const sp<SystemCallbackInterface> & systemResource)174*ec779b8eSAndroid Build Coastguard Worker ResourceManagerService::ResourceManagerService(const sp<ProcessInfoInterface> &processInfo,
175*ec779b8eSAndroid Build Coastguard Worker const sp<SystemCallbackInterface> &systemResource)
176*ec779b8eSAndroid Build Coastguard Worker : mProcessInfo(processInfo),
177*ec779b8eSAndroid Build Coastguard Worker mSystemCB(systemResource),
178*ec779b8eSAndroid Build Coastguard Worker mServiceLog(new ServiceLog()),
179*ec779b8eSAndroid Build Coastguard Worker mSupportsMultipleSecureCodecs(true),
180*ec779b8eSAndroid Build Coastguard Worker mSupportsSecureWithNonSecureCodec(true),
181*ec779b8eSAndroid Build Coastguard Worker mCpuBoostCount(0) {
182*ec779b8eSAndroid Build Coastguard Worker mSystemCB->noteResetVideo();
183*ec779b8eSAndroid Build Coastguard Worker // Create ResourceManagerMetrics that handles all the metrics.
184*ec779b8eSAndroid Build Coastguard Worker mResourceManagerMetrics = std::make_unique<ResourceManagerMetrics>(mProcessInfo);
185*ec779b8eSAndroid Build Coastguard Worker }
186*ec779b8eSAndroid Build Coastguard Worker
187*ec779b8eSAndroid Build Coastguard Worker //static
instantiate()188*ec779b8eSAndroid Build Coastguard Worker void ResourceManagerService::instantiate() {
189*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<ResourceManagerService> service = Create();
190*ec779b8eSAndroid Build Coastguard Worker binder_status_t status =
191*ec779b8eSAndroid Build Coastguard Worker AServiceManager_addServiceWithFlags(
192*ec779b8eSAndroid Build Coastguard Worker service->asBinder().get(), getServiceName(),
193*ec779b8eSAndroid Build Coastguard Worker AServiceManager_AddServiceFlag::ADD_SERVICE_ALLOW_ISOLATED);
194*ec779b8eSAndroid Build Coastguard Worker if (status != STATUS_OK) {
195*ec779b8eSAndroid Build Coastguard Worker return;
196*ec779b8eSAndroid Build Coastguard Worker }
197*ec779b8eSAndroid Build Coastguard Worker
198*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<ResourceObserverService> observerService =
199*ec779b8eSAndroid Build Coastguard Worker ResourceObserverService::instantiate();
200*ec779b8eSAndroid Build Coastguard Worker
201*ec779b8eSAndroid Build Coastguard Worker if (observerService != nullptr) {
202*ec779b8eSAndroid Build Coastguard Worker service->setObserverService(observerService);
203*ec779b8eSAndroid Build Coastguard Worker }
204*ec779b8eSAndroid Build Coastguard Worker // TODO: mediaserver main() is already starting the thread pool,
205*ec779b8eSAndroid Build Coastguard Worker // move this to mediaserver main() when other services in mediaserver
206*ec779b8eSAndroid Build Coastguard Worker // are converted to ndk-platform aidl.
207*ec779b8eSAndroid Build Coastguard Worker //ABinderProcess_startThreadPool();
208*ec779b8eSAndroid Build Coastguard Worker }
209*ec779b8eSAndroid Build Coastguard Worker
Create()210*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<ResourceManagerService> ResourceManagerService::Create() {
211*ec779b8eSAndroid Build Coastguard Worker return Create(new ProcessInfo(), new SystemCallbackImpl());
212*ec779b8eSAndroid Build Coastguard Worker }
213*ec779b8eSAndroid Build Coastguard Worker
Create(const sp<ProcessInfoInterface> & processInfo,const sp<SystemCallbackInterface> & systemResource)214*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<ResourceManagerService> ResourceManagerService::Create(
215*ec779b8eSAndroid Build Coastguard Worker const sp<ProcessInfoInterface>& processInfo,
216*ec779b8eSAndroid Build Coastguard Worker const sp<SystemCallbackInterface>& systemResource) {
217*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<ResourceManagerService> service = nullptr;
218*ec779b8eSAndroid Build Coastguard Worker // If codec importance feature is on, create the refactored implementation.
219*ec779b8eSAndroid Build Coastguard Worker if (CodecFeatureFlags::codec_importance()) {
220*ec779b8eSAndroid Build Coastguard Worker service = ::ndk::SharedRefBase::make<ResourceManagerServiceNew>(processInfo,
221*ec779b8eSAndroid Build Coastguard Worker systemResource);
222*ec779b8eSAndroid Build Coastguard Worker } else {
223*ec779b8eSAndroid Build Coastguard Worker service = ::ndk::SharedRefBase::make<ResourceManagerService>(processInfo,
224*ec779b8eSAndroid Build Coastguard Worker systemResource);
225*ec779b8eSAndroid Build Coastguard Worker }
226*ec779b8eSAndroid Build Coastguard Worker
227*ec779b8eSAndroid Build Coastguard Worker if (service != nullptr) {
228*ec779b8eSAndroid Build Coastguard Worker service->init();
229*ec779b8eSAndroid Build Coastguard Worker }
230*ec779b8eSAndroid Build Coastguard Worker
231*ec779b8eSAndroid Build Coastguard Worker return service;
232*ec779b8eSAndroid Build Coastguard Worker }
233*ec779b8eSAndroid Build Coastguard Worker
234*ec779b8eSAndroid Build Coastguard Worker // TEST only function.
CreateNew(const sp<ProcessInfoInterface> & processInfo,const sp<SystemCallbackInterface> & systemResource)235*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<ResourceManagerService> ResourceManagerService::CreateNew(
236*ec779b8eSAndroid Build Coastguard Worker const sp<ProcessInfoInterface>& processInfo,
237*ec779b8eSAndroid Build Coastguard Worker const sp<SystemCallbackInterface>& systemResource) {
238*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<ResourceManagerService> service =
239*ec779b8eSAndroid Build Coastguard Worker ::ndk::SharedRefBase::make<ResourceManagerServiceNew>(processInfo, systemResource);
240*ec779b8eSAndroid Build Coastguard Worker service->init();
241*ec779b8eSAndroid Build Coastguard Worker return service;
242*ec779b8eSAndroid Build Coastguard Worker }
243*ec779b8eSAndroid Build Coastguard Worker
init()244*ec779b8eSAndroid Build Coastguard Worker void ResourceManagerService::init() {}
245*ec779b8eSAndroid Build Coastguard Worker
~ResourceManagerService()246*ec779b8eSAndroid Build Coastguard Worker ResourceManagerService::~ResourceManagerService() {}
247*ec779b8eSAndroid Build Coastguard Worker
setObserverService(const std::shared_ptr<ResourceObserverService> & observerService)248*ec779b8eSAndroid Build Coastguard Worker void ResourceManagerService::setObserverService(
249*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<ResourceObserverService>& observerService) {
250*ec779b8eSAndroid Build Coastguard Worker mObserverService = observerService;
251*ec779b8eSAndroid Build Coastguard Worker }
252*ec779b8eSAndroid Build Coastguard Worker
config(const std::vector<MediaResourcePolicyParcel> & policies)253*ec779b8eSAndroid Build Coastguard Worker Status ResourceManagerService::config(const std::vector<MediaResourcePolicyParcel>& policies) {
254*ec779b8eSAndroid Build Coastguard Worker String8 log = String8::format("config(%s)", getString(policies).c_str());
255*ec779b8eSAndroid Build Coastguard Worker mServiceLog->add(log);
256*ec779b8eSAndroid Build Coastguard Worker
257*ec779b8eSAndroid Build Coastguard Worker std::scoped_lock lock{mLock};
258*ec779b8eSAndroid Build Coastguard Worker for (size_t i = 0; i < policies.size(); ++i) {
259*ec779b8eSAndroid Build Coastguard Worker const std::string &type = policies[i].type;
260*ec779b8eSAndroid Build Coastguard Worker const std::string &value = policies[i].value;
261*ec779b8eSAndroid Build Coastguard Worker if (type == MediaResourcePolicy::kPolicySupportsMultipleSecureCodecs()) {
262*ec779b8eSAndroid Build Coastguard Worker mSupportsMultipleSecureCodecs = (value == "true");
263*ec779b8eSAndroid Build Coastguard Worker } else if (type == MediaResourcePolicy::kPolicySupportsSecureWithNonSecureCodec()) {
264*ec779b8eSAndroid Build Coastguard Worker mSupportsSecureWithNonSecureCodec = (value == "true");
265*ec779b8eSAndroid Build Coastguard Worker }
266*ec779b8eSAndroid Build Coastguard Worker }
267*ec779b8eSAndroid Build Coastguard Worker return Status::ok();
268*ec779b8eSAndroid Build Coastguard Worker }
269*ec779b8eSAndroid Build Coastguard Worker
onFirstAdded(const MediaResourceParcel & resource,uid_t uid)270*ec779b8eSAndroid Build Coastguard Worker void ResourceManagerService::onFirstAdded(const MediaResourceParcel& resource, uid_t uid) {
271*ec779b8eSAndroid Build Coastguard Worker // first time added
272*ec779b8eSAndroid Build Coastguard Worker if (resource.type == MediaResource::Type::kCpuBoost
273*ec779b8eSAndroid Build Coastguard Worker && resource.subType == MediaResource::SubType::kUnspecifiedSubType) {
274*ec779b8eSAndroid Build Coastguard Worker // Request it on every new instance of kCpuBoost, as the media.codec
275*ec779b8eSAndroid Build Coastguard Worker // could have died, if we only do it the first time subsequent instances
276*ec779b8eSAndroid Build Coastguard Worker // never gets the boost.
277*ec779b8eSAndroid Build Coastguard Worker if (mSystemCB->requestCpusetBoost(true) != OK) {
278*ec779b8eSAndroid Build Coastguard Worker ALOGW("couldn't request cpuset boost");
279*ec779b8eSAndroid Build Coastguard Worker }
280*ec779b8eSAndroid Build Coastguard Worker mCpuBoostCount++;
281*ec779b8eSAndroid Build Coastguard Worker } else if (resource.type == MediaResource::Type::kBattery
282*ec779b8eSAndroid Build Coastguard Worker && (resource.subType == MediaResource::SubType::kHwVideoCodec
283*ec779b8eSAndroid Build Coastguard Worker || resource.subType == MediaResource::SubType::kSwVideoCodec)) {
284*ec779b8eSAndroid Build Coastguard Worker mSystemCB->noteStartVideo(uid);
285*ec779b8eSAndroid Build Coastguard Worker }
286*ec779b8eSAndroid Build Coastguard Worker }
287*ec779b8eSAndroid Build Coastguard Worker
onLastRemoved(const MediaResourceParcel & resource,uid_t uid)288*ec779b8eSAndroid Build Coastguard Worker void ResourceManagerService::onLastRemoved(const MediaResourceParcel& resource, uid_t uid) {
289*ec779b8eSAndroid Build Coastguard Worker if (resource.type == MediaResource::Type::kCpuBoost
290*ec779b8eSAndroid Build Coastguard Worker && resource.subType == MediaResource::SubType::kUnspecifiedSubType
291*ec779b8eSAndroid Build Coastguard Worker && mCpuBoostCount > 0) {
292*ec779b8eSAndroid Build Coastguard Worker if (--mCpuBoostCount == 0) {
293*ec779b8eSAndroid Build Coastguard Worker mSystemCB->requestCpusetBoost(false);
294*ec779b8eSAndroid Build Coastguard Worker }
295*ec779b8eSAndroid Build Coastguard Worker } else if (resource.type == MediaResource::Type::kBattery
296*ec779b8eSAndroid Build Coastguard Worker && (resource.subType == MediaResource::SubType::kHwVideoCodec
297*ec779b8eSAndroid Build Coastguard Worker || resource.subType == MediaResource::SubType::kSwVideoCodec)) {
298*ec779b8eSAndroid Build Coastguard Worker mSystemCB->noteStopVideo(uid);
299*ec779b8eSAndroid Build Coastguard Worker }
300*ec779b8eSAndroid Build Coastguard Worker }
301*ec779b8eSAndroid Build Coastguard Worker
addResource(const ClientInfoParcel & clientInfo,const std::shared_ptr<IResourceManagerClient> & client,const std::vector<MediaResourceParcel> & resources)302*ec779b8eSAndroid Build Coastguard Worker Status ResourceManagerService::addResource(const ClientInfoParcel& clientInfo,
303*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<IResourceManagerClient>& client,
304*ec779b8eSAndroid Build Coastguard Worker const std::vector<MediaResourceParcel>& resources) {
305*ec779b8eSAndroid Build Coastguard Worker int32_t pid = clientInfo.pid;
306*ec779b8eSAndroid Build Coastguard Worker int32_t uid = clientInfo.uid;
307*ec779b8eSAndroid Build Coastguard Worker int64_t clientId = clientInfo.id;
308*ec779b8eSAndroid Build Coastguard Worker String8 log = String8::format("addResource(pid %d, uid %d clientId %lld, resources %s)",
309*ec779b8eSAndroid Build Coastguard Worker pid, uid, (long long) clientId, getString(resources).c_str());
310*ec779b8eSAndroid Build Coastguard Worker mServiceLog->add(log);
311*ec779b8eSAndroid Build Coastguard Worker
312*ec779b8eSAndroid Build Coastguard Worker std::scoped_lock lock{mLock};
313*ec779b8eSAndroid Build Coastguard Worker ClientInfoParcel updatedClientInfo = clientInfo;
314*ec779b8eSAndroid Build Coastguard Worker if (!mProcessInfo->isPidUidTrusted(pid, uid)) {
315*ec779b8eSAndroid Build Coastguard Worker pid_t callingPid = IPCThreadState::self()->getCallingPid();
316*ec779b8eSAndroid Build Coastguard Worker uid_t callingUid = IPCThreadState::self()->getCallingUid();
317*ec779b8eSAndroid Build Coastguard Worker ALOGW("%s called with untrusted pid %d or uid %d, using calling pid %d, uid %d",
318*ec779b8eSAndroid Build Coastguard Worker __FUNCTION__, pid, uid, callingPid, callingUid);
319*ec779b8eSAndroid Build Coastguard Worker pid = callingPid;
320*ec779b8eSAndroid Build Coastguard Worker uid = callingUid;
321*ec779b8eSAndroid Build Coastguard Worker updatedClientInfo.pid = callingPid;
322*ec779b8eSAndroid Build Coastguard Worker updatedClientInfo.uid = callingUid;
323*ec779b8eSAndroid Build Coastguard Worker }
324*ec779b8eSAndroid Build Coastguard Worker ResourceInfos& infos = getResourceInfosForEdit(pid, mMap);
325*ec779b8eSAndroid Build Coastguard Worker ResourceInfo& info = getResourceInfoForEdit(clientInfo, client, infos);
326*ec779b8eSAndroid Build Coastguard Worker ResourceList resourceAdded;
327*ec779b8eSAndroid Build Coastguard Worker
328*ec779b8eSAndroid Build Coastguard Worker for (size_t i = 0; i < resources.size(); ++i) {
329*ec779b8eSAndroid Build Coastguard Worker const auto &res = resources[i];
330*ec779b8eSAndroid Build Coastguard Worker
331*ec779b8eSAndroid Build Coastguard Worker if (res.value < 0 && res.type != MediaResource::Type::kDrmSession) {
332*ec779b8eSAndroid Build Coastguard Worker ALOGW("Ignoring request to remove negative value of non-drm resource");
333*ec779b8eSAndroid Build Coastguard Worker continue;
334*ec779b8eSAndroid Build Coastguard Worker }
335*ec779b8eSAndroid Build Coastguard Worker bool isNewEntry = false;
336*ec779b8eSAndroid Build Coastguard Worker if (!info.resources.add(res, &isNewEntry)) {
337*ec779b8eSAndroid Build Coastguard Worker continue;
338*ec779b8eSAndroid Build Coastguard Worker }
339*ec779b8eSAndroid Build Coastguard Worker if (isNewEntry) {
340*ec779b8eSAndroid Build Coastguard Worker onFirstAdded(res, info.uid);
341*ec779b8eSAndroid Build Coastguard Worker }
342*ec779b8eSAndroid Build Coastguard Worker
343*ec779b8eSAndroid Build Coastguard Worker // Add it to the list of added resources for observers.
344*ec779b8eSAndroid Build Coastguard Worker resourceAdded.add(res);
345*ec779b8eSAndroid Build Coastguard Worker }
346*ec779b8eSAndroid Build Coastguard Worker if (info.deathNotifier == nullptr && client != nullptr) {
347*ec779b8eSAndroid Build Coastguard Worker info.deathNotifier = DeathNotifier::Create(
348*ec779b8eSAndroid Build Coastguard Worker client, ref<ResourceManagerService>(), updatedClientInfo);
349*ec779b8eSAndroid Build Coastguard Worker }
350*ec779b8eSAndroid Build Coastguard Worker if (mObserverService != nullptr && !resourceAdded.empty()) {
351*ec779b8eSAndroid Build Coastguard Worker mObserverService->onResourceAdded(uid, pid, resourceAdded);
352*ec779b8eSAndroid Build Coastguard Worker }
353*ec779b8eSAndroid Build Coastguard Worker notifyResourceGranted(pid, resources);
354*ec779b8eSAndroid Build Coastguard Worker
355*ec779b8eSAndroid Build Coastguard Worker return Status::ok();
356*ec779b8eSAndroid Build Coastguard Worker }
357*ec779b8eSAndroid Build Coastguard Worker
removeResource(const ClientInfoParcel & clientInfo,const std::vector<MediaResourceParcel> & resources)358*ec779b8eSAndroid Build Coastguard Worker Status ResourceManagerService::removeResource(const ClientInfoParcel& clientInfo,
359*ec779b8eSAndroid Build Coastguard Worker const std::vector<MediaResourceParcel>& resources) {
360*ec779b8eSAndroid Build Coastguard Worker int32_t pid = clientInfo.pid;
361*ec779b8eSAndroid Build Coastguard Worker int32_t uid = clientInfo.uid;
362*ec779b8eSAndroid Build Coastguard Worker int64_t clientId = clientInfo.id;
363*ec779b8eSAndroid Build Coastguard Worker String8 log = String8::format("removeResource(pid %d, uid %d clientId %lld, resources %s)",
364*ec779b8eSAndroid Build Coastguard Worker pid, uid, (long long) clientId, getString(resources).c_str());
365*ec779b8eSAndroid Build Coastguard Worker mServiceLog->add(log);
366*ec779b8eSAndroid Build Coastguard Worker
367*ec779b8eSAndroid Build Coastguard Worker std::scoped_lock lock{mLock};
368*ec779b8eSAndroid Build Coastguard Worker if (!mProcessInfo->isPidTrusted(pid)) {
369*ec779b8eSAndroid Build Coastguard Worker pid_t callingPid = IPCThreadState::self()->getCallingPid();
370*ec779b8eSAndroid Build Coastguard Worker ALOGW("%s called with untrusted pid %d, using calling pid %d", __FUNCTION__,
371*ec779b8eSAndroid Build Coastguard Worker pid, callingPid);
372*ec779b8eSAndroid Build Coastguard Worker pid = callingPid;
373*ec779b8eSAndroid Build Coastguard Worker }
374*ec779b8eSAndroid Build Coastguard Worker PidResourceInfosMap::iterator found = mMap.find(pid);
375*ec779b8eSAndroid Build Coastguard Worker if (found == mMap.end()) {
376*ec779b8eSAndroid Build Coastguard Worker ALOGV("removeResource: didn't find pid %d for clientId %lld", pid, (long long) clientId);
377*ec779b8eSAndroid Build Coastguard Worker return Status::ok();
378*ec779b8eSAndroid Build Coastguard Worker }
379*ec779b8eSAndroid Build Coastguard Worker ResourceInfos& infos = found->second;
380*ec779b8eSAndroid Build Coastguard Worker
381*ec779b8eSAndroid Build Coastguard Worker ResourceInfos::iterator foundClient = infos.find(clientId);
382*ec779b8eSAndroid Build Coastguard Worker if (foundClient == infos.end()) {
383*ec779b8eSAndroid Build Coastguard Worker ALOGV("removeResource: didn't find clientId %lld", (long long) clientId);
384*ec779b8eSAndroid Build Coastguard Worker return Status::ok();
385*ec779b8eSAndroid Build Coastguard Worker }
386*ec779b8eSAndroid Build Coastguard Worker
387*ec779b8eSAndroid Build Coastguard Worker ResourceInfo& info = foundClient->second;
388*ec779b8eSAndroid Build Coastguard Worker ResourceList resourceRemoved;
389*ec779b8eSAndroid Build Coastguard Worker for (size_t i = 0; i < resources.size(); ++i) {
390*ec779b8eSAndroid Build Coastguard Worker const auto &res = resources[i];
391*ec779b8eSAndroid Build Coastguard Worker
392*ec779b8eSAndroid Build Coastguard Worker if (res.value < 0) {
393*ec779b8eSAndroid Build Coastguard Worker ALOGW("Ignoring request to remove negative value of resource");
394*ec779b8eSAndroid Build Coastguard Worker continue;
395*ec779b8eSAndroid Build Coastguard Worker }
396*ec779b8eSAndroid Build Coastguard Worker
397*ec779b8eSAndroid Build Coastguard Worker long removedEntryValue = -1;
398*ec779b8eSAndroid Build Coastguard Worker if (info.resources.remove(res, &removedEntryValue)) {
399*ec779b8eSAndroid Build Coastguard Worker MediaResourceParcel actualRemoved = res;
400*ec779b8eSAndroid Build Coastguard Worker if (removedEntryValue != -1) {
401*ec779b8eSAndroid Build Coastguard Worker onLastRemoved(res, info.uid);
402*ec779b8eSAndroid Build Coastguard Worker actualRemoved.value = removedEntryValue;
403*ec779b8eSAndroid Build Coastguard Worker }
404*ec779b8eSAndroid Build Coastguard Worker
405*ec779b8eSAndroid Build Coastguard Worker // Add it to the list of removed resources for observers.
406*ec779b8eSAndroid Build Coastguard Worker resourceRemoved.add(actualRemoved);
407*ec779b8eSAndroid Build Coastguard Worker }
408*ec779b8eSAndroid Build Coastguard Worker }
409*ec779b8eSAndroid Build Coastguard Worker if (mObserverService != nullptr && !resourceRemoved.empty()) {
410*ec779b8eSAndroid Build Coastguard Worker mObserverService->onResourceRemoved(info.uid, pid, resourceRemoved);
411*ec779b8eSAndroid Build Coastguard Worker }
412*ec779b8eSAndroid Build Coastguard Worker return Status::ok();
413*ec779b8eSAndroid Build Coastguard Worker }
414*ec779b8eSAndroid Build Coastguard Worker
removeClient(const ClientInfoParcel & clientInfo)415*ec779b8eSAndroid Build Coastguard Worker Status ResourceManagerService::removeClient(const ClientInfoParcel& clientInfo) {
416*ec779b8eSAndroid Build Coastguard Worker removeResource(clientInfo, true /*checkValid*/);
417*ec779b8eSAndroid Build Coastguard Worker return Status::ok();
418*ec779b8eSAndroid Build Coastguard Worker }
419*ec779b8eSAndroid Build Coastguard Worker
removeResource(const ClientInfoParcel & clientInfo,bool checkValid)420*ec779b8eSAndroid Build Coastguard Worker Status ResourceManagerService::removeResource(const ClientInfoParcel& clientInfo, bool checkValid) {
421*ec779b8eSAndroid Build Coastguard Worker int32_t pid = clientInfo.pid;
422*ec779b8eSAndroid Build Coastguard Worker int32_t uid = clientInfo.uid;
423*ec779b8eSAndroid Build Coastguard Worker int64_t clientId = clientInfo.id;
424*ec779b8eSAndroid Build Coastguard Worker String8 log = String8::format("removeResource(pid %d, uid %d clientId %lld)",
425*ec779b8eSAndroid Build Coastguard Worker pid, uid, (long long) clientId);
426*ec779b8eSAndroid Build Coastguard Worker mServiceLog->add(log);
427*ec779b8eSAndroid Build Coastguard Worker
428*ec779b8eSAndroid Build Coastguard Worker std::scoped_lock lock{mLock};
429*ec779b8eSAndroid Build Coastguard Worker if (checkValid && !mProcessInfo->isPidTrusted(pid)) {
430*ec779b8eSAndroid Build Coastguard Worker pid_t callingPid = IPCThreadState::self()->getCallingPid();
431*ec779b8eSAndroid Build Coastguard Worker ALOGW("%s called with untrusted pid %d, using calling pid %d", __FUNCTION__,
432*ec779b8eSAndroid Build Coastguard Worker pid, callingPid);
433*ec779b8eSAndroid Build Coastguard Worker pid = callingPid;
434*ec779b8eSAndroid Build Coastguard Worker }
435*ec779b8eSAndroid Build Coastguard Worker PidResourceInfosMap::iterator found = mMap.find(pid);
436*ec779b8eSAndroid Build Coastguard Worker if (found == mMap.end()) {
437*ec779b8eSAndroid Build Coastguard Worker ALOGV("removeResource: didn't find pid %d for clientId %lld", pid, (long long) clientId);
438*ec779b8eSAndroid Build Coastguard Worker return Status::ok();
439*ec779b8eSAndroid Build Coastguard Worker }
440*ec779b8eSAndroid Build Coastguard Worker ResourceInfos& infos = found->second;
441*ec779b8eSAndroid Build Coastguard Worker
442*ec779b8eSAndroid Build Coastguard Worker ResourceInfos::iterator foundClient = infos.find(clientId);
443*ec779b8eSAndroid Build Coastguard Worker if (foundClient == infos.end()) {
444*ec779b8eSAndroid Build Coastguard Worker ALOGV("removeResource: didn't find clientId %lld", (long long) clientId);
445*ec779b8eSAndroid Build Coastguard Worker return Status::ok();
446*ec779b8eSAndroid Build Coastguard Worker }
447*ec779b8eSAndroid Build Coastguard Worker
448*ec779b8eSAndroid Build Coastguard Worker const ResourceInfo& info = foundClient->second;
449*ec779b8eSAndroid Build Coastguard Worker for (const MediaResourceParcel& res : info.resources.getResources()) {
450*ec779b8eSAndroid Build Coastguard Worker onLastRemoved(res, info.uid);
451*ec779b8eSAndroid Build Coastguard Worker }
452*ec779b8eSAndroid Build Coastguard Worker
453*ec779b8eSAndroid Build Coastguard Worker // Since this client has been removed, update the metrics collector.
454*ec779b8eSAndroid Build Coastguard Worker mResourceManagerMetrics->notifyClientReleased(clientInfo);
455*ec779b8eSAndroid Build Coastguard Worker
456*ec779b8eSAndroid Build Coastguard Worker if (mObserverService != nullptr && !info.resources.empty()) {
457*ec779b8eSAndroid Build Coastguard Worker mObserverService->onResourceRemoved(info.uid, pid, info.resources);
458*ec779b8eSAndroid Build Coastguard Worker }
459*ec779b8eSAndroid Build Coastguard Worker
460*ec779b8eSAndroid Build Coastguard Worker infos.erase(foundClient);
461*ec779b8eSAndroid Build Coastguard Worker return Status::ok();
462*ec779b8eSAndroid Build Coastguard Worker }
463*ec779b8eSAndroid Build Coastguard Worker
getClientForResource_l(const ResourceRequestInfo & resourceRequestInfo,std::vector<ClientInfo> & clientsInfo)464*ec779b8eSAndroid Build Coastguard Worker void ResourceManagerService::getClientForResource_l(
465*ec779b8eSAndroid Build Coastguard Worker const ResourceRequestInfo& resourceRequestInfo,
466*ec779b8eSAndroid Build Coastguard Worker std::vector<ClientInfo>& clientsInfo) {
467*ec779b8eSAndroid Build Coastguard Worker int callingPid = resourceRequestInfo.mCallingPid;
468*ec779b8eSAndroid Build Coastguard Worker const MediaResourceParcel* res = resourceRequestInfo.mResource;
469*ec779b8eSAndroid Build Coastguard Worker if (res == NULL) {
470*ec779b8eSAndroid Build Coastguard Worker return;
471*ec779b8eSAndroid Build Coastguard Worker }
472*ec779b8eSAndroid Build Coastguard Worker
473*ec779b8eSAndroid Build Coastguard Worker // Before looking into other processes, check if we have clients marked for
474*ec779b8eSAndroid Build Coastguard Worker // pending removal in the same process.
475*ec779b8eSAndroid Build Coastguard Worker ClientInfo clientInfo;
476*ec779b8eSAndroid Build Coastguard Worker if (getBiggestClientPendingRemoval_l(callingPid, res->type, res->subType, clientInfo)) {
477*ec779b8eSAndroid Build Coastguard Worker clientsInfo.emplace_back(clientInfo);
478*ec779b8eSAndroid Build Coastguard Worker return;
479*ec779b8eSAndroid Build Coastguard Worker }
480*ec779b8eSAndroid Build Coastguard Worker
481*ec779b8eSAndroid Build Coastguard Worker // Now find client(s) from a lowest priority process that has needed resources.
482*ec779b8eSAndroid Build Coastguard Worker if (getLowestPriorityBiggestClient_l(resourceRequestInfo, clientInfo)) {
483*ec779b8eSAndroid Build Coastguard Worker clientsInfo.push_back(clientInfo);
484*ec779b8eSAndroid Build Coastguard Worker }
485*ec779b8eSAndroid Build Coastguard Worker }
486*ec779b8eSAndroid Build Coastguard Worker
getTargetClients(const ClientInfoParcel & clientInfo,const std::vector<MediaResourceParcel> & resources,std::vector<ClientInfo> & targetClients)487*ec779b8eSAndroid Build Coastguard Worker bool ResourceManagerService::getTargetClients(
488*ec779b8eSAndroid Build Coastguard Worker const ClientInfoParcel& clientInfo,
489*ec779b8eSAndroid Build Coastguard Worker const std::vector<MediaResourceParcel>& resources,
490*ec779b8eSAndroid Build Coastguard Worker std::vector<ClientInfo>& targetClients) {
491*ec779b8eSAndroid Build Coastguard Worker int32_t callingPid = clientInfo.pid;
492*ec779b8eSAndroid Build Coastguard Worker int64_t clientId = clientInfo.id;
493*ec779b8eSAndroid Build Coastguard Worker std::scoped_lock lock{mLock};
494*ec779b8eSAndroid Build Coastguard Worker if (!mProcessInfo->isPidTrusted(callingPid)) {
495*ec779b8eSAndroid Build Coastguard Worker pid_t actualCallingPid = IPCThreadState::self()->getCallingPid();
496*ec779b8eSAndroid Build Coastguard Worker ALOGW("%s called with untrusted pid %d, using actual calling pid %d", __FUNCTION__,
497*ec779b8eSAndroid Build Coastguard Worker callingPid, actualCallingPid);
498*ec779b8eSAndroid Build Coastguard Worker callingPid = actualCallingPid;
499*ec779b8eSAndroid Build Coastguard Worker }
500*ec779b8eSAndroid Build Coastguard Worker const MediaResourceParcel *secureCodec = NULL;
501*ec779b8eSAndroid Build Coastguard Worker const MediaResourceParcel *nonSecureCodec = NULL;
502*ec779b8eSAndroid Build Coastguard Worker const MediaResourceParcel *graphicMemory = NULL;
503*ec779b8eSAndroid Build Coastguard Worker const MediaResourceParcel *drmSession = NULL;
504*ec779b8eSAndroid Build Coastguard Worker for (size_t i = 0; i < resources.size(); ++i) {
505*ec779b8eSAndroid Build Coastguard Worker switch (resources[i].type) {
506*ec779b8eSAndroid Build Coastguard Worker case MediaResource::Type::kSecureCodec:
507*ec779b8eSAndroid Build Coastguard Worker secureCodec = &resources[i];
508*ec779b8eSAndroid Build Coastguard Worker break;
509*ec779b8eSAndroid Build Coastguard Worker case MediaResource::Type::kNonSecureCodec:
510*ec779b8eSAndroid Build Coastguard Worker nonSecureCodec = &resources[i];
511*ec779b8eSAndroid Build Coastguard Worker break;
512*ec779b8eSAndroid Build Coastguard Worker case MediaResource::Type::kGraphicMemory:
513*ec779b8eSAndroid Build Coastguard Worker graphicMemory = &resources[i];
514*ec779b8eSAndroid Build Coastguard Worker break;
515*ec779b8eSAndroid Build Coastguard Worker case MediaResource::Type::kDrmSession:
516*ec779b8eSAndroid Build Coastguard Worker drmSession = &resources[i];
517*ec779b8eSAndroid Build Coastguard Worker break;
518*ec779b8eSAndroid Build Coastguard Worker default:
519*ec779b8eSAndroid Build Coastguard Worker break;
520*ec779b8eSAndroid Build Coastguard Worker }
521*ec779b8eSAndroid Build Coastguard Worker }
522*ec779b8eSAndroid Build Coastguard Worker
523*ec779b8eSAndroid Build Coastguard Worker // first pass to handle secure/non-secure codec conflict
524*ec779b8eSAndroid Build Coastguard Worker if (secureCodec != NULL) {
525*ec779b8eSAndroid Build Coastguard Worker MediaResourceParcel mediaResource{.type = MediaResource::Type::kSecureCodec,
526*ec779b8eSAndroid Build Coastguard Worker .subType = secureCodec->subType};
527*ec779b8eSAndroid Build Coastguard Worker ResourceRequestInfo resourceRequestInfo{callingPid, clientId, &mediaResource};
528*ec779b8eSAndroid Build Coastguard Worker if (!mSupportsMultipleSecureCodecs) {
529*ec779b8eSAndroid Build Coastguard Worker if (!getAllClients_l(resourceRequestInfo, targetClients)) {
530*ec779b8eSAndroid Build Coastguard Worker return false;
531*ec779b8eSAndroid Build Coastguard Worker }
532*ec779b8eSAndroid Build Coastguard Worker }
533*ec779b8eSAndroid Build Coastguard Worker if (!mSupportsSecureWithNonSecureCodec) {
534*ec779b8eSAndroid Build Coastguard Worker mediaResource.type = MediaResource::Type::kNonSecureCodec;
535*ec779b8eSAndroid Build Coastguard Worker if (!getAllClients_l(resourceRequestInfo, targetClients)) {
536*ec779b8eSAndroid Build Coastguard Worker return false;
537*ec779b8eSAndroid Build Coastguard Worker }
538*ec779b8eSAndroid Build Coastguard Worker }
539*ec779b8eSAndroid Build Coastguard Worker }
540*ec779b8eSAndroid Build Coastguard Worker if (nonSecureCodec != NULL) {
541*ec779b8eSAndroid Build Coastguard Worker if (!mSupportsSecureWithNonSecureCodec) {
542*ec779b8eSAndroid Build Coastguard Worker MediaResourceParcel mediaResource{.type = MediaResource::Type::kSecureCodec,
543*ec779b8eSAndroid Build Coastguard Worker .subType = nonSecureCodec->subType};
544*ec779b8eSAndroid Build Coastguard Worker ResourceRequestInfo resourceRequestInfo{callingPid, clientId, &mediaResource};
545*ec779b8eSAndroid Build Coastguard Worker if (!getAllClients_l(resourceRequestInfo, targetClients)) {
546*ec779b8eSAndroid Build Coastguard Worker return false;
547*ec779b8eSAndroid Build Coastguard Worker }
548*ec779b8eSAndroid Build Coastguard Worker }
549*ec779b8eSAndroid Build Coastguard Worker }
550*ec779b8eSAndroid Build Coastguard Worker
551*ec779b8eSAndroid Build Coastguard Worker if (drmSession != NULL) {
552*ec779b8eSAndroid Build Coastguard Worker ResourceRequestInfo resourceRequestInfo{callingPid, clientId, drmSession};
553*ec779b8eSAndroid Build Coastguard Worker getClientForResource_l(resourceRequestInfo, targetClients);
554*ec779b8eSAndroid Build Coastguard Worker if (targetClients.size() == 0) {
555*ec779b8eSAndroid Build Coastguard Worker return false;
556*ec779b8eSAndroid Build Coastguard Worker }
557*ec779b8eSAndroid Build Coastguard Worker }
558*ec779b8eSAndroid Build Coastguard Worker
559*ec779b8eSAndroid Build Coastguard Worker if (targetClients.size() == 0 && graphicMemory != nullptr) {
560*ec779b8eSAndroid Build Coastguard Worker // if no secure/non-secure codec conflict, run second pass to handle other resources.
561*ec779b8eSAndroid Build Coastguard Worker ResourceRequestInfo resourceRequestInfo{callingPid, clientId, graphicMemory};
562*ec779b8eSAndroid Build Coastguard Worker getClientForResource_l(resourceRequestInfo, targetClients);
563*ec779b8eSAndroid Build Coastguard Worker }
564*ec779b8eSAndroid Build Coastguard Worker
565*ec779b8eSAndroid Build Coastguard Worker if (targetClients.size() == 0) {
566*ec779b8eSAndroid Build Coastguard Worker // if we are here, run the third pass to free one codec with the same type.
567*ec779b8eSAndroid Build Coastguard Worker if (secureCodec != nullptr) {
568*ec779b8eSAndroid Build Coastguard Worker ResourceRequestInfo resourceRequestInfo{callingPid, clientId, secureCodec};
569*ec779b8eSAndroid Build Coastguard Worker getClientForResource_l(resourceRequestInfo, targetClients);
570*ec779b8eSAndroid Build Coastguard Worker }
571*ec779b8eSAndroid Build Coastguard Worker if (nonSecureCodec != nullptr) {
572*ec779b8eSAndroid Build Coastguard Worker ResourceRequestInfo resourceRequestInfo{callingPid, clientId, nonSecureCodec};
573*ec779b8eSAndroid Build Coastguard Worker getClientForResource_l(resourceRequestInfo, targetClients);
574*ec779b8eSAndroid Build Coastguard Worker }
575*ec779b8eSAndroid Build Coastguard Worker }
576*ec779b8eSAndroid Build Coastguard Worker
577*ec779b8eSAndroid Build Coastguard Worker if (targetClients.size() == 0) {
578*ec779b8eSAndroid Build Coastguard Worker // if we are here, run the fourth pass to free one codec with the different type.
579*ec779b8eSAndroid Build Coastguard Worker if (secureCodec != nullptr) {
580*ec779b8eSAndroid Build Coastguard Worker MediaResource temp(MediaResource::Type::kNonSecureCodec, secureCodec->subType, 1);
581*ec779b8eSAndroid Build Coastguard Worker ResourceRequestInfo resourceRequestInfo{callingPid, clientId, &temp};
582*ec779b8eSAndroid Build Coastguard Worker getClientForResource_l(resourceRequestInfo, targetClients);
583*ec779b8eSAndroid Build Coastguard Worker }
584*ec779b8eSAndroid Build Coastguard Worker if (nonSecureCodec != nullptr) {
585*ec779b8eSAndroid Build Coastguard Worker MediaResource temp(MediaResource::Type::kSecureCodec, nonSecureCodec->subType, 1);
586*ec779b8eSAndroid Build Coastguard Worker ResourceRequestInfo resourceRequestInfo{callingPid, clientId, &temp};
587*ec779b8eSAndroid Build Coastguard Worker getClientForResource_l(resourceRequestInfo, targetClients);
588*ec779b8eSAndroid Build Coastguard Worker }
589*ec779b8eSAndroid Build Coastguard Worker }
590*ec779b8eSAndroid Build Coastguard Worker
591*ec779b8eSAndroid Build Coastguard Worker return !targetClients.empty();
592*ec779b8eSAndroid Build Coastguard Worker }
593*ec779b8eSAndroid Build Coastguard Worker
reclaimResource(const ClientInfoParcel & clientInfo,const std::vector<MediaResourceParcel> & resources,bool * _aidl_return)594*ec779b8eSAndroid Build Coastguard Worker Status ResourceManagerService::reclaimResource(const ClientInfoParcel& clientInfo,
595*ec779b8eSAndroid Build Coastguard Worker const std::vector<MediaResourceParcel>& resources, bool* _aidl_return) {
596*ec779b8eSAndroid Build Coastguard Worker std::string clientName = clientInfo.name;
597*ec779b8eSAndroid Build Coastguard Worker String8 log = String8::format("reclaimResource(callingPid %d, uid %d resources %s)",
598*ec779b8eSAndroid Build Coastguard Worker clientInfo.pid, clientInfo.uid, getString(resources).c_str());
599*ec779b8eSAndroid Build Coastguard Worker mServiceLog->add(log);
600*ec779b8eSAndroid Build Coastguard Worker *_aidl_return = false;
601*ec779b8eSAndroid Build Coastguard Worker
602*ec779b8eSAndroid Build Coastguard Worker // Check if there are any resources to be reclaimed before processing.
603*ec779b8eSAndroid Build Coastguard Worker if (resources.empty()) {
604*ec779b8eSAndroid Build Coastguard Worker // Invalid reclaim request. So no need to log.
605*ec779b8eSAndroid Build Coastguard Worker return Status::ok();
606*ec779b8eSAndroid Build Coastguard Worker }
607*ec779b8eSAndroid Build Coastguard Worker
608*ec779b8eSAndroid Build Coastguard Worker std::vector<ClientInfo> targetClients;
609*ec779b8eSAndroid Build Coastguard Worker if (getTargetClients(clientInfo, resources, targetClients)) {
610*ec779b8eSAndroid Build Coastguard Worker // Reclaim all the target clients.
611*ec779b8eSAndroid Build Coastguard Worker *_aidl_return = reclaimUnconditionallyFrom(targetClients);
612*ec779b8eSAndroid Build Coastguard Worker } else {
613*ec779b8eSAndroid Build Coastguard Worker // No clients to reclaim from.
614*ec779b8eSAndroid Build Coastguard Worker ALOGI("%s: There aren't any clients to reclaim from", __func__);
615*ec779b8eSAndroid Build Coastguard Worker // We need to log this failed reclaim as "no clients to reclaim from".
616*ec779b8eSAndroid Build Coastguard Worker targetClients.clear();
617*ec779b8eSAndroid Build Coastguard Worker }
618*ec779b8eSAndroid Build Coastguard Worker
619*ec779b8eSAndroid Build Coastguard Worker // Log Reclaim Pushed Atom to statsd
620*ec779b8eSAndroid Build Coastguard Worker pushReclaimAtom(clientInfo, targetClients, *_aidl_return);
621*ec779b8eSAndroid Build Coastguard Worker
622*ec779b8eSAndroid Build Coastguard Worker return Status::ok();
623*ec779b8eSAndroid Build Coastguard Worker }
624*ec779b8eSAndroid Build Coastguard Worker
pushReclaimAtom(const ClientInfoParcel & clientInfo,const std::vector<ClientInfo> & targetClients,bool reclaimed)625*ec779b8eSAndroid Build Coastguard Worker void ResourceManagerService::pushReclaimAtom(const ClientInfoParcel& clientInfo,
626*ec779b8eSAndroid Build Coastguard Worker const std::vector<ClientInfo>& targetClients,
627*ec779b8eSAndroid Build Coastguard Worker bool reclaimed) {
628*ec779b8eSAndroid Build Coastguard Worker int32_t callingPid = clientInfo.pid;
629*ec779b8eSAndroid Build Coastguard Worker int requesterPriority = -1;
630*ec779b8eSAndroid Build Coastguard Worker getPriority_l(callingPid, &requesterPriority);
631*ec779b8eSAndroid Build Coastguard Worker std::vector<int> priorities;
632*ec779b8eSAndroid Build Coastguard Worker priorities.push_back(requesterPriority);
633*ec779b8eSAndroid Build Coastguard Worker
634*ec779b8eSAndroid Build Coastguard Worker for (const ClientInfo& targetClient : targetClients) {
635*ec779b8eSAndroid Build Coastguard Worker int targetPriority = -1;
636*ec779b8eSAndroid Build Coastguard Worker getPriority_l(targetClient.mPid, &targetPriority);
637*ec779b8eSAndroid Build Coastguard Worker priorities.push_back(targetPriority);
638*ec779b8eSAndroid Build Coastguard Worker }
639*ec779b8eSAndroid Build Coastguard Worker mResourceManagerMetrics->pushReclaimAtom(clientInfo, priorities, targetClients, reclaimed);
640*ec779b8eSAndroid Build Coastguard Worker }
641*ec779b8eSAndroid Build Coastguard Worker
getClient_l(int pid,const int64_t & clientId) const642*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<IResourceManagerClient> ResourceManagerService::getClient_l(
643*ec779b8eSAndroid Build Coastguard Worker int pid, const int64_t& clientId) const {
644*ec779b8eSAndroid Build Coastguard Worker std::map<int, ResourceInfos>::const_iterator found = mMap.find(pid);
645*ec779b8eSAndroid Build Coastguard Worker if (found == mMap.end()) {
646*ec779b8eSAndroid Build Coastguard Worker ALOGV("%s: didn't find pid %d for clientId %lld", __func__, pid, (long long) clientId);
647*ec779b8eSAndroid Build Coastguard Worker return nullptr;
648*ec779b8eSAndroid Build Coastguard Worker }
649*ec779b8eSAndroid Build Coastguard Worker
650*ec779b8eSAndroid Build Coastguard Worker const ResourceInfos& infos = found->second;
651*ec779b8eSAndroid Build Coastguard Worker ResourceInfos::const_iterator foundClient = infos.find(clientId);
652*ec779b8eSAndroid Build Coastguard Worker if (foundClient == infos.end()) {
653*ec779b8eSAndroid Build Coastguard Worker ALOGV("%s: didn't find clientId %lld", __func__, (long long) clientId);
654*ec779b8eSAndroid Build Coastguard Worker return nullptr;
655*ec779b8eSAndroid Build Coastguard Worker }
656*ec779b8eSAndroid Build Coastguard Worker
657*ec779b8eSAndroid Build Coastguard Worker return foundClient->second.client;
658*ec779b8eSAndroid Build Coastguard Worker }
659*ec779b8eSAndroid Build Coastguard Worker
removeClient_l(int pid,const int64_t & clientId)660*ec779b8eSAndroid Build Coastguard Worker bool ResourceManagerService::removeClient_l(int pid, const int64_t& clientId) {
661*ec779b8eSAndroid Build Coastguard Worker std::map<int, ResourceInfos>::iterator found = mMap.find(pid);
662*ec779b8eSAndroid Build Coastguard Worker if (found == mMap.end()) {
663*ec779b8eSAndroid Build Coastguard Worker ALOGV("%s: didn't find pid %d for clientId %lld", __func__, pid, (long long) clientId);
664*ec779b8eSAndroid Build Coastguard Worker return false;
665*ec779b8eSAndroid Build Coastguard Worker }
666*ec779b8eSAndroid Build Coastguard Worker
667*ec779b8eSAndroid Build Coastguard Worker ResourceInfos& infos = found->second;
668*ec779b8eSAndroid Build Coastguard Worker ResourceInfos::iterator foundClient = infos.find(clientId);
669*ec779b8eSAndroid Build Coastguard Worker if (foundClient == infos.end()) {
670*ec779b8eSAndroid Build Coastguard Worker ALOGV("%s: didn't find clientId %lld", __func__, (long long) clientId);
671*ec779b8eSAndroid Build Coastguard Worker return false;
672*ec779b8eSAndroid Build Coastguard Worker }
673*ec779b8eSAndroid Build Coastguard Worker
674*ec779b8eSAndroid Build Coastguard Worker infos.erase(foundClient);
675*ec779b8eSAndroid Build Coastguard Worker return true;
676*ec779b8eSAndroid Build Coastguard Worker }
677*ec779b8eSAndroid Build Coastguard Worker
reclaimUnconditionallyFrom(const std::vector<ClientInfo> & targetClients)678*ec779b8eSAndroid Build Coastguard Worker bool ResourceManagerService::reclaimUnconditionallyFrom(
679*ec779b8eSAndroid Build Coastguard Worker const std::vector<ClientInfo>& targetClients) {
680*ec779b8eSAndroid Build Coastguard Worker if (targetClients.size() == 0) {
681*ec779b8eSAndroid Build Coastguard Worker return false;
682*ec779b8eSAndroid Build Coastguard Worker }
683*ec779b8eSAndroid Build Coastguard Worker
684*ec779b8eSAndroid Build Coastguard Worker int64_t failedClientId = -1;
685*ec779b8eSAndroid Build Coastguard Worker int32_t failedClientPid = -1;
686*ec779b8eSAndroid Build Coastguard Worker for (const ClientInfo& targetClient : targetClients) {
687*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<IResourceManagerClient> client = nullptr;
688*ec779b8eSAndroid Build Coastguard Worker {
689*ec779b8eSAndroid Build Coastguard Worker std::scoped_lock lock{mLock};
690*ec779b8eSAndroid Build Coastguard Worker client = getClient_l(targetClient.mPid, targetClient.mClientId);
691*ec779b8eSAndroid Build Coastguard Worker }
692*ec779b8eSAndroid Build Coastguard Worker if (client == nullptr) {
693*ec779b8eSAndroid Build Coastguard Worker // skip already released clients.
694*ec779b8eSAndroid Build Coastguard Worker continue;
695*ec779b8eSAndroid Build Coastguard Worker }
696*ec779b8eSAndroid Build Coastguard Worker String8 log = String8::format("reclaimResource from client %p", client.get());
697*ec779b8eSAndroid Build Coastguard Worker mServiceLog->add(log);
698*ec779b8eSAndroid Build Coastguard Worker bool success;
699*ec779b8eSAndroid Build Coastguard Worker Status status = client->reclaimResource(&success);
700*ec779b8eSAndroid Build Coastguard Worker if (!status.isOk() || !success) {
701*ec779b8eSAndroid Build Coastguard Worker failedClientId = targetClient.mClientId;
702*ec779b8eSAndroid Build Coastguard Worker failedClientPid = targetClient.mPid;
703*ec779b8eSAndroid Build Coastguard Worker break;
704*ec779b8eSAndroid Build Coastguard Worker }
705*ec779b8eSAndroid Build Coastguard Worker }
706*ec779b8eSAndroid Build Coastguard Worker
707*ec779b8eSAndroid Build Coastguard Worker if (failedClientId == -1) {
708*ec779b8eSAndroid Build Coastguard Worker return true;
709*ec779b8eSAndroid Build Coastguard Worker }
710*ec779b8eSAndroid Build Coastguard Worker
711*ec779b8eSAndroid Build Coastguard Worker {
712*ec779b8eSAndroid Build Coastguard Worker std::scoped_lock lock{mLock};
713*ec779b8eSAndroid Build Coastguard Worker bool found = removeClient_l(failedClientPid, failedClientId);
714*ec779b8eSAndroid Build Coastguard Worker if (found) {
715*ec779b8eSAndroid Build Coastguard Worker ALOGW("Failed to reclaim resources from client with pid %d", failedClientPid);
716*ec779b8eSAndroid Build Coastguard Worker } else {
717*ec779b8eSAndroid Build Coastguard Worker ALOGW("Failed to reclaim resources from unlocateable client");
718*ec779b8eSAndroid Build Coastguard Worker }
719*ec779b8eSAndroid Build Coastguard Worker }
720*ec779b8eSAndroid Build Coastguard Worker
721*ec779b8eSAndroid Build Coastguard Worker return false;
722*ec779b8eSAndroid Build Coastguard Worker }
723*ec779b8eSAndroid Build Coastguard Worker
overridePid_l(int32_t originalPid,int32_t newPid)724*ec779b8eSAndroid Build Coastguard Worker bool ResourceManagerService::overridePid_l(int32_t originalPid, int32_t newPid) {
725*ec779b8eSAndroid Build Coastguard Worker mOverridePidMap.erase(originalPid);
726*ec779b8eSAndroid Build Coastguard Worker if (newPid != -1) {
727*ec779b8eSAndroid Build Coastguard Worker mOverridePidMap.emplace(originalPid, newPid);
728*ec779b8eSAndroid Build Coastguard Worker return true;
729*ec779b8eSAndroid Build Coastguard Worker }
730*ec779b8eSAndroid Build Coastguard Worker
731*ec779b8eSAndroid Build Coastguard Worker return false;
732*ec779b8eSAndroid Build Coastguard Worker }
733*ec779b8eSAndroid Build Coastguard Worker
overridePid(int originalPid,int newPid)734*ec779b8eSAndroid Build Coastguard Worker Status ResourceManagerService::overridePid(int originalPid, int newPid) {
735*ec779b8eSAndroid Build Coastguard Worker String8 log = String8::format("overridePid(originalPid %d, newPid %d)",
736*ec779b8eSAndroid Build Coastguard Worker originalPid, newPid);
737*ec779b8eSAndroid Build Coastguard Worker mServiceLog->add(log);
738*ec779b8eSAndroid Build Coastguard Worker
739*ec779b8eSAndroid Build Coastguard Worker // allow if this is called from the same process or the process has
740*ec779b8eSAndroid Build Coastguard Worker // permission.
741*ec779b8eSAndroid Build Coastguard Worker if ((AIBinder_getCallingPid() != getpid()) &&
742*ec779b8eSAndroid Build Coastguard Worker (checkCallingPermission(String16(
743*ec779b8eSAndroid Build Coastguard Worker "android.permission.MEDIA_RESOURCE_OVERRIDE_PID")) == false)) {
744*ec779b8eSAndroid Build Coastguard Worker ALOGE(
745*ec779b8eSAndroid Build Coastguard Worker "Permission Denial: can't access overridePid method from pid=%d, "
746*ec779b8eSAndroid Build Coastguard Worker "self pid=%d\n",
747*ec779b8eSAndroid Build Coastguard Worker AIBinder_getCallingPid(), getpid());
748*ec779b8eSAndroid Build Coastguard Worker return Status::fromServiceSpecificError(PERMISSION_DENIED);
749*ec779b8eSAndroid Build Coastguard Worker }
750*ec779b8eSAndroid Build Coastguard Worker
751*ec779b8eSAndroid Build Coastguard Worker {
752*ec779b8eSAndroid Build Coastguard Worker std::scoped_lock lock{mLock};
753*ec779b8eSAndroid Build Coastguard Worker if (overridePid_l(originalPid, newPid)) {
754*ec779b8eSAndroid Build Coastguard Worker mResourceManagerMetrics->addPid(newPid);
755*ec779b8eSAndroid Build Coastguard Worker }
756*ec779b8eSAndroid Build Coastguard Worker }
757*ec779b8eSAndroid Build Coastguard Worker
758*ec779b8eSAndroid Build Coastguard Worker return Status::ok();
759*ec779b8eSAndroid Build Coastguard Worker }
760*ec779b8eSAndroid Build Coastguard Worker
overrideProcessInfo_l(const std::shared_ptr<IResourceManagerClient> & client,int pid,int procState,int oomScore)761*ec779b8eSAndroid Build Coastguard Worker bool ResourceManagerService::overrideProcessInfo_l(
762*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<IResourceManagerClient>& client,
763*ec779b8eSAndroid Build Coastguard Worker int pid,
764*ec779b8eSAndroid Build Coastguard Worker int procState,
765*ec779b8eSAndroid Build Coastguard Worker int oomScore) {
766*ec779b8eSAndroid Build Coastguard Worker removeProcessInfoOverride_l(pid);
767*ec779b8eSAndroid Build Coastguard Worker
768*ec779b8eSAndroid Build Coastguard Worker if (!mProcessInfo->overrideProcessInfo(pid, procState, oomScore)) {
769*ec779b8eSAndroid Build Coastguard Worker // Override value is rejected by ProcessInfo.
770*ec779b8eSAndroid Build Coastguard Worker return false;
771*ec779b8eSAndroid Build Coastguard Worker }
772*ec779b8eSAndroid Build Coastguard Worker
773*ec779b8eSAndroid Build Coastguard Worker ClientInfoParcel clientInfo{.pid = static_cast<int32_t>(pid),
774*ec779b8eSAndroid Build Coastguard Worker .uid = 0,
775*ec779b8eSAndroid Build Coastguard Worker .id = 0,
776*ec779b8eSAndroid Build Coastguard Worker .name = "<unknown client>"};
777*ec779b8eSAndroid Build Coastguard Worker auto deathNotifier = DeathNotifier::Create(
778*ec779b8eSAndroid Build Coastguard Worker client, ref<ResourceManagerService>(), clientInfo, true);
779*ec779b8eSAndroid Build Coastguard Worker
780*ec779b8eSAndroid Build Coastguard Worker mProcessInfoOverrideMap.emplace(pid, ProcessInfoOverride{deathNotifier, client});
781*ec779b8eSAndroid Build Coastguard Worker return true;
782*ec779b8eSAndroid Build Coastguard Worker }
783*ec779b8eSAndroid Build Coastguard Worker
overrideProcessInfo(const std::shared_ptr<IResourceManagerClient> & client,int pid,int procState,int oomScore)784*ec779b8eSAndroid Build Coastguard Worker Status ResourceManagerService::overrideProcessInfo(
785*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<IResourceManagerClient>& client, int pid, int procState,
786*ec779b8eSAndroid Build Coastguard Worker int oomScore) {
787*ec779b8eSAndroid Build Coastguard Worker String8 log = String8::format("overrideProcessInfo(pid %d, procState %d, oomScore %d)",
788*ec779b8eSAndroid Build Coastguard Worker pid, procState, oomScore);
789*ec779b8eSAndroid Build Coastguard Worker mServiceLog->add(log);
790*ec779b8eSAndroid Build Coastguard Worker
791*ec779b8eSAndroid Build Coastguard Worker // Only allow the override if the caller already can access process state and oom scores.
792*ec779b8eSAndroid Build Coastguard Worker int callingPid = AIBinder_getCallingPid();
793*ec779b8eSAndroid Build Coastguard Worker if (callingPid != getpid() && (callingPid != pid || !checkCallingPermission(String16(
794*ec779b8eSAndroid Build Coastguard Worker "android.permission.GET_PROCESS_STATE_AND_OOM_SCORE")))) {
795*ec779b8eSAndroid Build Coastguard Worker ALOGE("Permission Denial: overrideProcessInfo method from pid=%d", callingPid);
796*ec779b8eSAndroid Build Coastguard Worker return Status::fromServiceSpecificError(PERMISSION_DENIED);
797*ec779b8eSAndroid Build Coastguard Worker }
798*ec779b8eSAndroid Build Coastguard Worker
799*ec779b8eSAndroid Build Coastguard Worker if (client == nullptr) {
800*ec779b8eSAndroid Build Coastguard Worker return Status::fromServiceSpecificError(BAD_VALUE);
801*ec779b8eSAndroid Build Coastguard Worker }
802*ec779b8eSAndroid Build Coastguard Worker
803*ec779b8eSAndroid Build Coastguard Worker std::scoped_lock lock{mLock};
804*ec779b8eSAndroid Build Coastguard Worker if (!overrideProcessInfo_l(client, pid, procState, oomScore)) {
805*ec779b8eSAndroid Build Coastguard Worker // Override value is rejected by ProcessInfo.
806*ec779b8eSAndroid Build Coastguard Worker return Status::fromServiceSpecificError(BAD_VALUE);
807*ec779b8eSAndroid Build Coastguard Worker }
808*ec779b8eSAndroid Build Coastguard Worker return Status::ok();
809*ec779b8eSAndroid Build Coastguard Worker
810*ec779b8eSAndroid Build Coastguard Worker }
811*ec779b8eSAndroid Build Coastguard Worker
removeProcessInfoOverride(int pid)812*ec779b8eSAndroid Build Coastguard Worker void ResourceManagerService::removeProcessInfoOverride(int pid) {
813*ec779b8eSAndroid Build Coastguard Worker std::scoped_lock lock{mLock};
814*ec779b8eSAndroid Build Coastguard Worker
815*ec779b8eSAndroid Build Coastguard Worker removeProcessInfoOverride_l(pid);
816*ec779b8eSAndroid Build Coastguard Worker }
817*ec779b8eSAndroid Build Coastguard Worker
removeProcessInfoOverride_l(int pid)818*ec779b8eSAndroid Build Coastguard Worker void ResourceManagerService::removeProcessInfoOverride_l(int pid) {
819*ec779b8eSAndroid Build Coastguard Worker auto it = mProcessInfoOverrideMap.find(pid);
820*ec779b8eSAndroid Build Coastguard Worker if (it == mProcessInfoOverrideMap.end()) {
821*ec779b8eSAndroid Build Coastguard Worker return;
822*ec779b8eSAndroid Build Coastguard Worker }
823*ec779b8eSAndroid Build Coastguard Worker
824*ec779b8eSAndroid Build Coastguard Worker mProcessInfo->removeProcessInfoOverride(pid);
825*ec779b8eSAndroid Build Coastguard Worker mProcessInfoOverrideMap.erase(pid);
826*ec779b8eSAndroid Build Coastguard Worker }
827*ec779b8eSAndroid Build Coastguard Worker
markClientForPendingRemoval(const ClientInfoParcel & clientInfo)828*ec779b8eSAndroid Build Coastguard Worker Status ResourceManagerService::markClientForPendingRemoval(const ClientInfoParcel& clientInfo) {
829*ec779b8eSAndroid Build Coastguard Worker int32_t pid = clientInfo.pid;
830*ec779b8eSAndroid Build Coastguard Worker int64_t clientId = clientInfo.id;
831*ec779b8eSAndroid Build Coastguard Worker String8 log = String8::format(
832*ec779b8eSAndroid Build Coastguard Worker "markClientForPendingRemoval(pid %d, clientId %lld)",
833*ec779b8eSAndroid Build Coastguard Worker pid, (long long) clientId);
834*ec779b8eSAndroid Build Coastguard Worker mServiceLog->add(log);
835*ec779b8eSAndroid Build Coastguard Worker
836*ec779b8eSAndroid Build Coastguard Worker std::scoped_lock lock{mLock};
837*ec779b8eSAndroid Build Coastguard Worker if (!mProcessInfo->isPidTrusted(pid)) {
838*ec779b8eSAndroid Build Coastguard Worker pid_t callingPid = IPCThreadState::self()->getCallingPid();
839*ec779b8eSAndroid Build Coastguard Worker ALOGW("%s called with untrusted pid %d, using calling pid %d", __FUNCTION__,
840*ec779b8eSAndroid Build Coastguard Worker pid, callingPid);
841*ec779b8eSAndroid Build Coastguard Worker pid = callingPid;
842*ec779b8eSAndroid Build Coastguard Worker }
843*ec779b8eSAndroid Build Coastguard Worker PidResourceInfosMap::iterator found = mMap.find(pid);
844*ec779b8eSAndroid Build Coastguard Worker if (found == mMap.end()) {
845*ec779b8eSAndroid Build Coastguard Worker ALOGV("markClientForPendingRemoval: didn't find pid %d for clientId %lld",
846*ec779b8eSAndroid Build Coastguard Worker pid, (long long)clientId);
847*ec779b8eSAndroid Build Coastguard Worker return Status::ok();
848*ec779b8eSAndroid Build Coastguard Worker }
849*ec779b8eSAndroid Build Coastguard Worker ResourceInfos& infos = found->second;
850*ec779b8eSAndroid Build Coastguard Worker
851*ec779b8eSAndroid Build Coastguard Worker ResourceInfos::iterator foundClient = infos.find(clientId);
852*ec779b8eSAndroid Build Coastguard Worker if (foundClient == infos.end()) {
853*ec779b8eSAndroid Build Coastguard Worker ALOGV("markClientForPendingRemoval: didn't find clientId %lld", (long long) clientId);
854*ec779b8eSAndroid Build Coastguard Worker return Status::ok();
855*ec779b8eSAndroid Build Coastguard Worker }
856*ec779b8eSAndroid Build Coastguard Worker
857*ec779b8eSAndroid Build Coastguard Worker ResourceInfo& info = foundClient->second;
858*ec779b8eSAndroid Build Coastguard Worker info.pendingRemoval = true;
859*ec779b8eSAndroid Build Coastguard Worker return Status::ok();
860*ec779b8eSAndroid Build Coastguard Worker }
861*ec779b8eSAndroid Build Coastguard Worker
reclaimResourcesFromClientsPendingRemoval(int32_t pid)862*ec779b8eSAndroid Build Coastguard Worker Status ResourceManagerService::reclaimResourcesFromClientsPendingRemoval(int32_t pid) {
863*ec779b8eSAndroid Build Coastguard Worker String8 log = String8::format("reclaimResourcesFromClientsPendingRemoval(pid %d)", pid);
864*ec779b8eSAndroid Build Coastguard Worker mServiceLog->add(log);
865*ec779b8eSAndroid Build Coastguard Worker
866*ec779b8eSAndroid Build Coastguard Worker std::vector<ClientInfo> targetClients;
867*ec779b8eSAndroid Build Coastguard Worker {
868*ec779b8eSAndroid Build Coastguard Worker std::scoped_lock lock{mLock};
869*ec779b8eSAndroid Build Coastguard Worker if (!mProcessInfo->isPidTrusted(pid)) {
870*ec779b8eSAndroid Build Coastguard Worker pid_t callingPid = IPCThreadState::self()->getCallingPid();
871*ec779b8eSAndroid Build Coastguard Worker ALOGW("%s called with untrusted pid %d, using calling pid %d", __FUNCTION__,
872*ec779b8eSAndroid Build Coastguard Worker pid, callingPid);
873*ec779b8eSAndroid Build Coastguard Worker pid = callingPid;
874*ec779b8eSAndroid Build Coastguard Worker }
875*ec779b8eSAndroid Build Coastguard Worker
876*ec779b8eSAndroid Build Coastguard Worker for (MediaResource::Type type : {MediaResource::Type::kSecureCodec,
877*ec779b8eSAndroid Build Coastguard Worker MediaResource::Type::kNonSecureCodec,
878*ec779b8eSAndroid Build Coastguard Worker MediaResource::Type::kGraphicMemory,
879*ec779b8eSAndroid Build Coastguard Worker MediaResource::Type::kDrmSession}) {
880*ec779b8eSAndroid Build Coastguard Worker switch (type) {
881*ec779b8eSAndroid Build Coastguard Worker // Codec resources are segregated by audio, video and image domains.
882*ec779b8eSAndroid Build Coastguard Worker case MediaResource::Type::kSecureCodec:
883*ec779b8eSAndroid Build Coastguard Worker case MediaResource::Type::kNonSecureCodec:
884*ec779b8eSAndroid Build Coastguard Worker for (MediaResource::SubType subType : {MediaResource::SubType::kHwAudioCodec,
885*ec779b8eSAndroid Build Coastguard Worker MediaResource::SubType::kSwAudioCodec,
886*ec779b8eSAndroid Build Coastguard Worker MediaResource::SubType::kHwVideoCodec,
887*ec779b8eSAndroid Build Coastguard Worker MediaResource::SubType::kSwVideoCodec,
888*ec779b8eSAndroid Build Coastguard Worker MediaResource::SubType::kHwImageCodec,
889*ec779b8eSAndroid Build Coastguard Worker MediaResource::SubType::kSwImageCodec}) {
890*ec779b8eSAndroid Build Coastguard Worker ClientInfo clientInfo;
891*ec779b8eSAndroid Build Coastguard Worker if (getBiggestClientPendingRemoval_l(pid, type, subType, clientInfo)) {
892*ec779b8eSAndroid Build Coastguard Worker targetClients.emplace_back(clientInfo);
893*ec779b8eSAndroid Build Coastguard Worker continue;
894*ec779b8eSAndroid Build Coastguard Worker }
895*ec779b8eSAndroid Build Coastguard Worker }
896*ec779b8eSAndroid Build Coastguard Worker break;
897*ec779b8eSAndroid Build Coastguard Worker // Non-codec resources are shared by audio, video and image codecs (no subtype).
898*ec779b8eSAndroid Build Coastguard Worker default:
899*ec779b8eSAndroid Build Coastguard Worker ClientInfo clientInfo;
900*ec779b8eSAndroid Build Coastguard Worker if (getBiggestClientPendingRemoval_l(pid, type,
901*ec779b8eSAndroid Build Coastguard Worker MediaResource::SubType::kUnspecifiedSubType, clientInfo)) {
902*ec779b8eSAndroid Build Coastguard Worker targetClients.emplace_back(clientInfo);
903*ec779b8eSAndroid Build Coastguard Worker }
904*ec779b8eSAndroid Build Coastguard Worker break;
905*ec779b8eSAndroid Build Coastguard Worker }
906*ec779b8eSAndroid Build Coastguard Worker }
907*ec779b8eSAndroid Build Coastguard Worker }
908*ec779b8eSAndroid Build Coastguard Worker
909*ec779b8eSAndroid Build Coastguard Worker if (!targetClients.empty()) {
910*ec779b8eSAndroid Build Coastguard Worker reclaimUnconditionallyFrom(targetClients);
911*ec779b8eSAndroid Build Coastguard Worker }
912*ec779b8eSAndroid Build Coastguard Worker return Status::ok();
913*ec779b8eSAndroid Build Coastguard Worker }
914*ec779b8eSAndroid Build Coastguard Worker
getPriority_l(int pid,int * priority) const915*ec779b8eSAndroid Build Coastguard Worker bool ResourceManagerService::getPriority_l(int pid, int* priority) const {
916*ec779b8eSAndroid Build Coastguard Worker int newPid = pid;
917*ec779b8eSAndroid Build Coastguard Worker
918*ec779b8eSAndroid Build Coastguard Worker std::map<int, int>::const_iterator found = mOverridePidMap.find(pid);
919*ec779b8eSAndroid Build Coastguard Worker if (found != mOverridePidMap.end()) {
920*ec779b8eSAndroid Build Coastguard Worker newPid = found->second;
921*ec779b8eSAndroid Build Coastguard Worker ALOGD("getPriority_l: use override pid %d instead original pid %d",
922*ec779b8eSAndroid Build Coastguard Worker newPid, pid);
923*ec779b8eSAndroid Build Coastguard Worker }
924*ec779b8eSAndroid Build Coastguard Worker
925*ec779b8eSAndroid Build Coastguard Worker return mProcessInfo->getPriority(newPid, priority);
926*ec779b8eSAndroid Build Coastguard Worker }
927*ec779b8eSAndroid Build Coastguard Worker
getAllClients_l(const ResourceRequestInfo & resourceRequestInfo,std::vector<ClientInfo> & clientsInfo)928*ec779b8eSAndroid Build Coastguard Worker bool ResourceManagerService::getAllClients_l(
929*ec779b8eSAndroid Build Coastguard Worker const ResourceRequestInfo& resourceRequestInfo,
930*ec779b8eSAndroid Build Coastguard Worker std::vector<ClientInfo>& clientsInfo) {
931*ec779b8eSAndroid Build Coastguard Worker MediaResource::Type type = resourceRequestInfo.mResource->type;
932*ec779b8eSAndroid Build Coastguard Worker MediaResource::SubType subType = resourceRequestInfo.mResource->subType;
933*ec779b8eSAndroid Build Coastguard Worker
934*ec779b8eSAndroid Build Coastguard Worker for (auto& [pid, infos] : mMap) {
935*ec779b8eSAndroid Build Coastguard Worker for (const auto& [id, info] : infos) {
936*ec779b8eSAndroid Build Coastguard Worker if (pid == resourceRequestInfo.mCallingPid && id == resourceRequestInfo.mClientId) {
937*ec779b8eSAndroid Build Coastguard Worker ALOGI("%s: Skip the client[%jd] for which the resource request is made",
938*ec779b8eSAndroid Build Coastguard Worker __func__, id);
939*ec779b8eSAndroid Build Coastguard Worker continue;
940*ec779b8eSAndroid Build Coastguard Worker }
941*ec779b8eSAndroid Build Coastguard Worker if (hasResourceType(type, subType, info.resources)) {
942*ec779b8eSAndroid Build Coastguard Worker if (!isCallingPriorityHigher_l(resourceRequestInfo.mCallingPid, pid)) {
943*ec779b8eSAndroid Build Coastguard Worker // some higher/equal priority process owns the resource,
944*ec779b8eSAndroid Build Coastguard Worker // this request can't be fulfilled.
945*ec779b8eSAndroid Build Coastguard Worker ALOGE("%s: can't reclaim resource %s from pid %d",
946*ec779b8eSAndroid Build Coastguard Worker __func__, asString(type), pid);
947*ec779b8eSAndroid Build Coastguard Worker clientsInfo.clear();
948*ec779b8eSAndroid Build Coastguard Worker return false;
949*ec779b8eSAndroid Build Coastguard Worker }
950*ec779b8eSAndroid Build Coastguard Worker clientsInfo.emplace_back(pid, info.uid, info.clientId);
951*ec779b8eSAndroid Build Coastguard Worker }
952*ec779b8eSAndroid Build Coastguard Worker }
953*ec779b8eSAndroid Build Coastguard Worker }
954*ec779b8eSAndroid Build Coastguard Worker if (clientsInfo.size() == 0) {
955*ec779b8eSAndroid Build Coastguard Worker ALOGV("%s: didn't find any resource %s", __func__, asString(type));
956*ec779b8eSAndroid Build Coastguard Worker }
957*ec779b8eSAndroid Build Coastguard Worker return true;
958*ec779b8eSAndroid Build Coastguard Worker }
959*ec779b8eSAndroid Build Coastguard Worker
960*ec779b8eSAndroid Build Coastguard Worker // Process priority (oom score) based reclaim:
961*ec779b8eSAndroid Build Coastguard Worker // - Find a process with lowest priority (than that of calling process).
962*ec779b8eSAndroid Build Coastguard Worker // - Find the bigegst client (with required resources) from that process.
getLowestPriorityBiggestClient_l(const ResourceRequestInfo & resourceRequestInfo,ClientInfo & clientInfo)963*ec779b8eSAndroid Build Coastguard Worker bool ResourceManagerService::getLowestPriorityBiggestClient_l(
964*ec779b8eSAndroid Build Coastguard Worker const ResourceRequestInfo& resourceRequestInfo,
965*ec779b8eSAndroid Build Coastguard Worker ClientInfo& clientInfo) {
966*ec779b8eSAndroid Build Coastguard Worker int callingPid = resourceRequestInfo.mCallingPid;
967*ec779b8eSAndroid Build Coastguard Worker MediaResource::Type type = resourceRequestInfo.mResource->type;
968*ec779b8eSAndroid Build Coastguard Worker MediaResource::SubType subType = resourceRequestInfo.mResource->subType;
969*ec779b8eSAndroid Build Coastguard Worker int lowestPriorityPid;
970*ec779b8eSAndroid Build Coastguard Worker int lowestPriority;
971*ec779b8eSAndroid Build Coastguard Worker int callingPriority;
972*ec779b8eSAndroid Build Coastguard Worker
973*ec779b8eSAndroid Build Coastguard Worker if (!getPriority_l(callingPid, &callingPriority)) {
974*ec779b8eSAndroid Build Coastguard Worker ALOGE("%s: can't get process priority for pid %d", __func__, callingPid);
975*ec779b8eSAndroid Build Coastguard Worker return false;
976*ec779b8eSAndroid Build Coastguard Worker }
977*ec779b8eSAndroid Build Coastguard Worker if (!getLowestPriorityPid_l(type, subType, &lowestPriorityPid, &lowestPriority)) {
978*ec779b8eSAndroid Build Coastguard Worker return false;
979*ec779b8eSAndroid Build Coastguard Worker }
980*ec779b8eSAndroid Build Coastguard Worker if (lowestPriority <= callingPriority) {
981*ec779b8eSAndroid Build Coastguard Worker ALOGE("%s: lowest priority %d vs caller priority %d",
982*ec779b8eSAndroid Build Coastguard Worker __func__, lowestPriority, callingPriority);
983*ec779b8eSAndroid Build Coastguard Worker return false;
984*ec779b8eSAndroid Build Coastguard Worker }
985*ec779b8eSAndroid Build Coastguard Worker
986*ec779b8eSAndroid Build Coastguard Worker if (!getBiggestClient_l(lowestPriorityPid, type, subType, clientInfo)) {
987*ec779b8eSAndroid Build Coastguard Worker return false;
988*ec779b8eSAndroid Build Coastguard Worker }
989*ec779b8eSAndroid Build Coastguard Worker
990*ec779b8eSAndroid Build Coastguard Worker ALOGI("%s: CallingProcess(%d:%d) will reclaim from the lowestPriorityProcess(%d:%d)",
991*ec779b8eSAndroid Build Coastguard Worker __func__, callingPid, callingPriority, lowestPriorityPid, lowestPriority);
992*ec779b8eSAndroid Build Coastguard Worker return true;
993*ec779b8eSAndroid Build Coastguard Worker }
994*ec779b8eSAndroid Build Coastguard Worker
getLowestPriorityPid_l(MediaResource::Type type,MediaResource::SubType subType,int * lowestPriorityPid,int * lowestPriority)995*ec779b8eSAndroid Build Coastguard Worker bool ResourceManagerService::getLowestPriorityPid_l(MediaResource::Type type,
996*ec779b8eSAndroid Build Coastguard Worker MediaResource::SubType subType, int *lowestPriorityPid, int *lowestPriority) {
997*ec779b8eSAndroid Build Coastguard Worker int pid = -1;
998*ec779b8eSAndroid Build Coastguard Worker int priority = -1;
999*ec779b8eSAndroid Build Coastguard Worker for (auto& [tempPid, infos] : mMap) {
1000*ec779b8eSAndroid Build Coastguard Worker if (infos.size() == 0) {
1001*ec779b8eSAndroid Build Coastguard Worker // no client on this process.
1002*ec779b8eSAndroid Build Coastguard Worker continue;
1003*ec779b8eSAndroid Build Coastguard Worker }
1004*ec779b8eSAndroid Build Coastguard Worker if (!hasResourceType(type, subType, infos)) {
1005*ec779b8eSAndroid Build Coastguard Worker // doesn't have the requested resource type
1006*ec779b8eSAndroid Build Coastguard Worker continue;
1007*ec779b8eSAndroid Build Coastguard Worker }
1008*ec779b8eSAndroid Build Coastguard Worker int tempPriority = -1;
1009*ec779b8eSAndroid Build Coastguard Worker if (!getPriority_l(tempPid, &tempPriority)) {
1010*ec779b8eSAndroid Build Coastguard Worker ALOGV("getLowestPriorityPid_l: can't get priority of pid %d, skipped", tempPid);
1011*ec779b8eSAndroid Build Coastguard Worker // TODO: remove this pid from mMap?
1012*ec779b8eSAndroid Build Coastguard Worker continue;
1013*ec779b8eSAndroid Build Coastguard Worker }
1014*ec779b8eSAndroid Build Coastguard Worker if (pid == -1 || tempPriority > priority) {
1015*ec779b8eSAndroid Build Coastguard Worker // initial the value
1016*ec779b8eSAndroid Build Coastguard Worker pid = tempPid;
1017*ec779b8eSAndroid Build Coastguard Worker priority = tempPriority;
1018*ec779b8eSAndroid Build Coastguard Worker }
1019*ec779b8eSAndroid Build Coastguard Worker }
1020*ec779b8eSAndroid Build Coastguard Worker if (pid != -1) {
1021*ec779b8eSAndroid Build Coastguard Worker *lowestPriorityPid = pid;
1022*ec779b8eSAndroid Build Coastguard Worker *lowestPriority = priority;
1023*ec779b8eSAndroid Build Coastguard Worker }
1024*ec779b8eSAndroid Build Coastguard Worker return (pid != -1);
1025*ec779b8eSAndroid Build Coastguard Worker }
1026*ec779b8eSAndroid Build Coastguard Worker
isCallingPriorityHigher_l(int callingPid,int pid)1027*ec779b8eSAndroid Build Coastguard Worker bool ResourceManagerService::isCallingPriorityHigher_l(int callingPid, int pid) {
1028*ec779b8eSAndroid Build Coastguard Worker int callingPidPriority;
1029*ec779b8eSAndroid Build Coastguard Worker if (!getPriority_l(callingPid, &callingPidPriority)) {
1030*ec779b8eSAndroid Build Coastguard Worker return false;
1031*ec779b8eSAndroid Build Coastguard Worker }
1032*ec779b8eSAndroid Build Coastguard Worker
1033*ec779b8eSAndroid Build Coastguard Worker int priority;
1034*ec779b8eSAndroid Build Coastguard Worker if (!getPriority_l(pid, &priority)) {
1035*ec779b8eSAndroid Build Coastguard Worker return false;
1036*ec779b8eSAndroid Build Coastguard Worker }
1037*ec779b8eSAndroid Build Coastguard Worker
1038*ec779b8eSAndroid Build Coastguard Worker return (callingPidPriority < priority);
1039*ec779b8eSAndroid Build Coastguard Worker }
1040*ec779b8eSAndroid Build Coastguard Worker
getBiggestClientPendingRemoval_l(int pid,MediaResource::Type type,MediaResource::SubType subType,ClientInfo & clientInfo)1041*ec779b8eSAndroid Build Coastguard Worker bool ResourceManagerService::getBiggestClientPendingRemoval_l(int pid, MediaResource::Type type,
1042*ec779b8eSAndroid Build Coastguard Worker MediaResource::SubType subType, ClientInfo& clientInfo) {
1043*ec779b8eSAndroid Build Coastguard Worker return getBiggestClient_l(pid, type, subType, clientInfo, true /* pendingRemovalOnly */);
1044*ec779b8eSAndroid Build Coastguard Worker }
1045*ec779b8eSAndroid Build Coastguard Worker
getBiggestClient_l(int pid,MediaResource::Type type,MediaResource::SubType subType,ClientInfo & clientInfo,bool pendingRemovalOnly)1046*ec779b8eSAndroid Build Coastguard Worker bool ResourceManagerService::getBiggestClient_l(int pid, MediaResource::Type type,
1047*ec779b8eSAndroid Build Coastguard Worker MediaResource::SubType subType, ClientInfo& clientInfo, bool pendingRemovalOnly) {
1048*ec779b8eSAndroid Build Coastguard Worker PidResourceInfosMap::iterator found = mMap.find(pid);
1049*ec779b8eSAndroid Build Coastguard Worker if (found == mMap.end()) {
1050*ec779b8eSAndroid Build Coastguard Worker ALOGE_IF(!pendingRemovalOnly,
1051*ec779b8eSAndroid Build Coastguard Worker "getBiggestClient_l: can't find resource info for pid %d", pid);
1052*ec779b8eSAndroid Build Coastguard Worker return false;
1053*ec779b8eSAndroid Build Coastguard Worker }
1054*ec779b8eSAndroid Build Coastguard Worker
1055*ec779b8eSAndroid Build Coastguard Worker uid_t uid = -1;
1056*ec779b8eSAndroid Build Coastguard Worker int64_t clientId = -1;
1057*ec779b8eSAndroid Build Coastguard Worker uint64_t largestValue = 0;
1058*ec779b8eSAndroid Build Coastguard Worker const ResourceInfos& infos = found->second;
1059*ec779b8eSAndroid Build Coastguard Worker for (const auto& [id, info] : infos) {
1060*ec779b8eSAndroid Build Coastguard Worker const ResourceList& resources = info.resources;
1061*ec779b8eSAndroid Build Coastguard Worker if (pendingRemovalOnly && !info.pendingRemoval) {
1062*ec779b8eSAndroid Build Coastguard Worker continue;
1063*ec779b8eSAndroid Build Coastguard Worker }
1064*ec779b8eSAndroid Build Coastguard Worker for (const MediaResourceParcel& resource : resources.getResources()) {
1065*ec779b8eSAndroid Build Coastguard Worker if (hasResourceType(type, subType, resource)) {
1066*ec779b8eSAndroid Build Coastguard Worker if (resource.value > largestValue) {
1067*ec779b8eSAndroid Build Coastguard Worker largestValue = resource.value;
1068*ec779b8eSAndroid Build Coastguard Worker clientId = info.clientId;
1069*ec779b8eSAndroid Build Coastguard Worker uid = info.uid;
1070*ec779b8eSAndroid Build Coastguard Worker }
1071*ec779b8eSAndroid Build Coastguard Worker }
1072*ec779b8eSAndroid Build Coastguard Worker }
1073*ec779b8eSAndroid Build Coastguard Worker }
1074*ec779b8eSAndroid Build Coastguard Worker
1075*ec779b8eSAndroid Build Coastguard Worker if (clientId == -1) {
1076*ec779b8eSAndroid Build Coastguard Worker ALOGE_IF(!pendingRemovalOnly,
1077*ec779b8eSAndroid Build Coastguard Worker "getBiggestClient_l: can't find resource type %s and subtype %s for pid %d",
1078*ec779b8eSAndroid Build Coastguard Worker asString(type), asString(subType), pid);
1079*ec779b8eSAndroid Build Coastguard Worker return false;
1080*ec779b8eSAndroid Build Coastguard Worker }
1081*ec779b8eSAndroid Build Coastguard Worker
1082*ec779b8eSAndroid Build Coastguard Worker clientInfo.mPid = pid;
1083*ec779b8eSAndroid Build Coastguard Worker clientInfo.mUid = uid;
1084*ec779b8eSAndroid Build Coastguard Worker clientInfo.mClientId = clientId;
1085*ec779b8eSAndroid Build Coastguard Worker return true;
1086*ec779b8eSAndroid Build Coastguard Worker }
1087*ec779b8eSAndroid Build Coastguard Worker
notifyClientCreated(const ClientInfoParcel & clientInfo)1088*ec779b8eSAndroid Build Coastguard Worker Status ResourceManagerService::notifyClientCreated(const ClientInfoParcel& clientInfo) {
1089*ec779b8eSAndroid Build Coastguard Worker mResourceManagerMetrics->notifyClientCreated(clientInfo);
1090*ec779b8eSAndroid Build Coastguard Worker return Status::ok();
1091*ec779b8eSAndroid Build Coastguard Worker }
1092*ec779b8eSAndroid Build Coastguard Worker
notifyClientStarted(const ClientConfigParcel & clientConfig)1093*ec779b8eSAndroid Build Coastguard Worker Status ResourceManagerService::notifyClientStarted(const ClientConfigParcel& clientConfig) {
1094*ec779b8eSAndroid Build Coastguard Worker mResourceManagerMetrics->notifyClientStarted(clientConfig);
1095*ec779b8eSAndroid Build Coastguard Worker return Status::ok();
1096*ec779b8eSAndroid Build Coastguard Worker }
1097*ec779b8eSAndroid Build Coastguard Worker
notifyClientStopped(const ClientConfigParcel & clientConfig)1098*ec779b8eSAndroid Build Coastguard Worker Status ResourceManagerService::notifyClientStopped(const ClientConfigParcel& clientConfig) {
1099*ec779b8eSAndroid Build Coastguard Worker mResourceManagerMetrics->notifyClientStopped(clientConfig);
1100*ec779b8eSAndroid Build Coastguard Worker return Status::ok();
1101*ec779b8eSAndroid Build Coastguard Worker }
1102*ec779b8eSAndroid Build Coastguard Worker
notifyClientConfigChanged(const ClientConfigParcel & clientConfig)1103*ec779b8eSAndroid Build Coastguard Worker Status ResourceManagerService::notifyClientConfigChanged(const ClientConfigParcel& clientConfig) {
1104*ec779b8eSAndroid Build Coastguard Worker mResourceManagerMetrics->notifyClientConfigChanged(clientConfig);
1105*ec779b8eSAndroid Build Coastguard Worker return Status::ok();
1106*ec779b8eSAndroid Build Coastguard Worker }
1107*ec779b8eSAndroid Build Coastguard Worker
getPeakConcurrentPixelCount(int pid) const1108*ec779b8eSAndroid Build Coastguard Worker long ResourceManagerService::getPeakConcurrentPixelCount(int pid) const {
1109*ec779b8eSAndroid Build Coastguard Worker return mResourceManagerMetrics->getPeakConcurrentPixelCount(pid);
1110*ec779b8eSAndroid Build Coastguard Worker }
1111*ec779b8eSAndroid Build Coastguard Worker
getCurrentConcurrentPixelCount(int pid) const1112*ec779b8eSAndroid Build Coastguard Worker long ResourceManagerService::getCurrentConcurrentPixelCount(int pid) const {
1113*ec779b8eSAndroid Build Coastguard Worker return mResourceManagerMetrics->getCurrentConcurrentPixelCount(pid);
1114*ec779b8eSAndroid Build Coastguard Worker }
1115*ec779b8eSAndroid Build Coastguard Worker
notifyClientReleased(const ClientInfoParcel & clientInfo)1116*ec779b8eSAndroid Build Coastguard Worker void ResourceManagerService::notifyClientReleased(const ClientInfoParcel& clientInfo) {
1117*ec779b8eSAndroid Build Coastguard Worker mResourceManagerMetrics->notifyClientReleased(clientInfo);
1118*ec779b8eSAndroid Build Coastguard Worker }
1119*ec779b8eSAndroid Build Coastguard Worker
1120*ec779b8eSAndroid Build Coastguard Worker } // namespace android
1121