diff options
author | ilnaz <ilnaz@ydb.tech> | 2022-12-13 16:01:38 +0300 |
---|---|---|
committer | ilnaz <ilnaz@ydb.tech> | 2022-12-13 16:01:38 +0300 |
commit | f2bea70bea01921ec43846224d100f2c70dd5719 (patch) | |
tree | eead917572063b63adc1c9a76284c8fbd10f25a3 /contrib/libs/liburing/test/eeed8b54e0df.c | |
parent | 1ab9ee3dfe0ab4023a3a57bf55de31dff3eac908 (diff) | |
download | ydb-f2bea70bea01921ec43846224d100f2c70dd5719.tar.gz |
Add cross-link
Diffstat (limited to 'contrib/libs/liburing/test/eeed8b54e0df.c')
-rw-r--r-- | contrib/libs/liburing/test/eeed8b54e0df.c | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/contrib/libs/liburing/test/eeed8b54e0df.c b/contrib/libs/liburing/test/eeed8b54e0df.c new file mode 100644 index 0000000000..c4118a2d51 --- /dev/null +++ b/contrib/libs/liburing/test/eeed8b54e0df.c @@ -0,0 +1,116 @@ +#include "../config-host.h" +/* SPDX-License-Identifier: MIT */ +/* + * Description: -EAGAIN handling + * + */ +#include <errno.h> +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> +#include <string.h> +#include <fcntl.h> + +#include "helpers.h" +#include "liburing.h" + +#define BLOCK 4096 + +#ifndef RWF_NOWAIT +#define RWF_NOWAIT 8 +#endif + +static int get_file_fd(void) +{ + ssize_t ret; + char *buf; + int fd; + + fd = open("testfile", O_RDWR | O_CREAT, 0644); + unlink("testfile"); + if (fd < 0) { + perror("open file"); + return -1; + } + + buf = t_malloc(BLOCK); + memset(buf, 0, BLOCK); + ret = write(fd, buf, BLOCK); + if (ret != BLOCK) { + if (ret < 0) + perror("write"); + else + printf("Short write\n"); + goto err; + } + fsync(fd); + + if (posix_fadvise(fd, 0, 4096, POSIX_FADV_DONTNEED)) { + perror("fadvise"); +err: + close(fd); + free(buf); + return -1; + } + + free(buf); + return fd; +} + +int main(int argc, char *argv[]) +{ + struct io_uring ring; + struct io_uring_sqe *sqe; + struct io_uring_cqe *cqe; + struct iovec iov; + int ret, fd; + + if (argc > 1) + return T_EXIT_SKIP; + + iov.iov_base = t_malloc(4096); + iov.iov_len = 4096; + + ret = io_uring_queue_init(2, &ring, 0); + if (ret) { + printf("ring setup failed\n"); + return T_EXIT_FAIL; + + } + + sqe = io_uring_get_sqe(&ring); + if (!sqe) { + printf("get sqe failed\n"); + return T_EXIT_FAIL; + } + + fd = get_file_fd(); + if (fd < 0) + return T_EXIT_FAIL; + + io_uring_prep_readv(sqe, fd, &iov, 1, 0); + sqe->rw_flags = RWF_NOWAIT; + + ret = io_uring_submit(&ring); + if (ret != 1) { + printf("Got submit %d, expected 1\n", ret); + goto err; + } + + ret = io_uring_peek_cqe(&ring, &cqe); + if (ret) { + printf("Ring peek got %d\n", ret); + goto err; + } + + if (cqe->res != -EAGAIN && cqe->res != 4096) { + printf("cqe error: %d\n", cqe->res); + goto err; + } + + close(fd); + return T_EXIT_PASS; +err: + close(fd); + return T_EXIT_FAIL; +} |