| /* |
| * Copyright (c) 2024 Celina Sophie Kalus |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #include "_main.h" |
| #include <zephyr/posix/sys/ioctl.h> |
| |
| #define EFD_IN_USE_INTERNAL 0x1 |
| |
| ZTEST_F(eventfd, test_set_flags) |
| { |
| eventfd_t val; |
| int ret; |
| int flags; |
| short event; |
| |
| /* Get current flags; Expect blocking, non-semaphore. */ |
| flags = ioctl(fixture->fd, F_GETFL, 0); |
| zassert_equal(flags, 0, "flags == %d", flags); |
| |
| event = POLLIN; |
| ret = is_blocked(fixture->fd, &event); |
| zassert_equal(ret, 1, "eventfd read not blocked"); |
| |
| /* Try writing and reading. Should not fail. */ |
| ret = eventfd_write(fixture->fd, 3); |
| zassert_ok(ret); |
| |
| ret = eventfd_read(fixture->fd, &val); |
| zassert_ok(ret); |
| zassert_equal(val, 3, "val == %d", val); |
| |
| |
| /* Set nonblocking without reopening. */ |
| ret = ioctl(fixture->fd, F_SETFL, O_NONBLOCK); |
| zassert_ok(ret); |
| |
| flags = ioctl(fixture->fd, F_GETFL, 0); |
| zassert_equal(flags, O_NONBLOCK, "flags == %d", flags); |
| |
| event = POLLOUT; |
| ret = is_blocked(fixture->fd, &event); |
| zassert_equal(ret, 0, "eventfd write blocked"); |
| |
| |
| /* Try writing and reading again. */ |
| ret = eventfd_write(fixture->fd, 19); |
| zassert_ok(ret); |
| |
| ret = eventfd_read(fixture->fd, &val); |
| zassert_ok(ret); |
| zassert_equal(val, 19, "val == %d", val); |
| |
| |
| /* Set back to blocking. */ |
| ret = ioctl(fixture->fd, F_SETFL, 0); |
| zassert_ok(ret); |
| |
| flags = ioctl(fixture->fd, F_GETFL, 0); |
| zassert_equal(flags, 0, "flags == %d", flags); |
| |
| event = POLLIN; |
| ret = is_blocked(fixture->fd, &event); |
| zassert_equal(ret, 1, "eventfd read not blocked"); |
| |
| |
| /* Try writing and reading again. */ |
| ret = eventfd_write(fixture->fd, 10); |
| zassert_ok(ret); |
| |
| ret = eventfd_read(fixture->fd, &val); |
| zassert_ok(ret); |
| zassert_equal(val, 10, "val == %d", val); |
| |
| |
| /* Test setting internal in-use-flag. Should fail. */ |
| ret = ioctl(fixture->fd, F_SETFL, EFD_IN_USE_INTERNAL); |
| zassert_not_ok(ret); |
| |
| |
| /* File descriptor should still be valid and working. */ |
| ret = eventfd_write(fixture->fd, 97); |
| zassert_ok(ret); |
| |
| ret = eventfd_read(fixture->fd, &val); |
| zassert_ok(ret); |
| zassert_equal(val, 97, "val == %d", val); |
| } |