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

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

Merge "Add resource observer service"

parents 7a126be5 a9d45c71
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -43,11 +43,11 @@ MediaResource::MediaResource(Type type, const std::vector<uint8_t> &id, int64_t
}

//static
MediaResource MediaResource::CodecResource(bool secure, bool video) {
MediaResource MediaResource::CodecResource(bool secure, bool video, int64_t instanceCount) {
    return MediaResource(
            secure ? Type::kSecureCodec : Type::kNonSecureCodec,
            video ? SubType::kVideoCodec : SubType::kAudioCodec,
            1);
            instanceCount);
}

//static
+1 −1
Original line number Diff line number Diff line
@@ -37,7 +37,7 @@ public:
    MediaResource(Type type, SubType subType, int64_t value);
    MediaResource(Type type, const std::vector<uint8_t> &id, int64_t value);

    static MediaResource CodecResource(bool secure, bool video);
    static MediaResource CodecResource(bool secure, bool video, int64_t instanceCount = 1);
    static MediaResource GraphicMemoryResource(int64_t value);
    static MediaResource CpuBoostResource();
    static MediaResource VideoBatteryResource();
+24 −0
Original line number Diff line number Diff line
@@ -11,6 +11,19 @@ filegroup {
    path: "aidl",
}

filegroup {
    name: "resourceobserver_aidl",
    srcs: [
        "aidl/android/media/IResourceObserver.aidl",
        "aidl/android/media/IResourceObserverService.aidl",
        "aidl/android/media/MediaObservableEvent.aidl",
        "aidl/android/media/MediaObservableFilter.aidl",
        "aidl/android/media/MediaObservableType.aidl",
        "aidl/android/media/MediaObservableParcel.aidl",
    ],
    path: "aidl",
}

aidl_interface {
    name: "resourcemanager_aidl_interface",
    unstable: true,
@@ -20,11 +33,21 @@ aidl_interface {
    ],
}

aidl_interface {
    name: "resourceobserver_aidl_interface",
    unstable: true,
    local_include_dir: "aidl",
    srcs: [
        ":resourceobserver_aidl",
    ],
}

cc_library {
    name: "libresourcemanagerservice",

    srcs: [
        "ResourceManagerService.cpp",
        "ResourceObserverService.cpp",
        "ServiceLog.cpp",
    ],

@@ -35,6 +58,7 @@ cc_library {
        "libbinder_ndk",
        "libutils",
        "liblog",
        "resourceobserver_aidl_interface-ndk_platform",
    ],

    include_dirs: ["frameworks/av/include"],
+42 −1
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@
#include <unistd.h>

#include "ResourceManagerService.h"
#include "ResourceObserverService.h"
#include "ServiceLog.h"

namespace android {
@@ -267,6 +268,13 @@ void ResourceManagerService::instantiate() {
    if (status != STATUS_OK) {
        return;
    }

    std::shared_ptr<ResourceObserverService> observerService =
            ResourceObserverService::instantiate();

    if (observerService != nullptr) {
        service->setObserverService(observerService);
    }
    // TODO: mediaserver main() is already starting the thread pool,
    // move this to mediaserver main() when other services in mediaserver
    // are converted to ndk-platform aidl.
@@ -275,6 +283,11 @@ void ResourceManagerService::instantiate() {

ResourceManagerService::~ResourceManagerService() {}

void ResourceManagerService::setObserverService(
        const std::shared_ptr<ResourceObserverService>& observerService) {
    mObserverService = observerService;
}

Status ResourceManagerService::config(const std::vector<MediaResourcePolicyParcel>& policies) {
    String8 log = String8::format("config(%s)", getString(policies).string());
    mServiceLog->add(log);
@@ -358,6 +371,7 @@ Status ResourceManagerService::addResource(
    }
    ResourceInfos& infos = getResourceInfosForEdit(pid, mMap);
    ResourceInfo& info = getResourceInfoForEdit(uid, clientId, client, infos);
    ResourceList resourceAdded;

    for (size_t i = 0; i < resources.size(); ++i) {
        const auto &res = resources[i];
@@ -379,12 +393,22 @@ Status ResourceManagerService::addResource(
        } else {
            mergeResources(info.resources[resType], res);
        }
        // Add it to the list of added resources for observers.
        auto it = resourceAdded.find(resType);
        if (it == resourceAdded.end()) {
            resourceAdded[resType] = res;
        } else {
            mergeResources(it->second, res);
        }
    }
    if (info.deathNotifier == nullptr && client != nullptr) {
        info.deathNotifier = new DeathNotifier(ref<ResourceManagerService>(), pid, clientId);
        AIBinder_linkToDeath(client->asBinder().get(),
                mDeathRecipient.get(), info.deathNotifier.get());
    }
    if (mObserverService != nullptr && !resourceAdded.empty()) {
        mObserverService->onResourceAdded(uid, pid, resourceAdded);
    }
    notifyResourceGranted(pid, resources);
    return Status::ok();
}
@@ -415,7 +439,7 @@ Status ResourceManagerService::removeResource(
    }

    ResourceInfo &info = infos.editValueAt(index);

    ResourceList resourceRemoved;
    for (size_t i = 0; i < resources.size(); ++i) {
        const auto &res = resources[i];
        const auto resType = std::tuple(res.type, res.subType, res.id);
@@ -427,14 +451,27 @@ Status ResourceManagerService::removeResource(
        // ignore if we don't have it
        if (info.resources.find(resType) != info.resources.end()) {
            MediaResourceParcel &resource = info.resources[resType];
            MediaResourceParcel actualRemoved = res;
            if (resource.value > res.value) {
                resource.value -= res.value;
            } else {
                onLastRemoved(res, info);
                info.resources.erase(resType);
                actualRemoved.value = resource.value;
            }

            // Add it to the list of removed resources for observers.
            auto it = resourceRemoved.find(resType);
            if (it == resourceRemoved.end()) {
                resourceRemoved[resType] = actualRemoved;
            } else {
                mergeResources(it->second, actualRemoved);
            }
        }
    }
    if (mObserverService != nullptr && !resourceRemoved.empty()) {
        mObserverService->onResourceRemoved(info.uid, pid, resourceRemoved);
    }
    return Status::ok();
}

@@ -475,6 +512,10 @@ Status ResourceManagerService::removeResource(int pid, int64_t clientId, bool ch
    AIBinder_unlinkToDeath(info.client->asBinder().get(),
            mDeathRecipient.get(), info.deathNotifier.get());

    if (mObserverService != nullptr && !info.resources.empty()) {
        mObserverService->onResourceRemoved(info.uid, pid, info.resources);
    }

    infos.removeItemsAt(index);
    return Status::ok();
}
+4 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ namespace android {

class DeathNotifier;
class ResourceManagerService;
class ResourceObserverService;
class ServiceLog;
struct ProcessInfoInterface;

@@ -95,6 +96,8 @@ public:
            const sp<ProcessInfoInterface> &processInfo,
            const sp<SystemCallbackInterface> &systemResource);
    virtual ~ResourceManagerService();
    void setObserverService(
            const std::shared_ptr<ResourceObserverService>& observerService);

    // IResourceManagerService interface
    Status config(const std::vector<MediaResourcePolicyParcel>& policies) override;
@@ -180,6 +183,7 @@ private:
    int32_t mCpuBoostCount;
    ::ndk::ScopedAIBinder_DeathRecipient mDeathRecipient;
    std::map<int, int> mOverridePidMap;
    std::shared_ptr<ResourceObserverService> mObserverService;
};

// ----------------------------------------------------------------------------
Loading