/* ** ** Copyright 2023, The Android Open Source Project ** ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. ** You may obtain a copy of the License at ** ** http://www.apache.org/licenses/LICENSE-2.0 ** ** Unless required by applicable law or agreed to in writing, software ** distributed under the License is distributed on an "AS IS" BASIS, ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ** See the License for the specific language governing permissions and ** limitations under the License. */ #ifndef ANDROID_MEDIA_RESOURCEMANAGERSERVICENEW_H #define ANDROID_MEDIA_RESOURCEMANAGERSERVICENEW_H #include "ResourceManagerService.h" namespace android { class IReclaimPolicy; class IResourceModel; class ResourceTracker; // // A newer implementation of IResourceManagerService, which // eventually will replace the older implementation in ResourceManagerService. // // To make the transition easier, this implementation overrides the // private virtual methods from ResourceManagerService. // // This implementation is devised to abstract and integrate: // - resources into an independent abstraction // - resource model as a separate interface (and implementation) // - reclaim policy as a separate interface (and implementation) // class ResourceManagerServiceNew : public ResourceManagerService { public: explicit ResourceManagerServiceNew(const sp& processInfo, const sp& systemResource); virtual ~ResourceManagerServiceNew(); // IResourceManagerService interface Status config(const std::vector& policies) override; Status addResource(const ClientInfoParcel& clientInfo, const std::shared_ptr& client, const std::vector& resources) override; Status removeResource(const ClientInfoParcel& clientInfo, const std::vector& resources) override; Status removeClient(const ClientInfoParcel& clientInfo) override; Status reclaimResource(const ClientInfoParcel& clientInfo, const std::vector& resources, bool* _aidl_return) override; Status overridePid(int32_t originalPid, int32_t newPid) override; Status overrideProcessInfo(const std::shared_ptr& client, int32_t pid, int32_t procState, int32_t oomScore) override; Status markClientForPendingRemoval(const ClientInfoParcel& clientInfo) override; Status reclaimResourcesFromClientsPendingRemoval(int32_t pid) override; Status notifyClientCreated(const ClientInfoParcel& clientInfo) override; Status notifyClientStarted(const ClientConfigParcel& clientConfig) override; Status notifyClientStopped(const ClientConfigParcel& clientConfig) override; Status notifyClientConfigChanged(const ClientConfigParcel& clientConfig) override; binder_status_t dump(int fd, const char** args, uint32_t numArgs) override; friend class ResourceTracker; private: // Set up the Resource models. void setUpResourceModels(); // Set up the Reclaim Policies. void setUpReclaimPolicies(); // From the list of clients, pick/select client(s) based on the reclaim policy. void getClientForResource_l( const ReclaimRequestInfo& reclaimRequestInfo, const std::vector& clients, std::vector& targetClients); // Initializes the internal state of the ResourceManagerService void init() override; void setObserverService( const std::shared_ptr& observerService) override; // Gets the list of all the clients who own the specified resource type. // Returns false if any client belongs to a process with higher priority than the // calling process. The clients will remain unchanged if returns false. bool getTargetClients( const ClientInfoParcel& clientInfo, const std::vector& resources, std::vector& targetClients) override; // Removes the pid from the override map. void removeProcessInfoOverride(int pid) override; // override the pid of given process bool overridePid_l(int32_t originalPid, int32_t newPid) override; // override the process info of given process bool overrideProcessInfo_l(const std::shared_ptr& client, int pid, int procState, int oomScore) override; // Get priority from process's pid bool getPriority_l(int pid, int* priority) const override; // Get the client for given pid and the clientId from the map std::shared_ptr getClient_l( int pid, const int64_t& clientId) const override; // Remove the client for given pid and the clientId from the map bool removeClient_l(int pid, const int64_t& clientId) override; // Get all the resource status for dump void getResourceDump(std::string& resourceLog) const override; // Returns a unmodifiable reference to the internal resource state as a map const std::map& getResourceMap() const override; Status removeResource(const ClientInfoParcel& clientInfo, bool checkValid) override; // The following utility functions are used only for testing by ResourceManagerServiceTest // START: TEST only functions // Gets the list of all the clients who own the specified resource type. // Returns false if any client belongs to a process with higher priority than the // calling process. The clients will remain unchanged if returns false. bool getAllClients_l(const ResourceRequestInfo& resourceRequestInfo, std::vector& clientsInfo) override; // Gets the client who owns specified resource type from lowest possible priority process. // Returns false if the calling process priority is not higher than the lowest process // priority. The client will remain unchanged if returns false. bool getLowestPriorityBiggestClient_l( const ResourceRequestInfo& resourceRequestInfo, ClientInfo& clientInfo) override; // Gets lowest priority process that has the specified resource type. // Returns false if failed. The output parameters will remain unchanged if failed. bool getLowestPriorityPid_l(MediaResource::Type type, MediaResource::SubType subType, int* lowestPriorityPid, int* lowestPriority) override; // enable/disable process priority based reclaim and client importance based reclaim void setReclaimPolicy(bool processPriority, bool clientImportance) override; // END: TEST only functions private: std::shared_ptr mResourceTracker; std::unique_ptr mDefaultResourceModel; std::vector> mReclaimPolicies; }; // ---------------------------------------------------------------------------- } // namespace android #endif // ANDROID_MEDIA_RESOURCEMANAGERSERVICENEW_H