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

Commit 7ce70fea authored by ramindani's avatar ramindani
Browse files

Use Vector instead of unordered_map for hotplug displays

For multi-display order of the hotplug matters, and vector
maintains the order that we need for the multi-display.
see: ag/1921760 for partner cl on HIDL.

BUG: 210920960
BUG: 209409863

Test: atest VtsHalGraphicsComposer3_TargetTest
Change-Id: I4f9a86413f20c860fc0bc3850a14335d62de881a
parent b636af28
Loading
Loading
Loading
Loading
+24 −9
Original line number Diff line number Diff line
@@ -31,7 +31,7 @@ void GraphicsComposerCallback::setVsyncAllowed(bool allowed) {

std::vector<int64_t> GraphicsComposerCallback::getDisplays() const {
    std::scoped_lock lock(mMutex);
    return std::vector<int64_t>(mDisplays.begin(), mDisplays.end());
    return mDisplays;
}

int32_t GraphicsComposerCallback::getInvalidHotplugCount() const {
@@ -81,22 +81,29 @@ GraphicsComposerCallback::takeLastVsyncPeriodChangeTimeline() {

::ndk::ScopedAStatus GraphicsComposerCallback::onHotplug(int64_t in_display, bool in_connected) {
    std::scoped_lock lock(mMutex);

    const auto it = std::find(mDisplays.begin(), mDisplays.end(), in_display);
    if (in_connected) {
        if (!mDisplays.insert(in_display).second) {
        if (it == mDisplays.end()) {
            mDisplays.push_back(in_display);
        } else {
            mInvalidHotplugCount++;
        }
    } else {
        if (!mDisplays.erase(in_display)) {
        if (it != mDisplays.end()) {
            mDisplays.erase(it);
        } else {
            mInvalidHotplugCount++;
        }
    }
    return ::ndk::ScopedAStatus::ok();
}

::ndk::ScopedAStatus GraphicsComposerCallback::onRefresh(int64_t display) {
::ndk::ScopedAStatus GraphicsComposerCallback::onRefresh(int64_t in_display) {
    std::scoped_lock lock(mMutex);

    if (mDisplays.count(display) == 0) {
    const auto it = std::find(mDisplays.begin(), mDisplays.end(), in_display);
    if (it == mDisplays.end()) {
        mInvalidRefreshCount++;
    }

@@ -106,7 +113,9 @@ GraphicsComposerCallback::takeLastVsyncPeriodChangeTimeline() {
::ndk::ScopedAStatus GraphicsComposerCallback::onVsync(int64_t in_display, int64_t in_timestamp,
                                                       int32_t in_vsyncPeriodNanos) {
    std::scoped_lock lock(mMutex);
    if (!mVsyncAllowed || mDisplays.count(in_display) == 0) {

    const auto it = std::find(mDisplays.begin(), mDisplays.end(), in_display);
    if (!mVsyncAllowed || it == mDisplays.end()) {
        mInvalidVsyncCount++;
    }

@@ -120,7 +129,9 @@ GraphicsComposerCallback::takeLastVsyncPeriodChangeTimeline() {
        const ::aidl::android::hardware::graphics::composer3::VsyncPeriodChangeTimeline&
                in_updatedTimeline) {
    std::scoped_lock lock(mMutex);
    if (mDisplays.count(in_display) == 0) {

    const auto it = std::find(mDisplays.begin(), mDisplays.end(), in_display);
    if (it == mDisplays.end()) {
        mInvalidVsyncPeriodChangeCount++;
    }
    mTimeline = in_updatedTimeline;
@@ -130,7 +141,9 @@ GraphicsComposerCallback::takeLastVsyncPeriodChangeTimeline() {

::ndk::ScopedAStatus GraphicsComposerCallback::onSeamlessPossible(int64_t in_display) {
    std::scoped_lock lock(mMutex);
    if (mDisplays.count(in_display)) {

    const auto it = std::find(mDisplays.begin(), mDisplays.end(), in_display);
    if (it != mDisplays.end()) {
        mInvalidSeamlessPossibleCount++;
    }
    return ::ndk::ScopedAStatus::ok();
@@ -138,7 +151,9 @@ GraphicsComposerCallback::takeLastVsyncPeriodChangeTimeline() {

::ndk::ScopedAStatus GraphicsComposerCallback::onVsyncIdle(int64_t in_display) {
    std::scoped_lock lock(mMutex);
    if (mDisplays.count(in_display)) {

    const auto it = std::find(mDisplays.begin(), mDisplays.end(), in_display);
    if (it != mDisplays.end()) {
        mVsyncIdleCount++;
        mVsyncIdleTime = systemTime();
    }
+2 −2
Original line number Diff line number Diff line
@@ -18,7 +18,7 @@
#include <aidl/android/hardware/graphics/composer3/BnComposerCallback.h>
#include <android-base/thread_annotations.h>
#include <mutex>
#include <unordered_set>
#include <vector>

namespace aidl::android::hardware::graphics::composer3::vts {

@@ -58,7 +58,7 @@ class GraphicsComposerCallback : public BnComposerCallback {

    mutable std::mutex mMutex;
    // the set of all currently connected displays
    std::unordered_set<int64_t> mDisplays GUARDED_BY(mMutex);
    std::vector<int64_t> mDisplays GUARDED_BY(mMutex);
    // true only when vsync is enabled
    bool mVsyncAllowed GUARDED_BY(mMutex) = true;