libgui: Normalize IDisplayEventConnection methods
This change modifies the IDisplayEventConnection API such that every
synchronous method returns a status_t (to be able to return transport
errors). This required changing getDataChannel to return its channel by
output parameter rather than return type.
Currently no more error messages are checked than before, but this will
both enable calling code to check error messages if it desires and,
more importantly, allow the Bp/Bn code to be semi-automatically
generated using SafeInterface.
Test: libgui_tests + manual testing
Change-Id: I8d5bc5ef0475cee07b638a97079b234f0384c022
diff --git a/include/gui/IDisplayEventConnection.h b/include/gui/IDisplayEventConnection.h
index 6512adb..ebebfbe 100644
--- a/include/gui/IDisplayEventConnection.h
+++ b/include/gui/IDisplayEventConnection.h
@@ -34,14 +34,14 @@
/*
* getDataChannel() returns a BitTube where to receive the events from
*/
- virtual sp<BitTube> getDataChannel() const = 0;
+ virtual status_t getDataChannel(sp<BitTube>* outChannel) const = 0;
/*
* setVsyncRate() sets the vsync event delivery rate. A value of 1 returns every vsync event.
* A value of 2 returns every other event, etc. A value of 0 returns no event unless
* requestNextVsync() has been called.
*/
- virtual void setVsyncRate(uint32_t count) = 0;
+ virtual status_t setVsyncRate(uint32_t count) = 0;
/*
* requestNextVsync() schedules the next vsync event. It has no effect if the vsync rate is > 0.
diff --git a/libs/gui/DisplayEventReceiver.cpp b/libs/gui/DisplayEventReceiver.cpp
index 07e07e0..16b06e9 100644
--- a/libs/gui/DisplayEventReceiver.cpp
+++ b/libs/gui/DisplayEventReceiver.cpp
@@ -37,7 +37,7 @@
if (sf != NULL) {
mEventConnection = sf->createDisplayEventConnection();
if (mEventConnection != NULL) {
- mDataChannel = mEventConnection->getDataChannel();
+ mEventConnection->getDataChannel(&mDataChannel);
}
}
}
diff --git a/libs/gui/IDisplayEventConnection.cpp b/libs/gui/IDisplayEventConnection.cpp
index 4d2d7e9..2de2f8a 100644
--- a/libs/gui/IDisplayEventConnection.cpp
+++ b/libs/gui/IDisplayEventConnection.cpp
@@ -29,23 +29,25 @@
explicit BpDisplayEventConnection(const sp<IBinder>& impl)
: BpInterface<IDisplayEventConnection>(impl) {}
- virtual ~BpDisplayEventConnection();
+ ~BpDisplayEventConnection() override;
- virtual sp<BitTube> getDataChannel() const {
+ status_t getDataChannel(sp<BitTube>* outChannel) const override {
Parcel data, reply;
data.writeInterfaceToken(IDisplayEventConnection::getInterfaceDescriptor());
remote()->transact(GET_DATA_CHANNEL, data, &reply);
- return new BitTube(reply);
+ *outChannel = new BitTube(reply);
+ return NO_ERROR;
}
- virtual void setVsyncRate(uint32_t count) {
+ status_t setVsyncRate(uint32_t count) override {
Parcel data, reply;
data.writeInterfaceToken(IDisplayEventConnection::getInterfaceDescriptor());
data.writeUint32(count);
remote()->transact(SET_VSYNC_RATE, data, &reply);
+ return NO_ERROR;
}
- virtual void requestNextVsync() {
+ void requestNextVsync() override {
Parcel data, reply;
data.writeInterfaceToken(IDisplayEventConnection::getInterfaceDescriptor());
remote()->transact(REQUEST_NEXT_VSYNC, data, &reply, IBinder::FLAG_ONEWAY);
@@ -63,7 +65,8 @@
switch (code) {
case GET_DATA_CHANNEL: {
CHECK_INTERFACE(IDisplayEventConnection, data, reply);
- sp<BitTube> channel(getDataChannel());
+ sp<BitTube> channel;
+ getDataChannel(&channel);
channel->writeToParcel(reply);
return NO_ERROR;
}
diff --git a/services/surfaceflinger/EventThread.cpp b/services/surfaceflinger/EventThread.cpp
index 486bce4..463e60c 100644
--- a/services/surfaceflinger/EventThread.cpp
+++ b/services/surfaceflinger/EventThread.cpp
@@ -403,12 +403,14 @@
mEventThread->registerDisplayEventConnection(this);
}
-sp<BitTube> EventThread::Connection::getDataChannel() const {
- return mChannel;
+status_t EventThread::Connection::getDataChannel(sp<BitTube>* outChannel) const {
+ *outChannel = mChannel;
+ return NO_ERROR;
}
-void EventThread::Connection::setVsyncRate(uint32_t count) {
+status_t EventThread::Connection::setVsyncRate(uint32_t count) {
mEventThread->setVsyncRate(count, this);
+ return NO_ERROR;
}
void EventThread::Connection::requestNextVsync() {
diff --git a/services/surfaceflinger/EventThread.h b/services/surfaceflinger/EventThread.h
index 3f1d0bb..c0b5532 100644
--- a/services/surfaceflinger/EventThread.h
+++ b/services/surfaceflinger/EventThread.h
@@ -68,9 +68,9 @@
private:
virtual ~Connection();
virtual void onFirstRef();
- virtual sp<BitTube> getDataChannel() const;
- virtual void setVsyncRate(uint32_t count);
- virtual void requestNextVsync(); // asynchronous
+ status_t getDataChannel(sp<BitTube>* outChannel) const override;
+ status_t setVsyncRate(uint32_t count) override;
+ void requestNextVsync() override; // asynchronous
sp<EventThread> const mEventThread;
sp<BitTube> const mChannel;
};
diff --git a/services/surfaceflinger/MessageQueue.cpp b/services/surfaceflinger/MessageQueue.cpp
index debea58..6ef26fe 100644
--- a/services/surfaceflinger/MessageQueue.cpp
+++ b/services/surfaceflinger/MessageQueue.cpp
@@ -94,7 +94,7 @@
{
mEventThread = eventThread;
mEvents = eventThread->createEventConnection();
- mEventTube = mEvents->getDataChannel();
+ mEvents->getDataChannel(&mEventTube);
mLooper->addFd(mEventTube->getFd(), 0, Looper::EVENT_INPUT,
MessageQueue::cb_eventReceiver, this);
}