/
githubmirror
/
liburing
Обзор
Документация
Войти
/
githubmirror
/
liburing
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
liburing-2.12
examples/io_uring-test.c
115 строк
2 KB
Marcel Holtmann
examples/io_uring-test: Fix memory leak
13 янв 2025, 01:01
13 янв 2025, 01:01
3124a46
Код
Авторство
О чём код?
/* SPDX-License-Identifier: MIT */ /* * Simple app that demonstrates how to setup an io_uring interface, * submit and complete IO against it, and then tear it down. * * gcc -Wall -O2 -D_GNU_SOURCE -o io_uring-test io_uring-test.c -luring */ #include <stdio.h> #include <fcntl.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include "liburing.h" #define QD 4 int main(int argc, char *argv[]) { struct io_uring ring; int i, fd, ret, pending, done; struct io_uring_sqe *sqe; struct io_uring_cqe *cqe; struct iovec *iovecs; struct stat sb; ssize_t fsize; off_t offset; void *buf; if (argc < 2) { printf("%s: file\n", argv[0]); return 1; } ret = io_uring_queue_init(QD, &ring, 0); if (ret < 0) { fprintf(stderr, "queue_init: %s\n", strerror(-ret)); return 1; } fd = open(argv[1], O_RDONLY | O_DIRECT); if (fd < 0) { perror("open"); return 1; } if (fstat(fd, &sb) < 0) { perror("fstat"); return 1; } fsize = 0; iovecs = calloc(QD, sizeof(struct iovec)); for (i = 0; i < QD; i++) { if (posix_memalign(&buf, 4096, 4096)) return 1; iovecs[i].iov_base = buf; iovecs[i].iov_len = 4096; fsize += 4096; } offset = 0; i = 0; do { sqe = io_uring_get_sqe(&ring); if (!sqe) break; io_uring_prep_readv(sqe, fd, &iovecs[i], 1, offset); offset += iovecs[i].iov_len; i++; if (offset >= sb.st_size) break; } while (1); ret = io_uring_submit(&ring); if (ret < 0) { fprintf(stderr, "io_uring_submit: %s\n", strerror(-ret)); return 1; } else if (ret != i) { fprintf(stderr, "io_uring_submit submitted less %d\n", ret); return 1; } done = 0; pending = ret; fsize = 0; for (i = 0; i < pending; i++) { ret = io_uring_wait_cqe(&ring, &cqe); if (ret < 0) { fprintf(stderr, "io_uring_wait_cqe: %s\n", strerror(-ret)); return 1; } done++; ret = 0; if (cqe->res != 4096 && cqe->res + fsize != sb.st_size) { fprintf(stderr, "ret=%d, wanted 4096\n", cqe->res); ret = 1; } fsize += cqe->res; io_uring_cqe_seen(&ring, cqe); if (ret) break; } printf("Submitted=%d, completed=%d, bytes=%lu\n", pending, done, (unsigned long) fsize); close(fd); io_uring_queue_exit(&ring); for (i = 0; i < QD; i++) free(iovecs[i].iov_base); free(iovecs); return 0; }