/* * Copyright (c) 2020 Tobias Svehagen * * SPDX-License-Identifier: Apache-2.0 */ #include "_main.h" void reopen(int *fd, int initval, int flags) { zassert_not_null(fd); zassert_ok(close(*fd)); *fd = eventfd(initval, flags); zassert_true(*fd >= 0, "eventfd(%d, %d) failed: %d", initval, flags, errno); } int is_blocked(int fd, short *event) { struct pollfd pfd; int ret; pfd.fd = fd; pfd.events = *event; ret = poll(&pfd, 1, 0); zassert_true(ret >= 0, "poll failed %d", ret); *event = pfd.revents; return ret == 0; } void eventfd_poll_unset_common(int fd) { eventfd_t val = 0; short event; int ret; event = POLLIN; ret = is_blocked(fd, &event); zassert_equal(ret, 1, "eventfd not blocked with initval == 0"); ret = eventfd_write(fd, TESTVAL); zassert_equal(ret, 0, "write ret %d", ret); event = POLLIN; ret = is_blocked(fd, &event); zassert_equal(ret, 0, "eventfd blocked after write"); zassert_equal(event, POLLIN, "POLLIN not set"); ret = eventfd_write(fd, TESTVAL); zassert_equal(ret, 0, "write ret %d", ret); ret = eventfd_read(fd, &val); zassert_equal(ret, 0, "read ret %d", ret); zassert_equal(val, 2*TESTVAL, "val == %d, expected %d", val, TESTVAL); /* eventfd shall block on subsequent reads */ event = POLLIN; ret = is_blocked(fd, &event); zassert_equal(ret, 1, "eventfd not blocked after read"); } void eventfd_poll_set_common(int fd) { eventfd_t val = 0; short event; int ret; event = POLLIN; ret = is_blocked(fd, &event); zassert_equal(ret, 0, "eventfd is blocked with initval != 0"); ret = eventfd_read(fd, &val); zassert_equal(ret, 0, "read ret %d", ret); zassert_equal(val, TESTVAL, "val == %d", val); event = POLLIN; ret = is_blocked(fd, &event); zassert_equal(ret, 1, "eventfd is not blocked after read"); } static struct eventfd_fixture efd_fixture; static void *setup(void) { efd_fixture.fd = -1; return &efd_fixture; } static void before(void *arg) { struct eventfd_fixture *fixture = arg; fixture->fd = eventfd(0, 0); zassert_true(fixture->fd >= 0, "eventfd(0, 0) failed: %d", errno); } static void after(void *arg) { struct eventfd_fixture *fixture = arg; close(fixture->fd); fixture->fd = -1; } ZTEST_SUITE(eventfd, NULL, setup, before, after, NULL);