xref: /aosp_15_r20/frameworks/av/services/mediaresourcemanager/ResourceManagerServiceNew.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_RESOURCEMANAGERSERVICENEW_H
19*ec779b8eSAndroid Build Coastguard Worker #define ANDROID_MEDIA_RESOURCEMANAGERSERVICENEW_H
20*ec779b8eSAndroid Build Coastguard Worker 
21*ec779b8eSAndroid Build Coastguard Worker #include "ResourceManagerService.h"
22*ec779b8eSAndroid Build Coastguard Worker 
23*ec779b8eSAndroid Build Coastguard Worker namespace android {
24*ec779b8eSAndroid Build Coastguard Worker 
25*ec779b8eSAndroid Build Coastguard Worker class IReclaimPolicy;
26*ec779b8eSAndroid Build Coastguard Worker class IResourceModel;
27*ec779b8eSAndroid Build Coastguard Worker class ResourceTracker;
28*ec779b8eSAndroid Build Coastguard Worker 
29*ec779b8eSAndroid Build Coastguard Worker //
30*ec779b8eSAndroid Build Coastguard Worker // A newer implementation of IResourceManagerService, which
31*ec779b8eSAndroid Build Coastguard Worker // eventually will replace the older implementation in ResourceManagerService.
32*ec779b8eSAndroid Build Coastguard Worker //
33*ec779b8eSAndroid Build Coastguard Worker // To make the transition easier, this implementation overrides the
34*ec779b8eSAndroid Build Coastguard Worker // private virtual methods from ResourceManagerService.
35*ec779b8eSAndroid Build Coastguard Worker //
36*ec779b8eSAndroid Build Coastguard Worker // This implementation is devised to abstract and integrate:
37*ec779b8eSAndroid Build Coastguard Worker //   - resources into an independent abstraction
38*ec779b8eSAndroid Build Coastguard Worker //   - resource model as a separate interface (and implementation)
39*ec779b8eSAndroid Build Coastguard Worker //   - reclaim policy as a separate interface (and implementation)
40*ec779b8eSAndroid Build Coastguard Worker //
41*ec779b8eSAndroid Build Coastguard Worker class ResourceManagerServiceNew : public ResourceManagerService {
42*ec779b8eSAndroid Build Coastguard Worker public:
43*ec779b8eSAndroid Build Coastguard Worker 
44*ec779b8eSAndroid Build Coastguard Worker     explicit ResourceManagerServiceNew(const sp<ProcessInfoInterface>& processInfo,
45*ec779b8eSAndroid Build Coastguard Worker                                        const sp<SystemCallbackInterface>& systemResource);
46*ec779b8eSAndroid Build Coastguard Worker     virtual ~ResourceManagerServiceNew();
47*ec779b8eSAndroid Build Coastguard Worker 
48*ec779b8eSAndroid Build Coastguard Worker     // IResourceManagerService interface
49*ec779b8eSAndroid Build Coastguard Worker     Status config(const std::vector<MediaResourcePolicyParcel>& policies) override;
50*ec779b8eSAndroid Build Coastguard Worker 
51*ec779b8eSAndroid Build Coastguard Worker     Status addResource(const ClientInfoParcel& clientInfo,
52*ec779b8eSAndroid Build Coastguard Worker                        const std::shared_ptr<IResourceManagerClient>& client,
53*ec779b8eSAndroid Build Coastguard Worker                        const std::vector<MediaResourceParcel>& resources) override;
54*ec779b8eSAndroid Build Coastguard Worker 
55*ec779b8eSAndroid Build Coastguard Worker     Status removeResource(const ClientInfoParcel& clientInfo,
56*ec779b8eSAndroid Build Coastguard Worker                           const std::vector<MediaResourceParcel>& resources) override;
57*ec779b8eSAndroid Build Coastguard Worker 
58*ec779b8eSAndroid Build Coastguard Worker     Status removeClient(const ClientInfoParcel& clientInfo) override;
59*ec779b8eSAndroid Build Coastguard Worker 
60*ec779b8eSAndroid Build Coastguard Worker     Status reclaimResource(const ClientInfoParcel& clientInfo,
61*ec779b8eSAndroid Build Coastguard Worker                            const std::vector<MediaResourceParcel>& resources,
62*ec779b8eSAndroid Build Coastguard Worker                            bool* _aidl_return) override;
63*ec779b8eSAndroid Build Coastguard Worker 
64*ec779b8eSAndroid Build Coastguard Worker     Status overridePid(int32_t originalPid, int32_t newPid) override;
65*ec779b8eSAndroid Build Coastguard Worker 
66*ec779b8eSAndroid Build Coastguard Worker     Status overrideProcessInfo(const std::shared_ptr<IResourceManagerClient>& client,
67*ec779b8eSAndroid Build Coastguard Worker                                int32_t pid, int32_t procState, int32_t oomScore) override;
68*ec779b8eSAndroid Build Coastguard Worker 
69*ec779b8eSAndroid Build Coastguard Worker     Status markClientForPendingRemoval(const ClientInfoParcel& clientInfo) override;
70*ec779b8eSAndroid Build Coastguard Worker 
71*ec779b8eSAndroid Build Coastguard Worker     Status reclaimResourcesFromClientsPendingRemoval(int32_t pid) override;
72*ec779b8eSAndroid Build Coastguard Worker 
73*ec779b8eSAndroid Build Coastguard Worker     Status notifyClientCreated(const ClientInfoParcel& clientInfo) override;
74*ec779b8eSAndroid Build Coastguard Worker 
75*ec779b8eSAndroid Build Coastguard Worker     Status notifyClientStarted(const ClientConfigParcel& clientConfig) override;
76*ec779b8eSAndroid Build Coastguard Worker 
77*ec779b8eSAndroid Build Coastguard Worker     Status notifyClientStopped(const ClientConfigParcel& clientConfig) override;
78*ec779b8eSAndroid Build Coastguard Worker 
79*ec779b8eSAndroid Build Coastguard Worker     Status notifyClientConfigChanged(const ClientConfigParcel& clientConfig) override;
80*ec779b8eSAndroid Build Coastguard Worker 
81*ec779b8eSAndroid Build Coastguard Worker     binder_status_t dump(int fd, const char** args, uint32_t numArgs) override;
82*ec779b8eSAndroid Build Coastguard Worker 
83*ec779b8eSAndroid Build Coastguard Worker     friend class ResourceTracker;
84*ec779b8eSAndroid Build Coastguard Worker 
85*ec779b8eSAndroid Build Coastguard Worker private:
86*ec779b8eSAndroid Build Coastguard Worker 
87*ec779b8eSAndroid Build Coastguard Worker     // Set up the Resource models.
88*ec779b8eSAndroid Build Coastguard Worker     void setUpResourceModels();
89*ec779b8eSAndroid Build Coastguard Worker 
90*ec779b8eSAndroid Build Coastguard Worker     // Set up the Reclaim Policies.
91*ec779b8eSAndroid Build Coastguard Worker     void setUpReclaimPolicies();
92*ec779b8eSAndroid Build Coastguard Worker 
93*ec779b8eSAndroid Build Coastguard Worker     // From the list of clients, pick/select client(s) based on the reclaim policy.
94*ec779b8eSAndroid Build Coastguard Worker     void getClientForResource_l(
95*ec779b8eSAndroid Build Coastguard Worker         const ReclaimRequestInfo& reclaimRequestInfo,
96*ec779b8eSAndroid Build Coastguard Worker         const std::vector<ClientInfo>& clients,
97*ec779b8eSAndroid Build Coastguard Worker         std::vector<ClientInfo>& targetClients);
98*ec779b8eSAndroid Build Coastguard Worker 
99*ec779b8eSAndroid Build Coastguard Worker     // Initializes the internal state of the ResourceManagerService
100*ec779b8eSAndroid Build Coastguard Worker     void init() override;
101*ec779b8eSAndroid Build Coastguard Worker 
102*ec779b8eSAndroid Build Coastguard Worker     void setObserverService(
103*ec779b8eSAndroid Build Coastguard Worker             const std::shared_ptr<ResourceObserverService>& observerService) override;
104*ec779b8eSAndroid Build Coastguard Worker 
105*ec779b8eSAndroid Build Coastguard Worker     // Gets the list of all the clients who own the specified resource type.
106*ec779b8eSAndroid Build Coastguard Worker     // Returns false if any client belongs to a process with higher priority than the
107*ec779b8eSAndroid Build Coastguard Worker     // calling process. The clients will remain unchanged if returns false.
108*ec779b8eSAndroid Build Coastguard Worker     bool getTargetClients(
109*ec779b8eSAndroid Build Coastguard Worker         const ClientInfoParcel& clientInfo,
110*ec779b8eSAndroid Build Coastguard Worker         const std::vector<MediaResourceParcel>& resources,
111*ec779b8eSAndroid Build Coastguard Worker         std::vector<ClientInfo>& targetClients) override;
112*ec779b8eSAndroid Build Coastguard Worker 
113*ec779b8eSAndroid Build Coastguard Worker     // Removes the pid from the override map.
114*ec779b8eSAndroid Build Coastguard Worker     void removeProcessInfoOverride(int pid) override;
115*ec779b8eSAndroid Build Coastguard Worker 
116*ec779b8eSAndroid Build Coastguard Worker     // override the pid of given process
117*ec779b8eSAndroid Build Coastguard Worker     bool overridePid_l(int32_t originalPid, int32_t newPid) override;
118*ec779b8eSAndroid Build Coastguard Worker 
119*ec779b8eSAndroid Build Coastguard Worker     // override the process info of given process
120*ec779b8eSAndroid Build Coastguard Worker     bool overrideProcessInfo_l(const std::shared_ptr<IResourceManagerClient>& client,
121*ec779b8eSAndroid Build Coastguard Worker                                int pid, int procState, int oomScore) override;
122*ec779b8eSAndroid Build Coastguard Worker 
123*ec779b8eSAndroid Build Coastguard Worker     // Get priority from process's pid
124*ec779b8eSAndroid Build Coastguard Worker     bool getPriority_l(int pid, int* priority) const override;
125*ec779b8eSAndroid Build Coastguard Worker 
126*ec779b8eSAndroid Build Coastguard Worker     // Get the client for given pid and the clientId from the map
127*ec779b8eSAndroid Build Coastguard Worker     std::shared_ptr<IResourceManagerClient> getClient_l(
128*ec779b8eSAndroid Build Coastguard Worker         int pid, const int64_t& clientId) const override;
129*ec779b8eSAndroid Build Coastguard Worker 
130*ec779b8eSAndroid Build Coastguard Worker     // Remove the client for given pid and the clientId from the map
131*ec779b8eSAndroid Build Coastguard Worker     bool removeClient_l(int pid, const int64_t& clientId) override;
132*ec779b8eSAndroid Build Coastguard Worker 
133*ec779b8eSAndroid Build Coastguard Worker     // Get all the resource status for dump
134*ec779b8eSAndroid Build Coastguard Worker     void getResourceDump(std::string& resourceLog) const override;
135*ec779b8eSAndroid Build Coastguard Worker 
136*ec779b8eSAndroid Build Coastguard Worker     // Returns a unmodifiable reference to the internal resource state as a map
137*ec779b8eSAndroid Build Coastguard Worker     const std::map<int, ResourceInfos>& getResourceMap() const override;
138*ec779b8eSAndroid Build Coastguard Worker 
139*ec779b8eSAndroid Build Coastguard Worker     Status removeResource(const ClientInfoParcel& clientInfo, bool checkValid) override;
140*ec779b8eSAndroid Build Coastguard Worker 
141*ec779b8eSAndroid Build Coastguard Worker     // The following utility functions are used only for testing by ResourceManagerServiceTest
142*ec779b8eSAndroid Build Coastguard Worker     // START: TEST only functions
143*ec779b8eSAndroid Build Coastguard Worker     // Gets the list of all the clients who own the specified resource type.
144*ec779b8eSAndroid Build Coastguard Worker     // Returns false if any client belongs to a process with higher priority than the
145*ec779b8eSAndroid Build Coastguard Worker     // calling process. The clients will remain unchanged if returns false.
146*ec779b8eSAndroid Build Coastguard Worker     bool getAllClients_l(const ResourceRequestInfo& resourceRequestInfo,
147*ec779b8eSAndroid Build Coastguard Worker                          std::vector<ClientInfo>& clientsInfo) override;
148*ec779b8eSAndroid Build Coastguard Worker 
149*ec779b8eSAndroid Build Coastguard Worker     // Gets the client who owns specified resource type from lowest possible priority process.
150*ec779b8eSAndroid Build Coastguard Worker     // Returns false if the calling process priority is not higher than the lowest process
151*ec779b8eSAndroid Build Coastguard Worker     // priority. The client will remain unchanged if returns false.
152*ec779b8eSAndroid Build Coastguard Worker     bool getLowestPriorityBiggestClient_l(
153*ec779b8eSAndroid Build Coastguard Worker         const ResourceRequestInfo& resourceRequestInfo,
154*ec779b8eSAndroid Build Coastguard Worker         ClientInfo& clientInfo) override;
155*ec779b8eSAndroid Build Coastguard Worker 
156*ec779b8eSAndroid Build Coastguard Worker     // Gets lowest priority process that has the specified resource type.
157*ec779b8eSAndroid Build Coastguard Worker     // Returns false if failed. The output parameters will remain unchanged if failed.
158*ec779b8eSAndroid Build Coastguard Worker     bool getLowestPriorityPid_l(MediaResource::Type type, MediaResource::SubType subType,
159*ec779b8eSAndroid Build Coastguard Worker                                 int* lowestPriorityPid, int* lowestPriority) override;
160*ec779b8eSAndroid Build Coastguard Worker 
161*ec779b8eSAndroid Build Coastguard Worker     // enable/disable process priority based reclaim and client importance based reclaim
162*ec779b8eSAndroid Build Coastguard Worker     void setReclaimPolicy(bool processPriority, bool clientImportance) override;
163*ec779b8eSAndroid Build Coastguard Worker     // END: TEST only functions
164*ec779b8eSAndroid Build Coastguard Worker 
165*ec779b8eSAndroid Build Coastguard Worker private:
166*ec779b8eSAndroid Build Coastguard Worker     std::shared_ptr<ResourceTracker> mResourceTracker;
167*ec779b8eSAndroid Build Coastguard Worker     std::unique_ptr<IResourceModel> mDefaultResourceModel;
168*ec779b8eSAndroid Build Coastguard Worker     std::vector<std::unique_ptr<IReclaimPolicy>> mReclaimPolicies;
169*ec779b8eSAndroid Build Coastguard Worker };
170*ec779b8eSAndroid Build Coastguard Worker 
171*ec779b8eSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
172*ec779b8eSAndroid Build Coastguard Worker } // namespace android
173*ec779b8eSAndroid Build Coastguard Worker 
174*ec779b8eSAndroid Build Coastguard Worker #endif // ANDROID_MEDIA_RESOURCEMANAGERSERVICENEW_H
175