submit-and-wait.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #include "../config-host.h"
  2. /* SPDX-License-Identifier: MIT */
  3. /*
  4. * Description: Test that io_uring_submit_and_wait_timeout() returns the
  5. * right value (submit count) and that it doesn't end up waiting twice.
  6. *
  7. */
  8. #include <errno.h>
  9. #include <stdio.h>
  10. #include <unistd.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include <fcntl.h>
  14. #include <sys/time.h>
  15. #include "liburing.h"
  16. #include "helpers.h"
  17. #include "test.h"
  18. static int test(struct io_uring *ring)
  19. {
  20. struct io_uring_cqe *cqe;
  21. struct io_uring_sqe *sqe;
  22. struct __kernel_timespec ts;
  23. struct timeval tv;
  24. int ret, i;
  25. for (i = 0; i < 1; i++) {
  26. sqe = io_uring_get_sqe(ring);
  27. if (!sqe) {
  28. fprintf(stderr, "get sqe failed at %d\n", i);
  29. goto err;
  30. }
  31. io_uring_prep_nop(sqe);
  32. }
  33. ts.tv_sec = 1;
  34. ts.tv_nsec = 0;
  35. gettimeofday(&tv, NULL);
  36. ret = io_uring_submit_and_wait_timeout(ring, &cqe, 2, &ts, NULL);
  37. if (ret < 0) {
  38. fprintf(stderr, "submit_and_wait_timeout: %d\n", ret);
  39. goto err;
  40. }
  41. ret = mtime_since_now(&tv);
  42. /* allow some slack, should be around 1s */
  43. if (ret > 1200) {
  44. fprintf(stderr, "wait took too long: %d\n", ret);
  45. goto err;
  46. }
  47. return 0;
  48. err:
  49. return 1;
  50. }
  51. static int test_ring(void)
  52. {
  53. struct io_uring ring;
  54. struct io_uring_params p = { };
  55. int ret;
  56. p.flags = 0;
  57. ret = io_uring_queue_init_params(8, &ring, &p);
  58. if (ret) {
  59. fprintf(stderr, "ring setup failed: %d\n", ret);
  60. return 1;
  61. }
  62. ret = test(&ring);
  63. if (ret) {
  64. fprintf(stderr, "test failed\n");
  65. goto err;
  66. }
  67. err:
  68. io_uring_queue_exit(&ring);
  69. return ret;
  70. }
  71. int main(int argc, char *argv[])
  72. {
  73. if (argc > 1)
  74. return 0;
  75. return test_ring();
  76. }