xref: /aosp_15_r20/frameworks/av/services/mediaresourcemanager/ResourceTracker.h (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 #ifndef ANDROID_MEDIA_RESOURCETRACKER_H_
19*ec779b8eSAndroid Build Coastguard Worker #define ANDROID_MEDIA_RESOURCETRACKER_H_
20*ec779b8eSAndroid Build Coastguard Worker 
21*ec779b8eSAndroid Build Coastguard Worker #include <map>
22*ec779b8eSAndroid Build Coastguard Worker #include <memory>
23*ec779b8eSAndroid Build Coastguard Worker #include <string>
24*ec779b8eSAndroid Build Coastguard Worker #include <vector>
25*ec779b8eSAndroid Build Coastguard Worker #include <media/MediaResource.h>
26*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/media/ClientInfoParcel.h>
27*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/media/IResourceManagerClient.h>
28*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/media/MediaResourceParcel.h>
29*ec779b8eSAndroid Build Coastguard Worker 
30*ec779b8eSAndroid Build Coastguard Worker #include "ResourceManagerServiceUtils.h"
31*ec779b8eSAndroid Build Coastguard Worker 
32*ec779b8eSAndroid Build Coastguard Worker namespace android {
33*ec779b8eSAndroid Build Coastguard Worker 
34*ec779b8eSAndroid Build Coastguard Worker class DeathNotifier;
35*ec779b8eSAndroid Build Coastguard Worker class ResourceManagerServiceNew;
36*ec779b8eSAndroid Build Coastguard Worker class ResourceObserverService;
37*ec779b8eSAndroid Build Coastguard Worker struct ProcessInfoInterface;
38*ec779b8eSAndroid Build Coastguard Worker struct ResourceRequestInfo;
39*ec779b8eSAndroid Build Coastguard Worker struct ClientInfo;
40*ec779b8eSAndroid Build Coastguard Worker 
41*ec779b8eSAndroid Build Coastguard Worker /*
42*ec779b8eSAndroid Build Coastguard Worker  * ResourceTracker abstracts the resources managed by the ResourceManager.
43*ec779b8eSAndroid Build Coastguard Worker  * It keeps track of the resource used by the clients (clientid) and by the process (pid)
44*ec779b8eSAndroid Build Coastguard Worker  */
45*ec779b8eSAndroid Build Coastguard Worker class ResourceTracker {
46*ec779b8eSAndroid Build Coastguard Worker public:
47*ec779b8eSAndroid Build Coastguard Worker     ResourceTracker(const std::shared_ptr<ResourceManagerServiceNew>& service,
48*ec779b8eSAndroid Build Coastguard Worker                     const sp<ProcessInfoInterface>& processInfo);
49*ec779b8eSAndroid Build Coastguard Worker     ~ResourceTracker();
50*ec779b8eSAndroid Build Coastguard Worker 
51*ec779b8eSAndroid Build Coastguard Worker     /**
52*ec779b8eSAndroid Build Coastguard Worker      * Add or update resources for |clientInfo|.
53*ec779b8eSAndroid Build Coastguard Worker      *
54*ec779b8eSAndroid Build Coastguard Worker      * If |clientInfo| is not tracked yet, it records its associated |client| and adds
55*ec779b8eSAndroid Build Coastguard Worker      * |resources| to the tracked resources. If |clientInfo| is already tracked,
56*ec779b8eSAndroid Build Coastguard Worker      * it updates the tracked resources by adding |resources| to them (|client| in
57*ec779b8eSAndroid Build Coastguard Worker      * this case is unused and unchecked).
58*ec779b8eSAndroid Build Coastguard Worker      *
59*ec779b8eSAndroid Build Coastguard Worker      * @param clientInfo Info of the calling client.
60*ec779b8eSAndroid Build Coastguard Worker      * @param client Interface for the client.
61*ec779b8eSAndroid Build Coastguard Worker      * @param resources An array of resources to be added.
62*ec779b8eSAndroid Build Coastguard Worker      *
63*ec779b8eSAndroid Build Coastguard Worker      * @return true upon successfully adding/updating the resources, false
64*ec779b8eSAndroid Build Coastguard Worker      * otherwise.
65*ec779b8eSAndroid Build Coastguard Worker      */
66*ec779b8eSAndroid Build Coastguard Worker     bool addResource(const aidl::android::media::ClientInfoParcel& clientInfo,
67*ec779b8eSAndroid Build Coastguard Worker                      const std::shared_ptr<::aidl::android::media::IResourceManagerClient>& client,
68*ec779b8eSAndroid Build Coastguard Worker                      const std::vector<::aidl::android::media::MediaResourceParcel>& resources);
69*ec779b8eSAndroid Build Coastguard Worker 
70*ec779b8eSAndroid Build Coastguard Worker     // Update the resource info, if there is any changes.
71*ec779b8eSAndroid Build Coastguard Worker     bool updateResource(const aidl::android::media::ClientInfoParcel& clientInfo);
72*ec779b8eSAndroid Build Coastguard Worker 
73*ec779b8eSAndroid Build Coastguard Worker     // Remove a set of resources from the given client.
74*ec779b8eSAndroid Build Coastguard Worker     // returns true on success, false otherwise.
75*ec779b8eSAndroid Build Coastguard Worker     bool removeResource(const aidl::android::media::ClientInfoParcel& clientInfo,
76*ec779b8eSAndroid Build Coastguard Worker                         const std::vector<::aidl::android::media::MediaResourceParcel>& resources);
77*ec779b8eSAndroid Build Coastguard Worker 
78*ec779b8eSAndroid Build Coastguard Worker     /**
79*ec779b8eSAndroid Build Coastguard Worker      * Remove all resources tracked for |clientInfo|.
80*ec779b8eSAndroid Build Coastguard Worker      *
81*ec779b8eSAndroid Build Coastguard Worker      * If |validateCallingPid| is true, the (pid of the) calling process is validated that it
82*ec779b8eSAndroid Build Coastguard Worker      * is from a trusted process.
83*ec779b8eSAndroid Build Coastguard Worker      * Returns true on success (|clientInfo| was tracked and optionally the caller
84*ec779b8eSAndroid Build Coastguard Worker      * was a validated trusted process), false otherwise (|clientInfo| was not tracked,
85*ec779b8eSAndroid Build Coastguard Worker      * or the caller was not a trusted process)
86*ec779b8eSAndroid Build Coastguard Worker      */
87*ec779b8eSAndroid Build Coastguard Worker     bool removeResource(const aidl::android::media::ClientInfoParcel& clientInfo,
88*ec779b8eSAndroid Build Coastguard Worker                         bool validateCallingPid);
89*ec779b8eSAndroid Build Coastguard Worker 
90*ec779b8eSAndroid Build Coastguard Worker     // Mark the client for pending removal.
91*ec779b8eSAndroid Build Coastguard Worker     // Such clients are primary candidate for reclaim.
92*ec779b8eSAndroid Build Coastguard Worker     // returns true on success, false otherwise.
93*ec779b8eSAndroid Build Coastguard Worker     bool markClientForPendingRemoval(const aidl::android::media::ClientInfoParcel& clientInfo);
94*ec779b8eSAndroid Build Coastguard Worker 
95*ec779b8eSAndroid Build Coastguard Worker     // Get a list of clients that belong to process with given pid and are maked to be
96*ec779b8eSAndroid Build Coastguard Worker     // pending removal by markClientForPendingRemoval.
97*ec779b8eSAndroid Build Coastguard Worker     // returns true on success, false otherwise.
98*ec779b8eSAndroid Build Coastguard Worker     bool getClientsMarkedPendingRemoval(int32_t pid, std::vector<ClientInfo>& targetClients);
99*ec779b8eSAndroid Build Coastguard Worker 
100*ec779b8eSAndroid Build Coastguard Worker     // Override the pid of originalPid with newPid
101*ec779b8eSAndroid Build Coastguard Worker     // To remove the pid entry from the override list, set newPid as -1
102*ec779b8eSAndroid Build Coastguard Worker     // returns true on successful override, false otherwise.
103*ec779b8eSAndroid Build Coastguard Worker     bool overridePid(int originalPid, int newPid);
104*ec779b8eSAndroid Build Coastguard Worker 
105*ec779b8eSAndroid Build Coastguard Worker     // Override the process info {state, oom score} of the process with pid.
106*ec779b8eSAndroid Build Coastguard Worker     // returns true on success, false otherwise.
107*ec779b8eSAndroid Build Coastguard Worker     bool overrideProcessInfo(
108*ec779b8eSAndroid Build Coastguard Worker             const std::shared_ptr<aidl::android::media::IResourceManagerClient>& client,
109*ec779b8eSAndroid Build Coastguard Worker             int pid, int procState, int oomScore);
110*ec779b8eSAndroid Build Coastguard Worker 
111*ec779b8eSAndroid Build Coastguard Worker     // Remove the overridden process info.
112*ec779b8eSAndroid Build Coastguard Worker     void removeProcessInfoOverride(int pid);
113*ec779b8eSAndroid Build Coastguard Worker 
114*ec779b8eSAndroid Build Coastguard Worker     // Find all clients that have given resources.
115*ec779b8eSAndroid Build Coastguard Worker     // If applicable, match the primary type too.
116*ec779b8eSAndroid Build Coastguard Worker     // The |clients| (list) isn't cleared by this function to allow calling this
117*ec779b8eSAndroid Build Coastguard Worker     // function multiple times for different resources.
118*ec779b8eSAndroid Build Coastguard Worker     // returns true upon finding at lease one client with the given resource request info,
119*ec779b8eSAndroid Build Coastguard Worker     // false otherwise (no clients)
120*ec779b8eSAndroid Build Coastguard Worker     bool getAllClients(
121*ec779b8eSAndroid Build Coastguard Worker             const ResourceRequestInfo& resourceRequestInfo,
122*ec779b8eSAndroid Build Coastguard Worker             std::vector<ClientInfo>& clients,
123*ec779b8eSAndroid Build Coastguard Worker             MediaResource::SubType primarySubType = MediaResource::SubType::kUnspecifiedSubType);
124*ec779b8eSAndroid Build Coastguard Worker 
125*ec779b8eSAndroid Build Coastguard Worker     // Look for the lowest priority process with the given resources.
126*ec779b8eSAndroid Build Coastguard Worker     // Upon success lowestPriorityPid and lowestPriority are
127*ec779b8eSAndroid Build Coastguard Worker     // set accordingly and it returns true.
128*ec779b8eSAndroid Build Coastguard Worker     // If there isn't a lower priority process with the given resources, it will return false
129*ec779b8eSAndroid Build Coastguard Worker     // with out updating lowestPriorityPid and lowerPriority.
130*ec779b8eSAndroid Build Coastguard Worker     bool getLowestPriorityPid(MediaResource::Type type, MediaResource::SubType subType,
131*ec779b8eSAndroid Build Coastguard Worker                               int& lowestPriorityPid, int& lowestPriority);
132*ec779b8eSAndroid Build Coastguard Worker 
133*ec779b8eSAndroid Build Coastguard Worker     // Look for the lowest priority process with the given resources
134*ec779b8eSAndroid Build Coastguard Worker     // among the given client list.
135*ec779b8eSAndroid Build Coastguard Worker     // If applicable, match the primary type too.
136*ec779b8eSAndroid Build Coastguard Worker     // returns true on success, false otherwise.
137*ec779b8eSAndroid Build Coastguard Worker     bool getLowestPriorityPid(
138*ec779b8eSAndroid Build Coastguard Worker             MediaResource::Type type, MediaResource::SubType subType,
139*ec779b8eSAndroid Build Coastguard Worker             MediaResource::SubType primarySubType,
140*ec779b8eSAndroid Build Coastguard Worker             const std::vector<ClientInfo>& clients,
141*ec779b8eSAndroid Build Coastguard Worker             int& lowestPriorityPid, int& lowestPriority);
142*ec779b8eSAndroid Build Coastguard Worker 
143*ec779b8eSAndroid Build Coastguard Worker     // Find the biggest client of the given process with given resources,
144*ec779b8eSAndroid Build Coastguard Worker     // that is marked as pending to be removed.
145*ec779b8eSAndroid Build Coastguard Worker     // returns true on success, false otherwise.
146*ec779b8eSAndroid Build Coastguard Worker     bool getBiggestClientPendingRemoval(
147*ec779b8eSAndroid Build Coastguard Worker             int pid, MediaResource::Type type,
148*ec779b8eSAndroid Build Coastguard Worker             MediaResource::SubType subType,
149*ec779b8eSAndroid Build Coastguard Worker             ClientInfo& clientInfo);
150*ec779b8eSAndroid Build Coastguard Worker 
151*ec779b8eSAndroid Build Coastguard Worker     // Find the biggest client from the process pid, selecting them from the list of clients.
152*ec779b8eSAndroid Build Coastguard Worker     // If applicable, match the primary type too.
153*ec779b8eSAndroid Build Coastguard Worker     // Returns true when a client is found and clientInfo is updated accordingly.
154*ec779b8eSAndroid Build Coastguard Worker     // Upon failure to find a client, it will return false without updating
155*ec779b8eSAndroid Build Coastguard Worker     // clientInfo.
156*ec779b8eSAndroid Build Coastguard Worker     // Upon failure to find a client, it will return false.
157*ec779b8eSAndroid Build Coastguard Worker     bool getBiggestClient(
158*ec779b8eSAndroid Build Coastguard Worker             int targetPid,
159*ec779b8eSAndroid Build Coastguard Worker             MediaResource::Type type,
160*ec779b8eSAndroid Build Coastguard Worker             MediaResource::SubType subType,
161*ec779b8eSAndroid Build Coastguard Worker             const std::vector<ClientInfo>& clients,
162*ec779b8eSAndroid Build Coastguard Worker             ClientInfo& clientInfo,
163*ec779b8eSAndroid Build Coastguard Worker             MediaResource::SubType primarySubType = MediaResource::SubType::kUnspecifiedSubType);
164*ec779b8eSAndroid Build Coastguard Worker 
165*ec779b8eSAndroid Build Coastguard Worker     // Find the biggest client from the process pid, that has the least importance
166*ec779b8eSAndroid Build Coastguard Worker     // (than given importance) among the given list of clients.
167*ec779b8eSAndroid Build Coastguard Worker     // If applicable, match the primary type too.
168*ec779b8eSAndroid Build Coastguard Worker     // returns true on success, false otherwise.
169*ec779b8eSAndroid Build Coastguard Worker     bool getLeastImportantBiggestClient(int targetPid, int32_t importance,
170*ec779b8eSAndroid Build Coastguard Worker                                         MediaResource::Type type,
171*ec779b8eSAndroid Build Coastguard Worker                                         MediaResource::SubType subType,
172*ec779b8eSAndroid Build Coastguard Worker                                         MediaResource::SubType primarySubType,
173*ec779b8eSAndroid Build Coastguard Worker                                         const std::vector<ClientInfo>& clients,
174*ec779b8eSAndroid Build Coastguard Worker                                         ClientInfo& clientInfo);
175*ec779b8eSAndroid Build Coastguard Worker 
176*ec779b8eSAndroid Build Coastguard Worker     // Find the client that belongs to given process(pid) and with the given clientId.
177*ec779b8eSAndroid Build Coastguard Worker     // A nullptr is returned upon failure to find the client.
178*ec779b8eSAndroid Build Coastguard Worker     std::shared_ptr<::aidl::android::media::IResourceManagerClient> getClient(
179*ec779b8eSAndroid Build Coastguard Worker             int pid, const int64_t& clientId) const;
180*ec779b8eSAndroid Build Coastguard Worker 
181*ec779b8eSAndroid Build Coastguard Worker     // Removes the client from the given process(pid) with the given clientId.
182*ec779b8eSAndroid Build Coastguard Worker     // returns true on success, false otherwise.
183*ec779b8eSAndroid Build Coastguard Worker     bool removeClient(int pid, const int64_t& clientId);
184*ec779b8eSAndroid Build Coastguard Worker 
185*ec779b8eSAndroid Build Coastguard Worker     // Set the resource observer service, to which to notify when the resources
186*ec779b8eSAndroid Build Coastguard Worker     // are added and removed.
187*ec779b8eSAndroid Build Coastguard Worker     void setResourceObserverService(
188*ec779b8eSAndroid Build Coastguard Worker             const std::shared_ptr<ResourceObserverService>& observerService);
189*ec779b8eSAndroid Build Coastguard Worker 
190*ec779b8eSAndroid Build Coastguard Worker     // Dump all the resource allocations for all the processes into a given string
191*ec779b8eSAndroid Build Coastguard Worker     void dump(std::string& resourceLogs);
192*ec779b8eSAndroid Build Coastguard Worker 
193*ec779b8eSAndroid Build Coastguard Worker     // get the priority of the process.
194*ec779b8eSAndroid Build Coastguard Worker     // If we can't get the priority of the process (with given pid), it will
195*ec779b8eSAndroid Build Coastguard Worker     // return false.
196*ec779b8eSAndroid Build Coastguard Worker     bool getPriority(int pid, int* priority);
197*ec779b8eSAndroid Build Coastguard Worker 
198*ec779b8eSAndroid Build Coastguard Worker     // Check if the given resource request has conflicting clients.
199*ec779b8eSAndroid Build Coastguard Worker     // The resource conflict is defined by the ResourceModel (such as
200*ec779b8eSAndroid Build Coastguard Worker     // co-existence of secure codec with another secure or non-secure codec).
201*ec779b8eSAndroid Build Coastguard Worker     // But here, the ResourceTracker only looks for resources from lower
202*ec779b8eSAndroid Build Coastguard Worker     // priority processes.
203*ec779b8eSAndroid Build Coastguard Worker     // If is/are only higher or same priority process/es with the given resource,
204*ec779b8eSAndroid Build Coastguard Worker     // it will return false.
205*ec779b8eSAndroid Build Coastguard Worker     // Otherwise, adds all the clients to the list of clients and return true.
206*ec779b8eSAndroid Build Coastguard Worker     bool getNonConflictingClients(const ResourceRequestInfo& resourceRequestInfo,
207*ec779b8eSAndroid Build Coastguard Worker                                   std::vector<ClientInfo>& clients);
208*ec779b8eSAndroid Build Coastguard Worker 
209*ec779b8eSAndroid Build Coastguard Worker     // Returns unmodifiable reference to the resource map.
getResourceMap()210*ec779b8eSAndroid Build Coastguard Worker     const std::map<int, ResourceInfos>& getResourceMap() const {
211*ec779b8eSAndroid Build Coastguard Worker         return mMap;
212*ec779b8eSAndroid Build Coastguard Worker     }
213*ec779b8eSAndroid Build Coastguard Worker 
214*ec779b8eSAndroid Build Coastguard Worker private:
215*ec779b8eSAndroid Build Coastguard Worker     // Get ResourceInfos associated with the given process.
216*ec779b8eSAndroid Build Coastguard Worker     // If none exists, this method will create and associate an empty object and return it.
217*ec779b8eSAndroid Build Coastguard Worker     ResourceInfos& getResourceInfosForEdit(int pid);
218*ec779b8eSAndroid Build Coastguard Worker 
219*ec779b8eSAndroid Build Coastguard Worker     // A helper function that returns true if the callingPid has higher priority than pid.
220*ec779b8eSAndroid Build Coastguard Worker     // Returns false otherwise.
221*ec779b8eSAndroid Build Coastguard Worker     bool isCallingPriorityHigher(int callingPid, int pid);
222*ec779b8eSAndroid Build Coastguard Worker 
223*ec779b8eSAndroid Build Coastguard Worker     // Locate the resource info corresponding to the process pid and
224*ec779b8eSAndroid Build Coastguard Worker     // the client clientId.
225*ec779b8eSAndroid Build Coastguard Worker     const ResourceInfo* getResourceInfo(int pid, const int64_t& clientId) const;
226*ec779b8eSAndroid Build Coastguard Worker 
227*ec779b8eSAndroid Build Coastguard Worker     // Notify when a resource is added for the first time.
228*ec779b8eSAndroid Build Coastguard Worker     void onFirstAdded(const MediaResourceParcel& resource, uid_t uid);
229*ec779b8eSAndroid Build Coastguard Worker     // Notify when a resource is removed for the last time.
230*ec779b8eSAndroid Build Coastguard Worker     void onLastRemoved(const MediaResourceParcel& resource, uid_t uid);
231*ec779b8eSAndroid Build Coastguard Worker 
232*ec779b8eSAndroid Build Coastguard Worker private:
233*ec779b8eSAndroid Build Coastguard Worker     // Structure that defines process info that needs to be overridden.
234*ec779b8eSAndroid Build Coastguard Worker     struct ProcessInfoOverride {
235*ec779b8eSAndroid Build Coastguard Worker         std::shared_ptr<DeathNotifier> deathNotifier = nullptr;
236*ec779b8eSAndroid Build Coastguard Worker         std::shared_ptr<::aidl::android::media::IResourceManagerClient> client;
237*ec779b8eSAndroid Build Coastguard Worker     };
238*ec779b8eSAndroid Build Coastguard Worker 
239*ec779b8eSAndroid Build Coastguard Worker     // Map of Resource information indexed through the process id.
240*ec779b8eSAndroid Build Coastguard Worker     std::map<int, ResourceInfos> mMap;
241*ec779b8eSAndroid Build Coastguard Worker     // A weak reference (to avoid cyclic dependency) to the ResourceManagerService.
242*ec779b8eSAndroid Build Coastguard Worker     // ResourceTracker uses this to communicate back with the ResourceManagerService.
243*ec779b8eSAndroid Build Coastguard Worker     std::weak_ptr<ResourceManagerServiceNew> mService;
244*ec779b8eSAndroid Build Coastguard Worker     // To notify the ResourceObserverService abour resources are added or removed.
245*ec779b8eSAndroid Build Coastguard Worker     std::shared_ptr<ResourceObserverService> mObserverService;
246*ec779b8eSAndroid Build Coastguard Worker     // Map of pid and their overrided id.
247*ec779b8eSAndroid Build Coastguard Worker     std::map<int, int> mOverridePidMap;
248*ec779b8eSAndroid Build Coastguard Worker     // Map of pid and their overridden process info.
249*ec779b8eSAndroid Build Coastguard Worker     std::map<pid_t, ProcessInfoOverride> mProcessInfoOverrideMap;
250*ec779b8eSAndroid Build Coastguard Worker     // Interface that gets process specific information.
251*ec779b8eSAndroid Build Coastguard Worker     sp<ProcessInfoInterface> mProcessInfo;
252*ec779b8eSAndroid Build Coastguard Worker };
253*ec779b8eSAndroid Build Coastguard Worker 
254*ec779b8eSAndroid Build Coastguard Worker } // namespace android
255*ec779b8eSAndroid Build Coastguard Worker 
256*ec779b8eSAndroid Build Coastguard Worker #endif // ANDROID_MEDIA_RESOURCETRACKER_H_
257