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

Commit 6b698e4f authored by Dan Stoza's avatar Dan Stoza
Browse files

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
parent 7d290174
Loading
Loading
Loading
Loading
+3 −5
Original line number Diff line number Diff line
@@ -111,15 +111,13 @@ public:
     * should be destroyed and getEvents() shouldn't be called again.
     */
    ssize_t getEvents(Event* events, size_t count);
    static ssize_t getEvents(const sp<gui::BitTube>& dataChannel,
            Event* events, size_t count);
    static ssize_t getEvents(gui::BitTube* dataChannel, Event* events, size_t count);

    /*
     * sendEvents write events to the queue and returns how many events were
     * written.
     */
    static ssize_t sendEvents(const sp<gui::BitTube>& dataChannel,
            Event const* events, size_t count);
    static ssize_t sendEvents(gui::BitTube* dataChannel, Event const* events, size_t count);

    /*
     * setVsyncRate() sets the Event::VSync delivery rate. A value of
@@ -137,7 +135,7 @@ public:

private:
    sp<IDisplayEventConnection> mEventConnection;
    sp<gui::BitTube> mDataChannel;
    std::unique_ptr<gui::BitTube> mDataChannel;
};

// ----------------------------------------------------------------------------
+4 −2
Original line number Diff line number Diff line
@@ -34,9 +34,11 @@ public:
    DECLARE_META_INTERFACE(DisplayEventConnection)

    /*
     * getDataChannel() returns a BitTube where to receive the events from
     * stealReceiveChannel() returns a BitTube to receive events from. Only the receive file
     * descriptor of outChannel will be initialized, and this effectively "steals" the receive
     * channel from the remote end (such that the remote end can only use its send channel).
     */
    virtual status_t getDataChannel(sp<gui::BitTube>* outChannel) const = 0;
    virtual status_t stealReceiveChannel(gui::BitTube* outChannel) = 0;

    /*
     * setVsyncRate() sets the vsync event delivery rate. A value of 1 returns every vsync event.
+10 −3
Original line number Diff line number Diff line
@@ -78,6 +78,14 @@ int BitTube::getSendFd() const {
    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 @@ status_t BitTube::readFromParcel(const Parcel* parcel) {
    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 @@ ssize_t BitTube::sendObjects(const sp<BitTube>& tube, void const* events, size_t
    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);

+5 −4
Original line number Diff line number Diff line
@@ -37,7 +37,8 @@ DisplayEventReceiver::DisplayEventReceiver() {
    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 @@ status_t DisplayEventReceiver::requestNextVsync() {

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);
+12 −8
Original line number Diff line number Diff line
@@ -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 @@ public:

    ~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 @@ IMPLEMENT_META_INTERFACE(DisplayEventConnection, "android.gui.DisplayEventConnec
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: {
Loading