Loading media/libmediaplayerservice/tests/DrmSessionManager_test.cpp +8 −0 Original line number Diff line number Diff line Loading @@ -65,6 +65,14 @@ struct FakeProcessInfo : public ProcessInfoInterface { return true; } virtual bool overrideProcessInfo( int /* pid */, int /* procState */, int /* oomScore */) { return true; } virtual void removeProcessInfoOverride(int /* pid */) { } private: DISALLOW_EVIL_CONSTRUCTORS(FakeProcessInfo); }; Loading media/libmediatranscoding/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -72,6 +72,7 @@ cc_library_shared { static_libs: [ "mediatranscoding_aidl_interface-ndk_platform", "resourcemanager_aidl_interface-ndk_platform", ], cflags: [ Loading media/libmediatranscoding/TranscodingUidPolicy.cpp +58 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,10 @@ //#define LOG_NDEBUG 0 #define LOG_TAG "TranscodingUidPolicy" #include <aidl/android/media/BnResourceManagerClient.h> #include <aidl/android/media/IResourceManagerService.h> #include <android/binder_manager.h> #include <android/binder_process.h> #include <binder/ActivityManager.h> #include <cutils/misc.h> // FIRST_APPLICATION_UID #include <inttypes.h> Loading @@ -30,6 +34,43 @@ namespace android { constexpr static uid_t OFFLINE_UID = -1; constexpr static const char* kTranscodingTag = "transcoding"; /* * The OOM score we're going to ask ResourceManager to use for our native transcoding * service. ResourceManager issues reclaims based on these scores. It gets the scores * from ActivityManagerService, which doesn't track native services. The values of the * OOM scores are defined in: * frameworks/base/services/core/java/com/android/server/am/ProcessList.java * We use SERVICE_ADJ which is lower priority than an app possibly visible to the * user, but higher priority than a cached app (which could be killed without disruption * to the user). */ constexpr static int32_t SERVICE_ADJ = 500; using Status = ::ndk::ScopedAStatus; using aidl::android::media::BnResourceManagerClient; using aidl::android::media::IResourceManagerService; /* * Placeholder ResourceManagerClient for registering process info override * with the IResourceManagerService. This is only used as a token by the service * to get notifications about binder death, not used for reclaiming resources. */ struct TranscodingUidPolicy::ResourceManagerClient : public BnResourceManagerClient { explicit ResourceManagerClient() = default; Status reclaimResource(bool* _aidl_return) override { *_aidl_return = false; return Status::ok(); } Status getName(::std::string* _aidl_return) override { _aidl_return->clear(); return Status::ok(); } virtual ~ResourceManagerClient() = default; }; struct TranscodingUidPolicy::UidObserver : public BnUidObserver, public virtual IBinder::DeathRecipient { explicit UidObserver(TranscodingUidPolicy* owner) : mOwner(owner) {} Loading Loading @@ -74,6 +115,7 @@ TranscodingUidPolicy::TranscodingUidPolicy() mRegistered(false), mTopUidState(ActivityManager::PROCESS_STATE_UNKNOWN) { registerSelf(); setProcessInfoOverride(); } TranscodingUidPolicy::~TranscodingUidPolicy() { Loading Loading @@ -109,6 +151,22 @@ void TranscodingUidPolicy::unregisterSelf() { ALOGI("TranscodingUidPolicy: Unregistered with ActivityManager"); } void TranscodingUidPolicy::setProcessInfoOverride() { ::ndk::SpAIBinder binder(AServiceManager_getService("media.resource_manager")); std::shared_ptr<IResourceManagerService> service = IResourceManagerService::fromBinder(binder); if (service == nullptr) { ALOGE("Failed to get IResourceManagerService"); return; } mProcInfoOverrideClient = ::ndk::SharedRefBase::make<ResourceManagerClient>(); Status status = service->overrideProcessInfo( mProcInfoOverrideClient, getpid(), ActivityManager::PROCESS_STATE_SERVICE, SERVICE_ADJ); if (!status.isOk()) { ALOGW("Failed to setProcessInfoOverride."); } } void TranscodingUidPolicy::setUidObserverRegistered(bool registered) { Mutex::Autolock _l(mUidLock); Loading media/libmediatranscoding/include/media/TranscodingUidPolicy.h +3 −0 Original line number Diff line number Diff line Loading @@ -53,10 +53,12 @@ private: void setUidObserverRegistered(bool registerd); void registerSelf(); void unregisterSelf(); void setProcessInfoOverride(); int32_t getProcState_l(uid_t uid) NO_THREAD_SAFETY_ANALYSIS; void updateTopUid_l() NO_THREAD_SAFETY_ANALYSIS; struct UidObserver; struct ResourceManagerClient; mutable Mutex mUidLock; std::shared_ptr<ActivityManager> mAm; sp<UidObserver> mUidObserver; Loading @@ -65,6 +67,7 @@ private: std::unordered_map<uid_t, int32_t> mUidStateMap GUARDED_BY(mUidLock); std::map<int32_t, std::unordered_set<uid_t>> mStateUidMap GUARDED_BY(mUidLock); std::weak_ptr<UidPolicyCallbackInterface> mUidPolicyCallback; std::shared_ptr<ResourceManagerClient> mProcInfoOverrideClient; }; // class TranscodingUidPolicy } // namespace android Loading media/libstagefright/include/media/stagefright/ProcessInfo.h +12 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,9 @@ #include <media/stagefright/foundation/ABase.h> #include <media/stagefright/ProcessInfoInterface.h> #include <map> #include <mutex> #include <utils/Condition.h> namespace android { Loading @@ -28,11 +31,20 @@ struct ProcessInfo : public ProcessInfoInterface { virtual bool getPriority(int pid, int* priority); virtual bool isValidPid(int pid); virtual bool overrideProcessInfo(int pid, int procState, int oomScore); virtual void removeProcessInfoOverride(int pid); protected: virtual ~ProcessInfo(); private: struct ProcessInfoOverride { int procState; int oomScore; }; std::mutex mOverrideLock; std::map<int, ProcessInfoOverride> mOverrideMap GUARDED_BY(mOverrideLock); DISALLOW_EVIL_CONSTRUCTORS(ProcessInfo); }; Loading Loading
media/libmediaplayerservice/tests/DrmSessionManager_test.cpp +8 −0 Original line number Diff line number Diff line Loading @@ -65,6 +65,14 @@ struct FakeProcessInfo : public ProcessInfoInterface { return true; } virtual bool overrideProcessInfo( int /* pid */, int /* procState */, int /* oomScore */) { return true; } virtual void removeProcessInfoOverride(int /* pid */) { } private: DISALLOW_EVIL_CONSTRUCTORS(FakeProcessInfo); }; Loading
media/libmediatranscoding/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -72,6 +72,7 @@ cc_library_shared { static_libs: [ "mediatranscoding_aidl_interface-ndk_platform", "resourcemanager_aidl_interface-ndk_platform", ], cflags: [ Loading
media/libmediatranscoding/TranscodingUidPolicy.cpp +58 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,10 @@ //#define LOG_NDEBUG 0 #define LOG_TAG "TranscodingUidPolicy" #include <aidl/android/media/BnResourceManagerClient.h> #include <aidl/android/media/IResourceManagerService.h> #include <android/binder_manager.h> #include <android/binder_process.h> #include <binder/ActivityManager.h> #include <cutils/misc.h> // FIRST_APPLICATION_UID #include <inttypes.h> Loading @@ -30,6 +34,43 @@ namespace android { constexpr static uid_t OFFLINE_UID = -1; constexpr static const char* kTranscodingTag = "transcoding"; /* * The OOM score we're going to ask ResourceManager to use for our native transcoding * service. ResourceManager issues reclaims based on these scores. It gets the scores * from ActivityManagerService, which doesn't track native services. The values of the * OOM scores are defined in: * frameworks/base/services/core/java/com/android/server/am/ProcessList.java * We use SERVICE_ADJ which is lower priority than an app possibly visible to the * user, but higher priority than a cached app (which could be killed without disruption * to the user). */ constexpr static int32_t SERVICE_ADJ = 500; using Status = ::ndk::ScopedAStatus; using aidl::android::media::BnResourceManagerClient; using aidl::android::media::IResourceManagerService; /* * Placeholder ResourceManagerClient for registering process info override * with the IResourceManagerService. This is only used as a token by the service * to get notifications about binder death, not used for reclaiming resources. */ struct TranscodingUidPolicy::ResourceManagerClient : public BnResourceManagerClient { explicit ResourceManagerClient() = default; Status reclaimResource(bool* _aidl_return) override { *_aidl_return = false; return Status::ok(); } Status getName(::std::string* _aidl_return) override { _aidl_return->clear(); return Status::ok(); } virtual ~ResourceManagerClient() = default; }; struct TranscodingUidPolicy::UidObserver : public BnUidObserver, public virtual IBinder::DeathRecipient { explicit UidObserver(TranscodingUidPolicy* owner) : mOwner(owner) {} Loading Loading @@ -74,6 +115,7 @@ TranscodingUidPolicy::TranscodingUidPolicy() mRegistered(false), mTopUidState(ActivityManager::PROCESS_STATE_UNKNOWN) { registerSelf(); setProcessInfoOverride(); } TranscodingUidPolicy::~TranscodingUidPolicy() { Loading Loading @@ -109,6 +151,22 @@ void TranscodingUidPolicy::unregisterSelf() { ALOGI("TranscodingUidPolicy: Unregistered with ActivityManager"); } void TranscodingUidPolicy::setProcessInfoOverride() { ::ndk::SpAIBinder binder(AServiceManager_getService("media.resource_manager")); std::shared_ptr<IResourceManagerService> service = IResourceManagerService::fromBinder(binder); if (service == nullptr) { ALOGE("Failed to get IResourceManagerService"); return; } mProcInfoOverrideClient = ::ndk::SharedRefBase::make<ResourceManagerClient>(); Status status = service->overrideProcessInfo( mProcInfoOverrideClient, getpid(), ActivityManager::PROCESS_STATE_SERVICE, SERVICE_ADJ); if (!status.isOk()) { ALOGW("Failed to setProcessInfoOverride."); } } void TranscodingUidPolicy::setUidObserverRegistered(bool registered) { Mutex::Autolock _l(mUidLock); Loading
media/libmediatranscoding/include/media/TranscodingUidPolicy.h +3 −0 Original line number Diff line number Diff line Loading @@ -53,10 +53,12 @@ private: void setUidObserverRegistered(bool registerd); void registerSelf(); void unregisterSelf(); void setProcessInfoOverride(); int32_t getProcState_l(uid_t uid) NO_THREAD_SAFETY_ANALYSIS; void updateTopUid_l() NO_THREAD_SAFETY_ANALYSIS; struct UidObserver; struct ResourceManagerClient; mutable Mutex mUidLock; std::shared_ptr<ActivityManager> mAm; sp<UidObserver> mUidObserver; Loading @@ -65,6 +67,7 @@ private: std::unordered_map<uid_t, int32_t> mUidStateMap GUARDED_BY(mUidLock); std::map<int32_t, std::unordered_set<uid_t>> mStateUidMap GUARDED_BY(mUidLock); std::weak_ptr<UidPolicyCallbackInterface> mUidPolicyCallback; std::shared_ptr<ResourceManagerClient> mProcInfoOverrideClient; }; // class TranscodingUidPolicy } // namespace android Loading
media/libstagefright/include/media/stagefright/ProcessInfo.h +12 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,9 @@ #include <media/stagefright/foundation/ABase.h> #include <media/stagefright/ProcessInfoInterface.h> #include <map> #include <mutex> #include <utils/Condition.h> namespace android { Loading @@ -28,11 +31,20 @@ struct ProcessInfo : public ProcessInfoInterface { virtual bool getPriority(int pid, int* priority); virtual bool isValidPid(int pid); virtual bool overrideProcessInfo(int pid, int procState, int oomScore); virtual void removeProcessInfoOverride(int pid); protected: virtual ~ProcessInfo(); private: struct ProcessInfoOverride { int procState; int oomScore; }; std::mutex mOverrideLock; std::map<int, ProcessInfoOverride> mOverrideMap GUARDED_BY(mOverrideLock); DISALLOW_EVIL_CONSTRUCTORS(ProcessInfo); }; Loading