From 745f7b59ae19400240af4f390ea3c7f7a962a497 Mon Sep 17 00:00:00 2001 From: Ady Abraham Date: Tue, 8 Feb 2022 19:36:37 -0800 Subject: DisplayEventReceiver: improve error handling Reset the state in case of a binder error and log the error. Bug: 213926330 Test: boot Change-Id: I1b926d08689d9d6e4b382ce18e4a5ecb9156e564 --- libs/gui/DisplayEventReceiver.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) (limited to 'libs/gui/DisplayEventReceiver.cpp') diff --git a/libs/gui/DisplayEventReceiver.cpp b/libs/gui/DisplayEventReceiver.cpp index b916e48f79..1bef2b7893 100644 --- a/libs/gui/DisplayEventReceiver.cpp +++ b/libs/gui/DisplayEventReceiver.cpp @@ -39,7 +39,13 @@ DisplayEventReceiver::DisplayEventReceiver( mEventConnection = sf->createDisplayEventConnection(vsyncSource, eventRegistration); if (mEventConnection != nullptr) { mDataChannel = std::make_unique(); - mEventConnection->stealReceiveChannel(mDataChannel.get()); + const auto status = mEventConnection->stealReceiveChannel(mDataChannel.get()); + if (!status.isOk()) { + ALOGE("stealReceiveChannel failed: %s", status.toString8().c_str()); + mInitError = std::make_optional(status.transactionError()); + mDataChannel.reset(); + mEventConnection.clear(); + } } } } @@ -50,12 +56,11 @@ DisplayEventReceiver::~DisplayEventReceiver() { status_t DisplayEventReceiver::initCheck() const { if (mDataChannel != nullptr) return NO_ERROR; - return NO_INIT; + return mInitError.has_value() ? mInitError.value() : NO_INIT; } int DisplayEventReceiver::getFd() const { - if (mDataChannel == nullptr) - return NO_INIT; + if (mDataChannel == nullptr) return mInitError.has_value() ? mInitError.value() : NO_INIT; return mDataChannel->getFd(); } @@ -68,7 +73,7 @@ status_t DisplayEventReceiver::setVsyncRate(uint32_t count) { mEventConnection->setVsyncRate(count); return NO_ERROR; } - return NO_INIT; + return mInitError.has_value() ? mInitError.value() : NO_INIT; } status_t DisplayEventReceiver::requestNextVsync() { @@ -76,7 +81,7 @@ status_t DisplayEventReceiver::requestNextVsync() { mEventConnection->requestNextVsync(); return NO_ERROR; } - return NO_INIT; + return mInitError.has_value() ? mInitError.value() : NO_INIT; } ssize_t DisplayEventReceiver::getEvents(DisplayEventReceiver::Event* events, -- cgit v1.2.3-59-g8ed1b