1 /*
2 **
3 ** Copyright 2015, The Android Open Source Project
4 **
5 ** Licensed under the Apache License, Version 2.0 (the "License");
6 ** you may not use this file except in compliance with the License.
7 ** You may obtain a copy of the License at
8 **
9 **     http://www.apache.org/licenses/LICENSE-2.0
10 **
11 ** Unless required by applicable law or agreed to in writing, software
12 ** distributed under the License is distributed on an "AS IS" BASIS,
13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 ** See the License for the specific language governing permissions and
15 ** limitations under the License.
16 */
17 
18 #ifndef ANDROID_RESOURCEMANAGERSERVICE_H
19 #define ANDROID_RESOURCEMANAGERSERVICE_H
20 
21 #include <arpa/inet.h>
22 #include <binder/BinderService.h>
23 #include <utils/Errors.h>
24 #include <utils/KeyedVector.h>
25 #include <utils/String8.h>
26 #include <utils/threads.h>
27 #include <utils/Vector.h>
28 
29 #include <media/IResourceManagerService.h>
30 
31 namespace android {
32 
33 class ServiceLog;
34 struct ProcessInfoInterface;
35 
36 typedef std::map<std::tuple<MediaResource::Type, MediaResource::SubType, std::vector<uint8_t>>, MediaResource> ResourceList;
37 struct ResourceInfo {
38     int64_t clientId;
39     uid_t uid;
40     sp<IResourceManagerClient> client;
41     sp<IBinder::DeathRecipient> deathNotifier;
42     ResourceList resources;
43 };
44 
45 // TODO: convert these to std::map
46 typedef KeyedVector<int64_t, ResourceInfo> ResourceInfos;
47 typedef KeyedVector<int, ResourceInfos> PidResourceInfosMap;
48 
49 class ResourceManagerService
50     : public BinderService<ResourceManagerService>,
51       public BnResourceManagerService
52 {
53 public:
54     struct SystemCallbackInterface : public RefBase {
55         virtual void noteStartVideo(int uid) = 0;
56         virtual void noteStopVideo(int uid) = 0;
57         virtual void noteResetVideo() = 0;
58         virtual bool requestCpusetBoost(
59                 bool enable, const sp<IInterface> &client) = 0;
60     };
61 
getServiceName()62     static char const *getServiceName() { return "media.resource_manager"; }
63 
64     virtual status_t dump(int fd, const Vector<String16>& args);
65 
66     ResourceManagerService();
67     explicit ResourceManagerService(
68             const sp<ProcessInfoInterface> &processInfo,
69             const sp<SystemCallbackInterface> &systemResource);
70 
71     // IResourceManagerService interface
72     virtual void config(const Vector<MediaResourcePolicy> &policies);
73 
74     virtual void addResource(
75             int pid,
76             int uid,
77             int64_t clientId,
78             const sp<IResourceManagerClient> client,
79             const Vector<MediaResource> &resources);
80 
81     virtual void removeResource(int pid, int64_t clientId,
82             const Vector<MediaResource> &resources);
83 
84     virtual void removeClient(int pid, int64_t clientId);
85 
86     // Tries to reclaim resource from processes with lower priority than the calling process
87     // according to the requested resources.
88     // Returns true if any resource has been reclaimed, otherwise returns false.
89     virtual bool reclaimResource(int callingPid, const Vector<MediaResource> &resources);
90 
91     void removeResource(int pid, int64_t clientId, bool checkValid);
92 
93 protected:
94     virtual ~ResourceManagerService();
95 
96 private:
97     friend class ResourceManagerServiceTest;
98 
99     // Gets the list of all the clients who own the specified resource type.
100     // Returns false if any client belongs to a process with higher priority than the
101     // calling process. The clients will remain unchanged if returns false.
102     bool getAllClients_l(int callingPid, MediaResource::Type type,
103             Vector<sp<IResourceManagerClient>> *clients);
104 
105     // Gets the client who owns specified resource type from lowest possible priority process.
106     // Returns false if the calling process priority is not higher than the lowest process
107     // priority. The client will remain unchanged if returns false.
108     bool getLowestPriorityBiggestClient_l(int callingPid, MediaResource::Type type,
109             sp<IResourceManagerClient> *client);
110 
111     // Gets lowest priority process that has the specified resource type.
112     // Returns false if failed. The output parameters will remain unchanged if failed.
113     bool getLowestPriorityPid_l(MediaResource::Type type, int *pid, int *priority);
114 
115     // Gets the client who owns biggest piece of specified resource type from pid.
116     // Returns false if failed. The client will remain unchanged if failed.
117     bool getBiggestClient_l(int pid, MediaResource::Type type, sp<IResourceManagerClient> *client);
118 
119     bool isCallingPriorityHigher_l(int callingPid, int pid);
120 
121     // A helper function basically calls getLowestPriorityBiggestClient_l and add the result client
122     // to the given Vector.
123     void getClientForResource_l(
124         int callingPid, const MediaResource *res, Vector<sp<IResourceManagerClient>> *clients);
125 
126     void onFirstAdded(const MediaResource& res, const ResourceInfo& clientInfo);
127     void onLastRemoved(const MediaResource& res, const ResourceInfo& clientInfo);
128 
129     // Merge r2 into r1
130     void mergeResources(MediaResource& r1, const MediaResource& r2);
131 
132     mutable Mutex mLock;
133     sp<ProcessInfoInterface> mProcessInfo;
134     sp<SystemCallbackInterface> mSystemCB;
135     sp<ServiceLog> mServiceLog;
136     PidResourceInfosMap mMap;
137     bool mSupportsMultipleSecureCodecs;
138     bool mSupportsSecureWithNonSecureCodec;
139     int32_t mCpuBoostCount;
140 };
141 
142 // ----------------------------------------------------------------------------
143 
144 }; // namespace android
145 
146 #endif // ANDROID_RESOURCEMANAGERSERVICE_H
147