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

Commit a9d45c71 authored by Chong Zhang's avatar Chong Zhang
Browse files

Add resource observer service

Add resource observer service so that clients can
register listeners to receive resource status change.

This is needed by transcoding service to properly
handle media resource lost. Resource lost itself is
detected by exceptions on MediaCodec, however in
order to resume the service, a notification from
ResourceManager is needed.

Note that the observer service is built as a separate
service so that client can access it without requesting
full resourcemanager service. It also allows us to
list the observer service interface as a stable interface
without having to lock down resourcemanager interface.

bug: 168307955
bug: 154733526

test:
- unit testing in this CL;
- manually tested using the service from media.transcoding
  and got codec updates and "adb shell dumpsys"

Change-Id: I8028c605600a40c1aa2c89850ef877a5bf1d0c09
parent ffebb80b
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