libgui: Remove RefBase from BitTube

Removes RefBase from BitTube, since because it is not a Binder object,
it doesn't need to be reference-counted in this way.

In the process, we rename IDisplayEventConnection::getDataChannel to
IDEC::stealReceiveChannel to make it clearer that this is a non-const
operation on the remote end that removes its access to the receive
channel.

This also adds a couple of methods for moving the receive file
descriptor out of one BitTube and into another, since this is the
essence of the IDisplayEventConnection::stealReceiveChannel method,
and now with C++11 move semantics, we can do this without needing to
return an sp<> from EventThread's implementation of stealReceiveChannel.

Test: m -j + manual testing
Change-Id: Ibaaca2a14fb6155052fe5434c14bc3e671b43743
diff --git a/libs/gui/BitTube.cpp b/libs/gui/BitTube.cpp
index c023711..ef7a6f5 100644
--- a/libs/gui/BitTube.cpp
+++ b/libs/gui/BitTube.cpp
@@ -78,6 +78,14 @@
     return mSendFd;
 }
 
+base::unique_fd BitTube::moveReceiveFd() {
+    return std::move(mReceiveFd);
+}
+
+void BitTube::setReceiveFd(base::unique_fd&& receiveFd) {
+    mReceiveFd = std::move(receiveFd);
+}
+
 ssize_t BitTube::write(void const* vaddr, size_t size) {
     ssize_t err, len;
     do {
@@ -121,8 +129,7 @@
     return NO_ERROR;
 }
 
-ssize_t BitTube::sendObjects(const sp<BitTube>& tube, void const* events, size_t count,
-                             size_t objSize) {
+ssize_t BitTube::sendObjects(BitTube* tube, void const* events, size_t count, size_t objSize) {
     const char* vaddr = reinterpret_cast<const char*>(events);
     ssize_t size = tube->write(vaddr, count * objSize);
 
@@ -136,7 +143,7 @@
     return size < 0 ? size : size / static_cast<ssize_t>(objSize);
 }
 
-ssize_t BitTube::recvObjects(const sp<BitTube>& tube, void* events, size_t count, size_t objSize) {
+ssize_t BitTube::recvObjects(BitTube* tube, void* events, size_t count, size_t objSize) {
     char* vaddr = reinterpret_cast<char*>(events);
     ssize_t size = tube->read(vaddr, count * objSize);
 
diff --git a/libs/gui/DisplayEventReceiver.cpp b/libs/gui/DisplayEventReceiver.cpp
index a3ae68c..1507d51 100644
--- a/libs/gui/DisplayEventReceiver.cpp
+++ b/libs/gui/DisplayEventReceiver.cpp
@@ -37,7 +37,8 @@
     if (sf != NULL) {
         mEventConnection = sf->createDisplayEventConnection();
         if (mEventConnection != NULL) {
-            mEventConnection->getDataChannel(&mDataChannel);
+            mDataChannel = std::make_unique<gui::BitTube>();
+            mEventConnection->stealReceiveChannel(mDataChannel.get());
         }
     }
 }
@@ -80,16 +81,16 @@
 
 ssize_t DisplayEventReceiver::getEvents(DisplayEventReceiver::Event* events,
         size_t count) {
-    return DisplayEventReceiver::getEvents(mDataChannel, events, count);
+    return DisplayEventReceiver::getEvents(mDataChannel.get(), events, count);
 }
 
-ssize_t DisplayEventReceiver::getEvents(const sp<gui::BitTube>& dataChannel,
+ssize_t DisplayEventReceiver::getEvents(gui::BitTube* dataChannel,
         Event* events, size_t count)
 {
     return gui::BitTube::recvObjects(dataChannel, events, count);
 }
 
-ssize_t DisplayEventReceiver::sendEvents(const sp<gui::BitTube>& dataChannel,
+ssize_t DisplayEventReceiver::sendEvents(gui::BitTube* dataChannel,
         Event const* events, size_t count)
 {
     return gui::BitTube::sendObjects(dataChannel, events, count);
diff --git a/libs/gui/IDisplayEventConnection.cpp b/libs/gui/IDisplayEventConnection.cpp
index d3ee39c..a197426 100644
--- a/libs/gui/IDisplayEventConnection.cpp
+++ b/libs/gui/IDisplayEventConnection.cpp
@@ -22,7 +22,11 @@
 
 namespace android {
 
-enum { GET_DATA_CHANNEL = IBinder::FIRST_CALL_TRANSACTION, SET_VSYNC_RATE, REQUEST_NEXT_VSYNC };
+enum {
+    STEAL_RECEIVE_CHANNEL = IBinder::FIRST_CALL_TRANSACTION,
+    SET_VSYNC_RATE,
+    REQUEST_NEXT_VSYNC
+};
 
 class BpDisplayEventConnection : public BpInterface<IDisplayEventConnection> {
 public:
@@ -31,11 +35,11 @@
 
     ~BpDisplayEventConnection() override;
 
-    status_t getDataChannel(sp<gui::BitTube>* outChannel) const override {
+    status_t stealReceiveChannel(gui::BitTube* outChannel) override {
         Parcel data, reply;
         data.writeInterfaceToken(IDisplayEventConnection::getInterfaceDescriptor());
-        remote()->transact(GET_DATA_CHANNEL, data, &reply);
-        *outChannel = new gui::BitTube(reply);
+        remote()->transact(STEAL_RECEIVE_CHANNEL, data, &reply);
+        outChannel->readFromParcel(&reply);
         return NO_ERROR;
     }
 
@@ -63,11 +67,11 @@
 status_t BnDisplayEventConnection::onTransact(uint32_t code, const Parcel& data, Parcel* reply,
                                               uint32_t flags) {
     switch (code) {
-        case GET_DATA_CHANNEL: {
+        case STEAL_RECEIVE_CHANNEL: {
             CHECK_INTERFACE(IDisplayEventConnection, data, reply);
-            sp<gui::BitTube> channel;
-            getDataChannel(&channel);
-            channel->writeToParcel(reply);
+            gui::BitTube channel;
+            stealReceiveChannel(&channel);
+            channel.writeToParcel(reply);
             return NO_ERROR;
         }
         case SET_VSYNC_RATE: {
diff --git a/libs/gui/include/private/gui/BitTube.h b/libs/gui/include/private/gui/BitTube.h
index e93dc5f..13c0162 100644
--- a/libs/gui/include/private/gui/BitTube.h
+++ b/libs/gui/include/private/gui/BitTube.h
@@ -16,14 +16,9 @@
 
 #pragma once
 
-#include <stdint.h>
-#include <sys/types.h>
-
-#include <android/log.h>
 #include <android-base/unique_fd.h>
 #include <binder/Parcelable.h>
 #include <utils/Errors.h>
-#include <utils/RefBase.h>
 
 namespace android {
 
@@ -31,7 +26,7 @@
 
 namespace gui {
 
-class BitTube : public RefBase, public Parcelable {
+class BitTube : public Parcelable {
 public:
     // creates an uninitialized BitTube (to unparcel into)
     BitTube() = default;
@@ -57,16 +52,22 @@
     // get the send file-descriptor.
     int getSendFd() const;
 
+    // moves the receive file descriptor out of this BitTube
+    base::unique_fd moveReceiveFd();
+
+    // resets this BitTube's receive file descriptor to receiveFd
+    void setReceiveFd(base::unique_fd&& receiveFd);
+
     // send objects (sized blobs). All objects are guaranteed to be written or the call fails.
     template <typename T>
-    static ssize_t sendObjects(const sp<BitTube>& tube, T const* events, size_t count) {
+    static ssize_t sendObjects(BitTube* tube, T const* events, size_t count) {
         return sendObjects(tube, events, count, sizeof(T));
     }
 
     // receive objects (sized blobs). If the receiving buffer isn't large enough, excess messages
     // are silently discarded.
     template <typename T>
-    static ssize_t recvObjects(const sp<BitTube>& tube, T* events, size_t count) {
+    static ssize_t recvObjects(BitTube* tube, T* events, size_t count) {
         return recvObjects(tube, events, count, sizeof(T));
     }
 
@@ -87,10 +88,9 @@
     base::unique_fd mSendFd;
     mutable base::unique_fd mReceiveFd;
 
-    static ssize_t sendObjects(const sp<BitTube>& tube, void const* events, size_t count,
-                               size_t objSize);
+    static ssize_t sendObjects(BitTube* tube, void const* events, size_t count, size_t objSize);
 
-    static ssize_t recvObjects(const sp<BitTube>& tube, void* events, size_t count, size_t objSize);
+    static ssize_t recvObjects(BitTube* tube, void* events, size_t count, size_t objSize);
 };
 
 } // namespace gui