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