Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b79b20f8 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Allow native process to set procinfo in ResourceManager"

parents 86f50786 97d367b2
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -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);
};
+1 −0
Original line number Diff line number Diff line
@@ -72,6 +72,7 @@ cc_library_shared {

    static_libs: [
        "mediatranscoding_aidl_interface-ndk_platform",
        "resourcemanager_aidl_interface-ndk_platform",
    ],

    cflags: [
+58 −0
Original line number Diff line number Diff line
@@ -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>
@@ -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) {}
@@ -74,6 +115,7 @@ TranscodingUidPolicy::TranscodingUidPolicy()
        mRegistered(false),
        mTopUidState(ActivityManager::PROCESS_STATE_UNKNOWN) {
    registerSelf();
    setProcessInfoOverride();
}

TranscodingUidPolicy::~TranscodingUidPolicy() {
@@ -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);

+3 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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
+12 −0
Original line number Diff line number Diff line
@@ -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 {

@@ -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