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

Commit d5855a65 authored by Fan Xu's avatar Fan Xu
Browse files

Allow create BufferHubEventFd from existing fd

Add a constructor to BufferHubEventFd.

Rewrite EventFd_testDupEventFd to test on the constructor.

Test: BufferHub_test
Bug: 68770788
Change-Id: I565aff02c1a6e45498e64a817539952911850d48
parent 7bab27f5
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -23,6 +23,8 @@ namespace android {

BufferHubEventFd::BufferHubEventFd() : mFd(eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK)) {}

BufferHubEventFd::BufferHubEventFd(int fd) : mFd(fd) {}

status_t BufferHubEventFd::signal() const {
    if (!isValid()) {
        ALOGE("%s: cannot signal an invalid eventfd.", __FUNCTION__);
+6 −0
Original line number Diff line number Diff line
@@ -29,6 +29,12 @@ public:
     */
    BufferHubEventFd();

    /**
     * Constructs from a valid event fd. Caller is responsible for the validity of the fd. Takes
     * ownership.
     */
    BufferHubEventFd(int fd);

    /**
     * Returns whether this BufferHubEventFd holds a valid event_fd.
     */
+4 −5
Original line number Diff line number Diff line
@@ -91,22 +91,21 @@ TEST_F(BufferHubEventFdTest, EventFd_testDupEventFd) {
    // Technically, the dupliated eventFd and the original eventFd are pointing
    // to the same kernel object. This test signals the duplicated eventFd but epolls the origianl
    // eventFd.
    base::unique_fd dupedEventFd(dup(eventFd.get()));
    BufferHubEventFd dupedEventFd(dup(eventFd.get()));
    ASSERT_GE(dupedEventFd.get(), 0);

    std::array<epoll_event, 1> events;
    EXPECT_EQ(epoll_wait(epollFd.get(), events.data(), events.size(), 0), 0);

    eventfd_write(dupedEventFd.get(), 1);
    dupedEventFd.signal();
    EXPECT_EQ(epoll_wait(epollFd.get(), events.data(), events.size(), 0), 1);

    // The epoll fd is edge triggered, so it only responds to the eventFd once.
    EXPECT_EQ(epoll_wait(epollFd.get(), events.data(), events.size(), 0), 0);

    eventfd_write(dupedEventFd.get(), 1);
    dupedEventFd.signal();

    eventfd_t value;
    eventfd_read(dupedEventFd.get(), &value);
    dupedEventFd.clear();
    EXPECT_EQ(epoll_wait(epollFd.get(), events.data(), events.size(), 0), 0);
}