xref: /aosp_15_r20/frameworks/av/services/mediaresourcemanager/ResourceManagerServiceUtils.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker **
3*ec779b8eSAndroid Build Coastguard Worker ** Copyright 2023, 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 "ResourceManagerServiceUtils"
20*ec779b8eSAndroid Build Coastguard Worker #include <utils/Log.h>
21*ec779b8eSAndroid Build Coastguard Worker 
22*ec779b8eSAndroid Build Coastguard Worker #include <binder/IServiceManager.h>
23*ec779b8eSAndroid Build Coastguard Worker 
24*ec779b8eSAndroid Build Coastguard Worker #include "IMediaResourceMonitor.h"
25*ec779b8eSAndroid Build Coastguard Worker #include "ResourceManagerService.h"
26*ec779b8eSAndroid Build Coastguard Worker #include "ResourceManagerServiceUtils.h"
27*ec779b8eSAndroid Build Coastguard Worker 
28*ec779b8eSAndroid Build Coastguard Worker namespace android {
29*ec779b8eSAndroid Build Coastguard Worker 
add(const MediaResourceParcel & res,bool * isNewEntry)30*ec779b8eSAndroid Build Coastguard Worker bool ResourceList::add(const MediaResourceParcel& res, bool* isNewEntry) {
31*ec779b8eSAndroid Build Coastguard Worker     // See if it's an existing entry, if so, merge it.
32*ec779b8eSAndroid Build Coastguard Worker     for (MediaResourceParcel& item : mResourceList) {
33*ec779b8eSAndroid Build Coastguard Worker         if (item.type == res.type && item.subType == res.subType && item.id == res.id) {
34*ec779b8eSAndroid Build Coastguard Worker             // We already have an item. Merge them and return
35*ec779b8eSAndroid Build Coastguard Worker             mergeResources(item, res);
36*ec779b8eSAndroid Build Coastguard Worker             return true;
37*ec779b8eSAndroid Build Coastguard Worker         }
38*ec779b8eSAndroid Build Coastguard Worker     }
39*ec779b8eSAndroid Build Coastguard Worker 
40*ec779b8eSAndroid Build Coastguard Worker     // Since we have't found this resource yet, it is a new entry.
41*ec779b8eSAndroid Build Coastguard Worker     // We can't init a new entry with negative value, although it's allowed
42*ec779b8eSAndroid Build Coastguard Worker     // to merge in negative values after the initial add.
43*ec779b8eSAndroid Build Coastguard Worker     if (res.value <= 0) {
44*ec779b8eSAndroid Build Coastguard Worker         ALOGW("Ignoring request to add new resource entry with value <= 0");
45*ec779b8eSAndroid Build Coastguard Worker         return false;
46*ec779b8eSAndroid Build Coastguard Worker     }
47*ec779b8eSAndroid Build Coastguard Worker     if (isNewEntry) {
48*ec779b8eSAndroid Build Coastguard Worker         *isNewEntry = true;
49*ec779b8eSAndroid Build Coastguard Worker     }
50*ec779b8eSAndroid Build Coastguard Worker     mResourceList.push_back(res);
51*ec779b8eSAndroid Build Coastguard Worker     return true;
52*ec779b8eSAndroid Build Coastguard Worker }
53*ec779b8eSAndroid Build Coastguard Worker 
addOrUpdate(const MediaResourceParcel & res)54*ec779b8eSAndroid Build Coastguard Worker void ResourceList::addOrUpdate(const MediaResourceParcel& res) {
55*ec779b8eSAndroid Build Coastguard Worker     // See if it's an existing entry, just update the value.
56*ec779b8eSAndroid Build Coastguard Worker     for (MediaResourceParcel& item : mResourceList) {
57*ec779b8eSAndroid Build Coastguard Worker         if (item.type == res.type && item.subType == res.subType && item.id == res.id) {
58*ec779b8eSAndroid Build Coastguard Worker             item.value = res.value;
59*ec779b8eSAndroid Build Coastguard Worker             return;
60*ec779b8eSAndroid Build Coastguard Worker         }
61*ec779b8eSAndroid Build Coastguard Worker     }
62*ec779b8eSAndroid Build Coastguard Worker 
63*ec779b8eSAndroid Build Coastguard Worker     // Add the new entry.
64*ec779b8eSAndroid Build Coastguard Worker     mResourceList.push_back(res);
65*ec779b8eSAndroid Build Coastguard Worker }
66*ec779b8eSAndroid Build Coastguard Worker 
remove(const MediaResourceParcel & res,long * removedEntryValue)67*ec779b8eSAndroid Build Coastguard Worker bool ResourceList::remove(const MediaResourceParcel& res, long* removedEntryValue) {
68*ec779b8eSAndroid Build Coastguard Worker     // Make sure we have an entry for this resource.
69*ec779b8eSAndroid Build Coastguard Worker     for (std::vector<MediaResourceParcel>::iterator it = mResourceList.begin();
70*ec779b8eSAndroid Build Coastguard Worker          it != mResourceList.end(); it++) {
71*ec779b8eSAndroid Build Coastguard Worker         if (it->type == res.type && it->subType == res.subType && it->id == res.id) {
72*ec779b8eSAndroid Build Coastguard Worker             if (it->value > res.value) {
73*ec779b8eSAndroid Build Coastguard Worker                 // Subtract the resource value by given value.
74*ec779b8eSAndroid Build Coastguard Worker                 it->value -= res.value;
75*ec779b8eSAndroid Build Coastguard Worker             } else {
76*ec779b8eSAndroid Build Coastguard Worker                 // This entry will be removed.
77*ec779b8eSAndroid Build Coastguard Worker                 if (removedEntryValue) {
78*ec779b8eSAndroid Build Coastguard Worker                     *removedEntryValue = it->value;
79*ec779b8eSAndroid Build Coastguard Worker                 }
80*ec779b8eSAndroid Build Coastguard Worker                 mResourceList.erase(it);
81*ec779b8eSAndroid Build Coastguard Worker             }
82*ec779b8eSAndroid Build Coastguard Worker             return true;
83*ec779b8eSAndroid Build Coastguard Worker         }
84*ec779b8eSAndroid Build Coastguard Worker     }
85*ec779b8eSAndroid Build Coastguard Worker 
86*ec779b8eSAndroid Build Coastguard Worker     // No such entry.
87*ec779b8eSAndroid Build Coastguard Worker     return false;
88*ec779b8eSAndroid Build Coastguard Worker }
89*ec779b8eSAndroid Build Coastguard Worker 
toString() const90*ec779b8eSAndroid Build Coastguard Worker std::string ResourceList::toString() const {
91*ec779b8eSAndroid Build Coastguard Worker     std::string str;
92*ec779b8eSAndroid Build Coastguard Worker     for (const ::aidl::android::media::MediaResourceParcel& res : mResourceList) {
93*ec779b8eSAndroid Build Coastguard Worker         str.append(android::toString(res).c_str());
94*ec779b8eSAndroid Build Coastguard Worker         str.append("\n");
95*ec779b8eSAndroid Build Coastguard Worker     }
96*ec779b8eSAndroid Build Coastguard Worker 
97*ec779b8eSAndroid Build Coastguard Worker     return str;
98*ec779b8eSAndroid Build Coastguard Worker }
99*ec779b8eSAndroid Build Coastguard Worker 
operator ==(const ResourceList & rhs) const100*ec779b8eSAndroid Build Coastguard Worker bool ResourceList::operator==(const ResourceList& rhs) const {
101*ec779b8eSAndroid Build Coastguard Worker     // Make sure the size is the same.
102*ec779b8eSAndroid Build Coastguard Worker     if (mResourceList.size() != rhs.mResourceList.size()) {
103*ec779b8eSAndroid Build Coastguard Worker         return false;
104*ec779b8eSAndroid Build Coastguard Worker     }
105*ec779b8eSAndroid Build Coastguard Worker 
106*ec779b8eSAndroid Build Coastguard Worker     // Create a set from this object and check for the items from the rhs.
107*ec779b8eSAndroid Build Coastguard Worker     std::set<::aidl::android::media::MediaResourceParcel> lhs(
108*ec779b8eSAndroid Build Coastguard Worker             mResourceList.begin(), mResourceList.end());
109*ec779b8eSAndroid Build Coastguard Worker     for (const ::aidl::android::media::MediaResourceParcel& res : rhs.mResourceList) {
110*ec779b8eSAndroid Build Coastguard Worker         if (lhs.find(res) == lhs.end()) {
111*ec779b8eSAndroid Build Coastguard Worker             return false;
112*ec779b8eSAndroid Build Coastguard Worker         }
113*ec779b8eSAndroid Build Coastguard Worker     }
114*ec779b8eSAndroid Build Coastguard Worker     return true;
115*ec779b8eSAndroid Build Coastguard Worker }
116*ec779b8eSAndroid Build Coastguard Worker 
117*ec779b8eSAndroid Build Coastguard Worker // Bunch of utility functions that looks for a specific Resource.
118*ec779b8eSAndroid Build Coastguard Worker // Check whether a given resource (of type and subtype) is found in given resource parcel.
hasResourceType(MediaResource::Type type,MediaResource::SubType subType,const MediaResourceParcel & resource)119*ec779b8eSAndroid Build Coastguard Worker bool hasResourceType(MediaResource::Type type, MediaResource::SubType subType,
120*ec779b8eSAndroid Build Coastguard Worker                      const MediaResourceParcel& resource) {
121*ec779b8eSAndroid Build Coastguard Worker     if (type != resource.type) {
122*ec779b8eSAndroid Build Coastguard Worker       return false;
123*ec779b8eSAndroid Build Coastguard Worker     }
124*ec779b8eSAndroid Build Coastguard Worker     switch (type) {
125*ec779b8eSAndroid Build Coastguard Worker     // Codec subtypes (e.g. video vs. audio and hw vs. sw) are each considered separate resources,
126*ec779b8eSAndroid Build Coastguard Worker     // so compare the subtypes as well.
127*ec779b8eSAndroid Build Coastguard Worker     case MediaResource::Type::kSecureCodec:
128*ec779b8eSAndroid Build Coastguard Worker     case MediaResource::Type::kNonSecureCodec:
129*ec779b8eSAndroid Build Coastguard Worker         if (resource.subType == subType) {
130*ec779b8eSAndroid Build Coastguard Worker             return true;
131*ec779b8eSAndroid Build Coastguard Worker         }
132*ec779b8eSAndroid Build Coastguard Worker         break;
133*ec779b8eSAndroid Build Coastguard Worker     // Non-codec resources are not segregated by the subtype (e.g. video vs. audio).
134*ec779b8eSAndroid Build Coastguard Worker     default:
135*ec779b8eSAndroid Build Coastguard Worker         return true;
136*ec779b8eSAndroid Build Coastguard Worker     }
137*ec779b8eSAndroid Build Coastguard Worker     return false;
138*ec779b8eSAndroid Build Coastguard Worker }
139*ec779b8eSAndroid Build Coastguard Worker 
140*ec779b8eSAndroid Build Coastguard Worker // Check whether a given resource (of type and subtype) is found in given resource list.
hasResourceType(MediaResource::Type type,MediaResource::SubType subType,const ResourceList & resources)141*ec779b8eSAndroid Build Coastguard Worker bool hasResourceType(MediaResource::Type type, MediaResource::SubType subType,
142*ec779b8eSAndroid Build Coastguard Worker                      const ResourceList& resources) {
143*ec779b8eSAndroid Build Coastguard Worker     for (const MediaResourceParcel& res : resources.getResources()) {
144*ec779b8eSAndroid Build Coastguard Worker         if (hasResourceType(type, subType, res)) {
145*ec779b8eSAndroid Build Coastguard Worker             return true;
146*ec779b8eSAndroid Build Coastguard Worker         }
147*ec779b8eSAndroid Build Coastguard Worker     }
148*ec779b8eSAndroid Build Coastguard Worker     return false;
149*ec779b8eSAndroid Build Coastguard Worker }
150*ec779b8eSAndroid Build Coastguard Worker 
151*ec779b8eSAndroid Build Coastguard Worker // Check whether a given resource (of type and subtype) is found in given resource info list.
hasResourceType(MediaResource::Type type,MediaResource::SubType subType,const ResourceInfos & infos)152*ec779b8eSAndroid Build Coastguard Worker bool hasResourceType(MediaResource::Type type, MediaResource::SubType subType,
153*ec779b8eSAndroid Build Coastguard Worker                      const ResourceInfos& infos) {
154*ec779b8eSAndroid Build Coastguard Worker     for (const auto& [id, info] : infos) {
155*ec779b8eSAndroid Build Coastguard Worker         if (hasResourceType(type, subType, info.resources)) {
156*ec779b8eSAndroid Build Coastguard Worker             return true;
157*ec779b8eSAndroid Build Coastguard Worker         }
158*ec779b8eSAndroid Build Coastguard Worker     }
159*ec779b8eSAndroid Build Coastguard Worker     return false;
160*ec779b8eSAndroid Build Coastguard Worker }
161*ec779b8eSAndroid Build Coastguard Worker 
getResourceInfosForEdit(int pid,PidResourceInfosMap & map)162*ec779b8eSAndroid Build Coastguard Worker ResourceInfos& getResourceInfosForEdit(int pid, PidResourceInfosMap& map) {
163*ec779b8eSAndroid Build Coastguard Worker     PidResourceInfosMap::iterator found = map.find(pid);
164*ec779b8eSAndroid Build Coastguard Worker     if (found == map.end()) {
165*ec779b8eSAndroid Build Coastguard Worker         // new pid
166*ec779b8eSAndroid Build Coastguard Worker         ResourceInfos infosForPid;
167*ec779b8eSAndroid Build Coastguard Worker         auto [it, inserted] = map.emplace(pid, infosForPid);
168*ec779b8eSAndroid Build Coastguard Worker         found = it;
169*ec779b8eSAndroid Build Coastguard Worker     }
170*ec779b8eSAndroid Build Coastguard Worker 
171*ec779b8eSAndroid Build Coastguard Worker     return found->second;
172*ec779b8eSAndroid Build Coastguard Worker }
173*ec779b8eSAndroid Build Coastguard Worker 
174*ec779b8eSAndroid Build Coastguard Worker // Return modifiable ResourceInfo for a given client (look up by client id)
175*ec779b8eSAndroid Build Coastguard Worker // from the map of ResourceInfos.
176*ec779b8eSAndroid Build Coastguard Worker // If the item is not in the map, create one and add it to the map.
getResourceInfoForEdit(const ClientInfoParcel & clientInfo,const std::shared_ptr<IResourceManagerClient> & client,ResourceInfos & infos)177*ec779b8eSAndroid Build Coastguard Worker ResourceInfo& getResourceInfoForEdit(const ClientInfoParcel& clientInfo,
178*ec779b8eSAndroid Build Coastguard Worker                                      const std::shared_ptr<IResourceManagerClient>& client,
179*ec779b8eSAndroid Build Coastguard Worker                                      ResourceInfos& infos) {
180*ec779b8eSAndroid Build Coastguard Worker     ResourceInfos::iterator found = infos.find(clientInfo.id);
181*ec779b8eSAndroid Build Coastguard Worker     if (found == infos.end()) {
182*ec779b8eSAndroid Build Coastguard Worker         ResourceInfo info{.pid = clientInfo.pid,
183*ec779b8eSAndroid Build Coastguard Worker                           .uid = static_cast<uid_t>(clientInfo.uid),
184*ec779b8eSAndroid Build Coastguard Worker                           .clientId = clientInfo.id,
185*ec779b8eSAndroid Build Coastguard Worker                           .name = clientInfo.name.empty()? "<unknown client>" : clientInfo.name,
186*ec779b8eSAndroid Build Coastguard Worker                           .client = client,
187*ec779b8eSAndroid Build Coastguard Worker                           .deathNotifier = nullptr,
188*ec779b8eSAndroid Build Coastguard Worker                           .pendingRemoval = false,
189*ec779b8eSAndroid Build Coastguard Worker                           .importance = static_cast<uint32_t>(std::max(0, clientInfo.importance))};
190*ec779b8eSAndroid Build Coastguard Worker         auto [it, inserted] = infos.emplace(clientInfo.id, info);
191*ec779b8eSAndroid Build Coastguard Worker         found = it;
192*ec779b8eSAndroid Build Coastguard Worker     }
193*ec779b8eSAndroid Build Coastguard Worker 
194*ec779b8eSAndroid Build Coastguard Worker     return found->second;
195*ec779b8eSAndroid Build Coastguard Worker }
196*ec779b8eSAndroid Build Coastguard Worker 
197*ec779b8eSAndroid Build Coastguard Worker // Merge resources from r2 into r1.
mergeResources(MediaResourceParcel & r1,const MediaResourceParcel & r2)198*ec779b8eSAndroid Build Coastguard Worker void mergeResources(MediaResourceParcel& r1, const MediaResourceParcel& r2) {
199*ec779b8eSAndroid Build Coastguard Worker     // The resource entry on record is maintained to be in [0,INT64_MAX].
200*ec779b8eSAndroid Build Coastguard Worker     // Clamp if merging in the new resource value causes it to go out of bound.
201*ec779b8eSAndroid Build Coastguard Worker     // Note that the new resource value could be negative, eg.DrmSession, the
202*ec779b8eSAndroid Build Coastguard Worker     // value goes lower when the session is used more often. During reclaim
203*ec779b8eSAndroid Build Coastguard Worker     // the session with the highest value (lowest usage) would be closed.
204*ec779b8eSAndroid Build Coastguard Worker     if (r2.value < INT64_MAX - r1.value) {
205*ec779b8eSAndroid Build Coastguard Worker         r1.value += r2.value;
206*ec779b8eSAndroid Build Coastguard Worker         if (r1.value < 0) {
207*ec779b8eSAndroid Build Coastguard Worker             r1.value = 0;
208*ec779b8eSAndroid Build Coastguard Worker         }
209*ec779b8eSAndroid Build Coastguard Worker     } else {
210*ec779b8eSAndroid Build Coastguard Worker         r1.value = INT64_MAX;
211*ec779b8eSAndroid Build Coastguard Worker     }
212*ec779b8eSAndroid Build Coastguard Worker }
213*ec779b8eSAndroid Build Coastguard Worker 
214*ec779b8eSAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////////
215*ec779b8eSAndroid Build Coastguard Worker ////////////// Death Notifier implementation   ////////////////////////
216*ec779b8eSAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////////
217*ec779b8eSAndroid Build Coastguard Worker 
DeathNotifier(const std::shared_ptr<IResourceManagerClient> & client,const std::weak_ptr<ResourceManagerService> & service,const ClientInfoParcel & clientInfo)218*ec779b8eSAndroid Build Coastguard Worker DeathNotifier::DeathNotifier(const std::shared_ptr<IResourceManagerClient>& client,
219*ec779b8eSAndroid Build Coastguard Worker                              const std::weak_ptr<ResourceManagerService>& service,
220*ec779b8eSAndroid Build Coastguard Worker                              const ClientInfoParcel& clientInfo)
221*ec779b8eSAndroid Build Coastguard Worker     : mClient(client), mService(service), mClientInfo(clientInfo),
222*ec779b8eSAndroid Build Coastguard Worker       mCookie(nullptr),
223*ec779b8eSAndroid Build Coastguard Worker       mDeathRecipient(::ndk::ScopedAIBinder_DeathRecipient(
224*ec779b8eSAndroid Build Coastguard Worker                       AIBinder_DeathRecipient_new(BinderDiedCallback))) {
225*ec779b8eSAndroid Build Coastguard Worker     // Setting callback notification when DeathRecipient gets deleted.
226*ec779b8eSAndroid Build Coastguard Worker     AIBinder_DeathRecipient_setOnUnlinked(mDeathRecipient.get(), BinderUnlinkedCallback);
227*ec779b8eSAndroid Build Coastguard Worker }
228*ec779b8eSAndroid Build Coastguard Worker 
229*ec779b8eSAndroid Build Coastguard Worker //static
BinderUnlinkedCallback(void * cookie)230*ec779b8eSAndroid Build Coastguard Worker void DeathNotifier::BinderUnlinkedCallback(void* cookie) {
231*ec779b8eSAndroid Build Coastguard Worker     BinderDiedContext* context = reinterpret_cast<BinderDiedContext*>(cookie);
232*ec779b8eSAndroid Build Coastguard Worker     // Since we don't need the context anymore, we are deleting it now.
233*ec779b8eSAndroid Build Coastguard Worker     delete context;
234*ec779b8eSAndroid Build Coastguard Worker }
235*ec779b8eSAndroid Build Coastguard Worker 
236*ec779b8eSAndroid Build Coastguard Worker //static
BinderDiedCallback(void * cookie)237*ec779b8eSAndroid Build Coastguard Worker void DeathNotifier::BinderDiedCallback(void* cookie) {
238*ec779b8eSAndroid Build Coastguard Worker     BinderDiedContext* context = reinterpret_cast<BinderDiedContext*>(cookie);
239*ec779b8eSAndroid Build Coastguard Worker 
240*ec779b8eSAndroid Build Coastguard Worker     // Validate the context and check if the DeathNotifier object is still in scope.
241*ec779b8eSAndroid Build Coastguard Worker     if (context != nullptr) {
242*ec779b8eSAndroid Build Coastguard Worker         std::shared_ptr<DeathNotifier> thiz = context->mDeathNotifier.lock();
243*ec779b8eSAndroid Build Coastguard Worker         if (thiz != nullptr) {
244*ec779b8eSAndroid Build Coastguard Worker             thiz->binderDied();
245*ec779b8eSAndroid Build Coastguard Worker         } else {
246*ec779b8eSAndroid Build Coastguard Worker             ALOGI("DeathNotifier is out of scope already");
247*ec779b8eSAndroid Build Coastguard Worker         }
248*ec779b8eSAndroid Build Coastguard Worker     }
249*ec779b8eSAndroid Build Coastguard Worker }
250*ec779b8eSAndroid Build Coastguard Worker 
binderDied()251*ec779b8eSAndroid Build Coastguard Worker void DeathNotifier::binderDied() {
252*ec779b8eSAndroid Build Coastguard Worker     // Don't check for pid validity since we know it's already dead.
253*ec779b8eSAndroid Build Coastguard Worker     std::shared_ptr<ResourceManagerService> service = mService.lock();
254*ec779b8eSAndroid Build Coastguard Worker     if (service == nullptr) {
255*ec779b8eSAndroid Build Coastguard Worker         ALOGW("ResourceManagerService is dead as well.");
256*ec779b8eSAndroid Build Coastguard Worker         return;
257*ec779b8eSAndroid Build Coastguard Worker     }
258*ec779b8eSAndroid Build Coastguard Worker 
259*ec779b8eSAndroid Build Coastguard Worker     service->overridePid(mClientInfo.pid, -1);
260*ec779b8eSAndroid Build Coastguard Worker     // thiz is freed in the call below, so it must be last call referring thiz
261*ec779b8eSAndroid Build Coastguard Worker     service->removeResource(mClientInfo, false /*checkValid*/);
262*ec779b8eSAndroid Build Coastguard Worker }
263*ec779b8eSAndroid Build Coastguard Worker 
binderDied()264*ec779b8eSAndroid Build Coastguard Worker void OverrideProcessInfoDeathNotifier::binderDied() {
265*ec779b8eSAndroid Build Coastguard Worker     // Don't check for pid validity since we know it's already dead.
266*ec779b8eSAndroid Build Coastguard Worker     std::shared_ptr<ResourceManagerService> service = mService.lock();
267*ec779b8eSAndroid Build Coastguard Worker     if (service == nullptr) {
268*ec779b8eSAndroid Build Coastguard Worker         ALOGW("ResourceManagerService is dead as well.");
269*ec779b8eSAndroid Build Coastguard Worker         return;
270*ec779b8eSAndroid Build Coastguard Worker     }
271*ec779b8eSAndroid Build Coastguard Worker 
272*ec779b8eSAndroid Build Coastguard Worker     service->removeProcessInfoOverride(mClientInfo.pid);
273*ec779b8eSAndroid Build Coastguard Worker }
274*ec779b8eSAndroid Build Coastguard Worker 
Create(const std::shared_ptr<IResourceManagerClient> & client,const std::weak_ptr<ResourceManagerService> & service,const ClientInfoParcel & clientInfo,bool overrideProcessInfo)275*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<DeathNotifier> DeathNotifier::Create(
276*ec779b8eSAndroid Build Coastguard Worker     const std::shared_ptr<IResourceManagerClient>& client,
277*ec779b8eSAndroid Build Coastguard Worker     const std::weak_ptr<ResourceManagerService>& service,
278*ec779b8eSAndroid Build Coastguard Worker     const ClientInfoParcel& clientInfo,
279*ec779b8eSAndroid Build Coastguard Worker     bool overrideProcessInfo) {
280*ec779b8eSAndroid Build Coastguard Worker     std::shared_ptr<DeathNotifier> deathNotifier = nullptr;
281*ec779b8eSAndroid Build Coastguard Worker     if (overrideProcessInfo) {
282*ec779b8eSAndroid Build Coastguard Worker         deathNotifier = std::make_shared<OverrideProcessInfoDeathNotifier>(
283*ec779b8eSAndroid Build Coastguard Worker             client, service, clientInfo);
284*ec779b8eSAndroid Build Coastguard Worker     } else {
285*ec779b8eSAndroid Build Coastguard Worker         deathNotifier = std::make_shared<DeathNotifier>(client, service, clientInfo);
286*ec779b8eSAndroid Build Coastguard Worker     }
287*ec779b8eSAndroid Build Coastguard Worker 
288*ec779b8eSAndroid Build Coastguard Worker     if (deathNotifier) {
289*ec779b8eSAndroid Build Coastguard Worker         deathNotifier->link();
290*ec779b8eSAndroid Build Coastguard Worker     }
291*ec779b8eSAndroid Build Coastguard Worker 
292*ec779b8eSAndroid Build Coastguard Worker     return deathNotifier;
293*ec779b8eSAndroid Build Coastguard Worker }
294*ec779b8eSAndroid Build Coastguard Worker 
notifyResourceGranted(int pid,const std::vector<MediaResourceParcel> & resources)295*ec779b8eSAndroid Build Coastguard Worker void notifyResourceGranted(int pid, const std::vector<MediaResourceParcel>& resources) {
296*ec779b8eSAndroid Build Coastguard Worker     static const char* const kServiceName = "media_resource_monitor";
297*ec779b8eSAndroid Build Coastguard Worker     sp<IBinder> binder = defaultServiceManager()->checkService(String16(kServiceName));
298*ec779b8eSAndroid Build Coastguard Worker     if (binder != NULL) {
299*ec779b8eSAndroid Build Coastguard Worker         sp<IMediaResourceMonitor> service = interface_cast<IMediaResourceMonitor>(binder);
300*ec779b8eSAndroid Build Coastguard Worker         for (size_t i = 0; i < resources.size(); ++i) {
301*ec779b8eSAndroid Build Coastguard Worker             switch (resources[i].subType) {
302*ec779b8eSAndroid Build Coastguard Worker                 case MediaResource::SubType::kHwAudioCodec:
303*ec779b8eSAndroid Build Coastguard Worker                 case MediaResource::SubType::kSwAudioCodec:
304*ec779b8eSAndroid Build Coastguard Worker                     service->notifyResourceGranted(pid, IMediaResourceMonitor::TYPE_AUDIO_CODEC);
305*ec779b8eSAndroid Build Coastguard Worker                     break;
306*ec779b8eSAndroid Build Coastguard Worker                 case MediaResource::SubType::kHwVideoCodec:
307*ec779b8eSAndroid Build Coastguard Worker                 case MediaResource::SubType::kSwVideoCodec:
308*ec779b8eSAndroid Build Coastguard Worker                     service->notifyResourceGranted(pid, IMediaResourceMonitor::TYPE_VIDEO_CODEC);
309*ec779b8eSAndroid Build Coastguard Worker                     break;
310*ec779b8eSAndroid Build Coastguard Worker                 case MediaResource::SubType::kHwImageCodec:
311*ec779b8eSAndroid Build Coastguard Worker                 case MediaResource::SubType::kSwImageCodec:
312*ec779b8eSAndroid Build Coastguard Worker                     service->notifyResourceGranted(pid, IMediaResourceMonitor::TYPE_IMAGE_CODEC);
313*ec779b8eSAndroid Build Coastguard Worker                     break;
314*ec779b8eSAndroid Build Coastguard Worker                 case MediaResource::SubType::kUnspecifiedSubType:
315*ec779b8eSAndroid Build Coastguard Worker                     break;
316*ec779b8eSAndroid Build Coastguard Worker             }
317*ec779b8eSAndroid Build Coastguard Worker         }
318*ec779b8eSAndroid Build Coastguard Worker     }
319*ec779b8eSAndroid Build Coastguard Worker }
320*ec779b8eSAndroid Build Coastguard Worker 
321*ec779b8eSAndroid Build Coastguard Worker } // namespace android
322