uringmachine 0.3 → 0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (138) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -0
  3. data/README.md +85 -0
  4. data/TODO.md +5 -0
  5. data/examples/echo_server.rb +18 -40
  6. data/examples/inout.rb +19 -0
  7. data/examples/nc.rb +36 -0
  8. data/ext/um/extconf.rb +6 -15
  9. data/ext/um/um.c +245 -53
  10. data/ext/um/um.h +21 -9
  11. data/ext/um/um_class.c +74 -87
  12. data/ext/um/um_const.c +184 -0
  13. data/ext/um/um_op.c +10 -13
  14. data/ext/um/um_utils.c +48 -3
  15. data/lib/uringmachine/version.rb +1 -1
  16. data/lib/uringmachine.rb +12 -0
  17. data/test/helper.rb +8 -0
  18. data/test/test_um.rb +227 -7
  19. data/vendor/liburing/.github/workflows/build.yml +29 -1
  20. data/vendor/liburing/.gitignore +1 -0
  21. data/vendor/liburing/CHANGELOG +15 -0
  22. data/vendor/liburing/CONTRIBUTING.md +165 -0
  23. data/vendor/liburing/configure +32 -0
  24. data/vendor/liburing/examples/Makefile +8 -1
  25. data/vendor/liburing/examples/kdigest.c +405 -0
  26. data/vendor/liburing/examples/proxy.c +75 -8
  27. data/vendor/liburing/liburing.pc.in +1 -1
  28. data/vendor/liburing/src/Makefile +16 -2
  29. data/vendor/liburing/src/include/liburing/io_uring.h +31 -0
  30. data/vendor/liburing/src/include/liburing/sanitize.h +39 -0
  31. data/vendor/liburing/src/include/liburing.h +31 -4
  32. data/vendor/liburing/src/liburing-ffi.map +5 -0
  33. data/vendor/liburing/src/liburing.map +1 -0
  34. data/vendor/liburing/src/queue.c +3 -0
  35. data/vendor/liburing/src/register.c +36 -0
  36. data/vendor/liburing/src/sanitize.c +176 -0
  37. data/vendor/liburing/src/setup.c +1 -1
  38. data/vendor/liburing/test/35fa71a030ca.c +7 -0
  39. data/vendor/liburing/test/500f9fbadef8.c +2 -0
  40. data/vendor/liburing/test/7ad0e4b2f83c.c +0 -25
  41. data/vendor/liburing/test/917257daa0fe.c +7 -0
  42. data/vendor/liburing/test/Makefile +31 -4
  43. data/vendor/liburing/test/a0908ae19763.c +7 -0
  44. data/vendor/liburing/test/a4c0b3decb33.c +7 -0
  45. data/vendor/liburing/test/accept.c +14 -4
  46. data/vendor/liburing/test/b19062a56726.c +7 -0
  47. data/vendor/liburing/test/bind-listen.c +2 -2
  48. data/vendor/liburing/test/buf-ring-nommap.c +10 -3
  49. data/vendor/liburing/test/buf-ring.c +2 -0
  50. data/vendor/liburing/test/coredump.c +7 -0
  51. data/vendor/liburing/test/cq-overflow.c +13 -1
  52. data/vendor/liburing/test/d4ae271dfaae.c +11 -3
  53. data/vendor/liburing/test/defer-taskrun.c +2 -2
  54. data/vendor/liburing/test/defer-tw-timeout.c +4 -1
  55. data/vendor/liburing/test/defer.c +2 -2
  56. data/vendor/liburing/test/double-poll-crash.c +1 -1
  57. data/vendor/liburing/test/eeed8b54e0df.c +2 -0
  58. data/vendor/liburing/test/eventfd.c +0 -1
  59. data/vendor/liburing/test/exit-no-cleanup.c +11 -0
  60. data/vendor/liburing/test/fadvise.c +9 -26
  61. data/vendor/liburing/test/fdinfo.c +9 -1
  62. data/vendor/liburing/test/file-register.c +14 -2
  63. data/vendor/liburing/test/file-update.c +1 -1
  64. data/vendor/liburing/test/file-verify.c +27 -16
  65. data/vendor/liburing/test/files-exit-hang-timeout.c +1 -2
  66. data/vendor/liburing/test/fixed-buf-iter.c +3 -1
  67. data/vendor/liburing/test/fixed-hugepage.c +12 -1
  68. data/vendor/liburing/test/fsnotify.c +1 -0
  69. data/vendor/liburing/test/futex.c +16 -4
  70. data/vendor/liburing/test/helpers.c +47 -0
  71. data/vendor/liburing/test/helpers.h +6 -0
  72. data/vendor/liburing/test/init-mem.c +5 -3
  73. data/vendor/liburing/test/io-cancel.c +0 -24
  74. data/vendor/liburing/test/io_uring_passthrough.c +2 -0
  75. data/vendor/liburing/test/io_uring_register.c +25 -6
  76. data/vendor/liburing/test/iopoll-leak.c +4 -0
  77. data/vendor/liburing/test/iopoll-overflow.c +1 -1
  78. data/vendor/liburing/test/iopoll.c +3 -3
  79. data/vendor/liburing/test/kallsyms.c +203 -0
  80. data/vendor/liburing/test/link-timeout.c +159 -0
  81. data/vendor/liburing/test/linked-defer-close.c +224 -0
  82. data/vendor/liburing/test/madvise.c +12 -25
  83. data/vendor/liburing/test/min-timeout-wait.c +0 -25
  84. data/vendor/liburing/test/min-timeout.c +0 -25
  85. data/vendor/liburing/test/mkdir.c +6 -0
  86. data/vendor/liburing/test/msg-ring.c +8 -2
  87. data/vendor/liburing/test/napi-test.c +15 -2
  88. data/vendor/liburing/test/no-mmap-inval.c +2 -0
  89. data/vendor/liburing/test/nop.c +44 -0
  90. data/vendor/liburing/test/ooo-file-unreg.c +1 -1
  91. data/vendor/liburing/test/open-close.c +40 -0
  92. data/vendor/liburing/test/openat2.c +37 -14
  93. data/vendor/liburing/test/poll-many.c +13 -7
  94. data/vendor/liburing/test/poll-mshot-update.c +17 -10
  95. data/vendor/liburing/test/poll-v-poll.c +6 -3
  96. data/vendor/liburing/test/pollfree.c +148 -0
  97. data/vendor/liburing/test/read-mshot-empty.c +156 -153
  98. data/vendor/liburing/test/read-mshot.c +276 -27
  99. data/vendor/liburing/test/read-write.c +78 -13
  100. data/vendor/liburing/test/recv-msgall-stream.c +3 -0
  101. data/vendor/liburing/test/recv-msgall.c +5 -0
  102. data/vendor/liburing/test/recvsend_bundle-inc.c +680 -0
  103. data/vendor/liburing/test/recvsend_bundle.c +92 -29
  104. data/vendor/liburing/test/reg-fd-only.c +14 -4
  105. data/vendor/liburing/test/regbuf-clone.c +187 -0
  106. data/vendor/liburing/test/regbuf-merge.c +7 -0
  107. data/vendor/liburing/test/register-restrictions.c +86 -85
  108. data/vendor/liburing/test/rename.c +59 -1
  109. data/vendor/liburing/test/ringbuf-read.c +5 -0
  110. data/vendor/liburing/test/ringbuf-status.c +5 -1
  111. data/vendor/liburing/test/runtests.sh +16 -1
  112. data/vendor/liburing/test/send-zerocopy.c +59 -0
  113. data/vendor/liburing/test/short-read.c +1 -0
  114. data/vendor/liburing/test/socket.c +43 -0
  115. data/vendor/liburing/test/splice.c +3 -1
  116. data/vendor/liburing/test/sq-poll-dup.c +1 -1
  117. data/vendor/liburing/test/sq-poll-share.c +2 -0
  118. data/vendor/liburing/test/sqpoll-disable-exit.c +8 -0
  119. data/vendor/liburing/test/sqpoll-exit-hang.c +1 -25
  120. data/vendor/liburing/test/sqpoll-sleep.c +1 -25
  121. data/vendor/liburing/test/statx.c +89 -0
  122. data/vendor/liburing/test/stdout.c +2 -0
  123. data/vendor/liburing/test/submit-and-wait.c +1 -25
  124. data/vendor/liburing/test/submit-reuse.c +4 -26
  125. data/vendor/liburing/test/symlink.c +12 -1
  126. data/vendor/liburing/test/sync-cancel.c +48 -21
  127. data/vendor/liburing/test/thread-exit.c +5 -0
  128. data/vendor/liburing/test/timeout-new.c +1 -26
  129. data/vendor/liburing/test/timeout.c +12 -26
  130. data/vendor/liburing/test/unlink.c +94 -1
  131. data/vendor/liburing/test/uring_cmd_ublk.c +1252 -0
  132. data/vendor/liburing/test/waitid.c +62 -8
  133. data/vendor/liburing/test/wq-aff.c +35 -0
  134. data/vendor/liburing/test/xfail_prep_link_timeout_out_of_scope.c +46 -0
  135. data/vendor/liburing/test/xfail_register_buffers_out_of_scope.c +51 -0
  136. metadata +17 -4
  137. data/examples/event_loop.rb +0 -69
  138. data/examples/fibers.rb +0 -105
@@ -19,6 +19,39 @@ static void child(long usleep_time)
19
19
  exit(0);
20
20
  }
21
21
 
22
+ static int test_invalid_infop(struct io_uring *ring)
23
+ {
24
+ struct io_uring_sqe *sqe;
25
+ struct io_uring_cqe *cqe;
26
+ siginfo_t *si = (siginfo_t *) (uintptr_t) 0x1234;
27
+ int ret, w;
28
+ pid_t pid;
29
+
30
+ pid = fork();
31
+ if (!pid) {
32
+ child(200000);
33
+ exit(0);
34
+ }
35
+
36
+ sqe = io_uring_get_sqe(ring);
37
+ io_uring_prep_waitid(sqe, P_PID, pid, si, WEXITED, 0);
38
+ sqe->user_data = 1;
39
+ io_uring_submit(ring);
40
+
41
+ ret = io_uring_wait_cqe(ring, &cqe);
42
+ if (ret) {
43
+ fprintf(stderr, "cqe wait: %d\n", ret);
44
+ return T_EXIT_FAIL;
45
+ }
46
+ if (cqe->res != -EFAULT) {
47
+ fprintf(stderr, "Bad return on invalid infop: %d\n", cqe->res);
48
+ return T_EXIT_FAIL;
49
+ }
50
+ io_uring_cqe_seen(ring, cqe);
51
+ wait(&w);
52
+ return T_EXIT_PASS;
53
+ }
54
+
22
55
  /*
23
56
  * Test linked timeout with child not exiting in time
24
57
  */
@@ -27,9 +60,9 @@ static int test_noexit(struct io_uring *ring)
27
60
  struct io_uring_sqe *sqe;
28
61
  struct io_uring_cqe *cqe;
29
62
  struct __kernel_timespec ts;
63
+ int ret, i, w;
30
64
  siginfo_t si;
31
65
  pid_t pid;
32
- int ret, i;
33
66
 
34
67
  pid = fork();
35
68
  if (!pid) {
@@ -67,6 +100,7 @@ static int test_noexit(struct io_uring *ring)
67
100
  io_uring_cqe_seen(ring, cqe);
68
101
  }
69
102
 
103
+ wait(&w);
70
104
  return T_EXIT_PASS;
71
105
  }
72
106
 
@@ -79,7 +113,7 @@ static int test_double(struct io_uring *ring)
79
113
  struct io_uring_cqe *cqe;
80
114
  siginfo_t si;
81
115
  pid_t p1, p2;
82
- int ret;
116
+ int ret, w;
83
117
 
84
118
  /* p1 will exit shortly */
85
119
  p1 = fork();
@@ -116,6 +150,7 @@ static int test_double(struct io_uring *ring)
116
150
  }
117
151
 
118
152
  io_uring_cqe_seen(ring, cqe);
153
+ wait(&w);
119
154
  return T_EXIT_PASS;
120
155
  }
121
156
 
@@ -167,7 +202,7 @@ static int test_cancel(struct io_uring *ring)
167
202
  {
168
203
  struct io_uring_sqe *sqe;
169
204
  struct io_uring_cqe *cqe;
170
- int ret, i;
205
+ int ret, i, w;
171
206
  pid_t pid;
172
207
 
173
208
  pid = fork();
@@ -205,6 +240,7 @@ static int test_cancel(struct io_uring *ring)
205
240
  io_uring_cqe_seen(ring, cqe);
206
241
  }
207
242
 
243
+ wait(&w);
208
244
  return T_EXIT_PASS;
209
245
  }
210
246
 
@@ -216,10 +252,12 @@ static int test_cancel_race(struct io_uring *ring, int async)
216
252
  {
217
253
  struct io_uring_sqe *sqe;
218
254
  struct io_uring_cqe *cqe;
219
- int ret, i;
255
+ int ret, i, to_wait, total_forks;
220
256
  pid_t pid;
221
257
 
258
+ total_forks = 0;
222
259
  for (i = 0; i < 10; i++) {
260
+ total_forks++;
223
261
  pid = fork();
224
262
  if (!pid) {
225
263
  child(getpid() & 1);
@@ -243,16 +281,20 @@ static int test_cancel_race(struct io_uring *ring, int async)
243
281
 
244
282
  io_uring_submit(ring);
245
283
 
284
+ to_wait = total_forks;
246
285
  for (i = 0; i < 2; i++) {
247
286
  ret = io_uring_wait_cqe(ring, &cqe);
248
287
  if (ret) {
249
288
  fprintf(stderr, "cqe wait: %d\n", ret);
250
289
  return T_EXIT_FAIL;
251
290
  }
252
- if (cqe->user_data == 1 && !(cqe->res == -ECANCELED ||
253
- cqe->res == 0)) {
254
- fprintf(stderr, "cqe1 res: %d\n", cqe->res);
255
- return T_EXIT_FAIL;
291
+ if (cqe->user_data == 1) {
292
+ if (!cqe->res)
293
+ to_wait--;
294
+ if (!(cqe->res == -ECANCELED || cqe->res == 0)) {
295
+ fprintf(stderr, "cqe1 res: %d\n", cqe->res);
296
+ return T_EXIT_FAIL;
297
+ }
256
298
  }
257
299
  if (cqe->user_data == 2 &&
258
300
  !(cqe->res == 1 || cqe->res == 0 || cqe->res == -ENOENT ||
@@ -263,6 +305,12 @@ static int test_cancel_race(struct io_uring *ring, int async)
263
305
  io_uring_cqe_seen(ring, cqe);
264
306
  }
265
307
 
308
+ for (i = 0; i < to_wait; i++) {
309
+ int w;
310
+
311
+ wait(&w);
312
+ }
313
+
266
314
  return T_EXIT_PASS;
267
315
  }
268
316
 
@@ -360,6 +408,12 @@ int main(int argc, char *argv[])
360
408
  return T_EXIT_FAIL;
361
409
  }
362
410
 
411
+ ret = test_invalid_infop(&ring);
412
+ if (ret == T_EXIT_FAIL) {
413
+ fprintf(stderr, "test_invalid_infop failed\n");
414
+ return T_EXIT_FAIL;
415
+ }
416
+
363
417
  for (i = 0; i < 1000; i++) {
364
418
  ret = test_cancel_race(&ring, i & 1);
365
419
  if (ret == T_EXIT_FAIL) {
@@ -127,6 +127,33 @@ static int test(int sqpoll)
127
127
  return ret;
128
128
  }
129
129
 
130
+ static int test_invalid_cpu(void)
131
+ {
132
+ struct io_uring_params p = { };
133
+ struct io_uring ring;
134
+ int ret, nr_cpus;
135
+
136
+ nr_cpus = sysconf(_SC_NPROCESSORS_ONLN);
137
+ if (nr_cpus < 0) {
138
+ perror("sysconf(_SC_NPROCESSORS_ONLN");
139
+ return T_EXIT_SKIP;
140
+ }
141
+
142
+ p.flags = IORING_SETUP_SQPOLL | IORING_SETUP_SQ_AFF;
143
+ p.sq_thread_cpu = 16 * nr_cpus;
144
+
145
+ ret = io_uring_queue_init_params(8, &ring, &p);
146
+ if (ret == -EPERM) {
147
+ return T_EXIT_SKIP;
148
+ } else if (ret != -EINVAL) {
149
+ fprintf(stderr, "Queue init: %d\n", ret);
150
+ return T_EXIT_FAIL;
151
+ }
152
+
153
+ io_uring_queue_exit(&ring);
154
+ return T_EXIT_PASS;
155
+ }
156
+
130
157
  int main(int argc, char *argv[])
131
158
  {
132
159
  int ret;
@@ -134,6 +161,14 @@ int main(int argc, char *argv[])
134
161
  if (argc > 1)
135
162
  return T_EXIT_SKIP;
136
163
 
164
+ ret = test_invalid_cpu();
165
+ if (ret == T_EXIT_SKIP) {
166
+ return T_EXIT_SKIP;
167
+ } else if (ret != T_EXIT_PASS) {
168
+ fprintf(stderr, "test sqpoll cpu failed\n");
169
+ return T_EXIT_FAIL;
170
+ }
171
+
137
172
  ret = test(1);
138
173
  if (ret == T_EXIT_SKIP) {
139
174
  return T_EXIT_SKIP;
@@ -0,0 +1,46 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Description: Check to see if the asan checks catch an stack-use-after-free for prep_link_timeout
4
+ */
5
+
6
+ #include <stdio.h>
7
+ #include <errno.h>
8
+ #include <sys/socket.h>
9
+ #include <sys/un.h>
10
+ #include <assert.h>
11
+ #include "liburing.h"
12
+ #include "helpers.h"
13
+
14
+ #include <stdio.h>
15
+
16
+ int main(int argc, char *argv[])
17
+ {
18
+ struct io_uring ring;
19
+ struct io_uring_sqe *sqe;
20
+ int ret;
21
+
22
+ if (argc > 1)
23
+ return T_EXIT_SKIP;
24
+
25
+ ret = io_uring_queue_init(8, &ring, 0);
26
+ if (ret < 0) {
27
+ printf("io_uring_queue_init ret %i\n", ret);
28
+ return T_EXIT_PASS; // this test expects an inverted exit code
29
+ }
30
+
31
+ // force timespec to go out of scope, test "passes" if asan catches this bug.
32
+ {
33
+ struct __kernel_timespec timespec;
34
+ timespec.tv_sec = 0;
35
+ timespec.tv_nsec = 5000;
36
+
37
+ sqe = io_uring_get_sqe(&ring);
38
+ io_uring_prep_timeout(sqe, &timespec, 0, 0);
39
+ io_uring_sqe_set_data(sqe, (void *) 1);
40
+ }
41
+
42
+ ret = io_uring_submit_and_wait(&ring, 1);
43
+ printf("submit_and_wait %i\n", ret);
44
+
45
+ return T_EXIT_PASS; // this test expects an inverted exit code
46
+ }
@@ -0,0 +1,51 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Description: Check to see if the asan checks catch an stack-use-after-free for io_uring_sqe_set_data
4
+ */
5
+
6
+ #include <stdio.h>
7
+ #include <errno.h>
8
+ #include <sys/socket.h>
9
+ #include <sys/un.h>
10
+ #include <assert.h>
11
+ #include <stdlib.h>
12
+ #include "liburing.h"
13
+ #include "helpers.h"
14
+
15
+ #include <stdio.h>
16
+
17
+ #define BUFFERS 8
18
+ #define BUFFER_SIZE 128
19
+
20
+ int main(int argc, char *argv[])
21
+ {
22
+ struct io_uring ring;
23
+ struct iovec *iovs;
24
+ int i;
25
+ int ret;
26
+
27
+ if (argc > 1)
28
+ return T_EXIT_SKIP;
29
+
30
+ ret = io_uring_queue_init(8, &ring, 0);
31
+ if (ret < 0) {
32
+ printf("io_uring_queue_init ret %i\n", ret);
33
+ return T_EXIT_PASS; // this test expects an inverted exit code
34
+ }
35
+
36
+ iovs = calloc(BUFFERS, sizeof(struct iovec));
37
+ for (i = 0; i < BUFFERS; i++) {
38
+ iovs[i].iov_base = malloc(BUFFER_SIZE);
39
+ iovs[i].iov_len = BUFFER_SIZE;
40
+ }
41
+ // force one iov_base to be freed, test "passes" if asan catches this bug.
42
+ free(iovs[4].iov_base);
43
+
44
+ ret = io_uring_register_buffers(&ring, iovs, BUFFERS);
45
+ printf("io_uring_register_buffers %i\n", ret);
46
+
47
+ ret = io_uring_submit_and_wait(&ring, 1);
48
+ printf("submit_and_wait %i\n", ret);
49
+
50
+ return T_EXIT_PASS; // this test expects an inverted exit code
51
+ }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: uringmachine
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.3'
4
+ version: '0.4'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sharon Rosner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-10-04 00:00:00.000000000 Z
11
+ date: 2024-10-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake-compiler
@@ -85,15 +85,16 @@ files:
85
85
  - Rakefile
86
86
  - TODO.md
87
87
  - examples/echo_server.rb
88
- - examples/event_loop.rb
89
- - examples/fibers.rb
90
88
  - examples/http_server.rb
91
89
  - examples/http_server_multishot.rb
92
90
  - examples/http_server_simpler.rb
91
+ - examples/inout.rb
92
+ - examples/nc.rb
93
93
  - ext/um/extconf.rb
94
94
  - ext/um/um.c
95
95
  - ext/um/um.h
96
96
  - ext/um/um_class.c
97
+ - ext/um/um_const.c
97
98
  - ext/um/um_ext.c
98
99
  - ext/um/um_op.c
99
100
  - ext/um/um_utils.c
@@ -110,6 +111,7 @@ files:
110
111
  - vendor/liburing/.gitignore
111
112
  - vendor/liburing/CHANGELOG
112
113
  - vendor/liburing/CITATION.cff
114
+ - vendor/liburing/CONTRIBUTING.md
113
115
  - vendor/liburing/COPYING
114
116
  - vendor/liburing/COPYING.GPL
115
117
  - vendor/liburing/LICENSE
@@ -140,6 +142,7 @@ files:
140
142
  - vendor/liburing/examples/io_uring-cp.c
141
143
  - vendor/liburing/examples/io_uring-test.c
142
144
  - vendor/liburing/examples/io_uring-udp.c
145
+ - vendor/liburing/examples/kdigest.c
143
146
  - vendor/liburing/examples/link-cp.c
144
147
  - vendor/liburing/examples/napi-busy-poll-client.c
145
148
  - vendor/liburing/examples/napi-busy-poll-server.c
@@ -167,6 +170,7 @@ files:
167
170
  - vendor/liburing/src/include/liburing.h
168
171
  - vendor/liburing/src/include/liburing/barrier.h
169
172
  - vendor/liburing/src/include/liburing/io_uring.h
173
+ - vendor/liburing/src/include/liburing/sanitize.h
170
174
  - vendor/liburing/src/int_flags.h
171
175
  - vendor/liburing/src/lib.h
172
176
  - vendor/liburing/src/liburing-ffi.map
@@ -174,6 +178,7 @@ files:
174
178
  - vendor/liburing/src/nolibc.c
175
179
  - vendor/liburing/src/queue.c
176
180
  - vendor/liburing/src/register.c
181
+ - vendor/liburing/src/sanitize.c
177
182
  - vendor/liburing/src/setup.c
178
183
  - vendor/liburing/src/setup.h
179
184
  - vendor/liburing/src/syscall.c
@@ -261,11 +266,13 @@ files:
261
266
  - vendor/liburing/test/iopoll-leak.c
262
267
  - vendor/liburing/test/iopoll-overflow.c
263
268
  - vendor/liburing/test/iopoll.c
269
+ - vendor/liburing/test/kallsyms.c
264
270
  - vendor/liburing/test/lfs-openat-write.c
265
271
  - vendor/liburing/test/lfs-openat.c
266
272
  - vendor/liburing/test/link-timeout.c
267
273
  - vendor/liburing/test/link.c
268
274
  - vendor/liburing/test/link_drain.c
275
+ - vendor/liburing/test/linked-defer-close.c
269
276
  - vendor/liburing/test/madvise.c
270
277
  - vendor/liburing/test/min-timeout-wait.c
271
278
  - vendor/liburing/test/min-timeout.c
@@ -303,6 +310,7 @@ files:
303
310
  - vendor/liburing/test/poll-ring.c
304
311
  - vendor/liburing/test/poll-v-poll.c
305
312
  - vendor/liburing/test/poll.c
313
+ - vendor/liburing/test/pollfree.c
306
314
  - vendor/liburing/test/probe.c
307
315
  - vendor/liburing/test/read-before-exit.c
308
316
  - vendor/liburing/test/read-mshot-empty.c
@@ -311,10 +319,12 @@ files:
311
319
  - vendor/liburing/test/recv-msgall-stream.c
312
320
  - vendor/liburing/test/recv-msgall.c
313
321
  - vendor/liburing/test/recv-multishot.c
322
+ - vendor/liburing/test/recvsend_bundle-inc.c
314
323
  - vendor/liburing/test/recvsend_bundle.c
315
324
  - vendor/liburing/test/reg-fd-only.c
316
325
  - vendor/liburing/test/reg-hint.c
317
326
  - vendor/liburing/test/reg-reg-ring.c
327
+ - vendor/liburing/test/regbuf-clone.c
318
328
  - vendor/liburing/test/regbuf-merge.c
319
329
  - vendor/liburing/test/register-restrictions.c
320
330
  - vendor/liburing/test/rename.c
@@ -369,12 +379,15 @@ files:
369
379
  - vendor/liburing/test/truncate.c
370
380
  - vendor/liburing/test/tty-write-dpoll.c
371
381
  - vendor/liburing/test/unlink.c
382
+ - vendor/liburing/test/uring_cmd_ublk.c
372
383
  - vendor/liburing/test/version.c
373
384
  - vendor/liburing/test/wait-timeout.c
374
385
  - vendor/liburing/test/waitid.c
375
386
  - vendor/liburing/test/wakeup-hang.c
376
387
  - vendor/liburing/test/wq-aff.c
377
388
  - vendor/liburing/test/xattr.c
389
+ - vendor/liburing/test/xfail_prep_link_timeout_out_of_scope.c
390
+ - vendor/liburing/test/xfail_register_buffers_out_of_scope.c
378
391
  homepage: https://github.com/digital-fabric/uringmachine
379
392
  licenses:
380
393
  - MIT
@@ -1,69 +0,0 @@
1
- require_relative '../lib/iou'
2
- require 'socket'
3
-
4
- class IOUEventLoop
5
- attr_reader :ring
6
-
7
- def initialize
8
- @ring = IOU::Ring.new
9
- end
10
-
11
- def async_queue
12
- @async_queue ||= []
13
- end
14
-
15
- def async(&block)
16
- @async_queue << block
17
- signal if @waiting
18
- end
19
-
20
- def signal
21
- # generate an event to cause process_completions to return
22
- ring.prep_nop
23
- ring.submit
24
- end
25
-
26
- def run_async_tasks
27
- pending = @async_queue
28
- @async_queue = []
29
- pending&.each(&:call)
30
- end
31
-
32
- def run
33
- yield if block_given?
34
- while !@stopped
35
- run_async_tasks
36
- @waiting = true
37
- ring.process_completions
38
- @waiting = false
39
- end
40
- end
41
-
42
- def stop
43
- @stopped = true
44
- signal if @waiting
45
- end
46
-
47
- def timeout(delay, &block)
48
- ring.prep_timeout(interval: delay, &block)
49
- ring.submit
50
- end
51
-
52
- def interval(period, &block)
53
- ring.prep_timeout(interval: period, multishot: true, &block)
54
- ring.submit
55
- end
56
- end
57
-
58
- # exaple usage
59
- event_loop = IOUEventLoop.new
60
-
61
- trap('SIGINT') { event_loop.stop }
62
-
63
- event_loop.run do
64
- event_loop.interval(1) do
65
- puts "The time is #{Time.now}"
66
- end
67
- end
68
-
69
- puts "Stopped"
data/examples/fibers.rb DELETED
@@ -1,105 +0,0 @@
1
- require_relative '../lib/iou'
2
- require 'socket'
3
- require 'fiber'
4
-
5
- class ::Fiber
6
- attr_accessor :__op_id
7
- end
8
-
9
- class Scheduler
10
- class Cancel < Exception
11
- end
12
-
13
- attr_reader :ring
14
-
15
- def initialize
16
- @ring = IOU::Ring.new
17
- @runqueue = []
18
- end
19
-
20
- def switchpoint
21
- while true
22
- f, v = @runqueue.shift
23
- if f
24
- return f.transfer(v)
25
- end
26
-
27
- @ring.process_completions
28
- end
29
- end
30
-
31
- def fiber_wait(op_id)
32
- Fiber.current.__op_id = op_id
33
- v = switchpoint
34
- Fiber.current.__op_id = nil
35
- raise v if v.is_a?(Exception)
36
-
37
- v
38
- end
39
-
40
- def read(**args)
41
- f = Fiber.current
42
- id = ring.prep_read(**args) do |c|
43
- if c[:result] < 0
44
- @runqueue << [f, RuntimeError.new('error')]
45
- else
46
- @runqueue << [f, c[:buffer]]
47
- end
48
- end
49
- fiber_wait(id)
50
- end
51
-
52
- def write(**args)
53
- f = Fiber.current
54
- id = ring.prep_write(**args) do |c|
55
- if c[:result] < 0
56
- @runqueue << [f, RuntimeError.new('error')]
57
- else
58
- @runqueue << [f, c[:result]]
59
- end
60
- end
61
- fiber_wait(id)
62
- end
63
-
64
- def sleep(interval)
65
- f = Fiber.current
66
- id = ring.prep_timeout(interval: interval) do |c|
67
- if c[:result] == Errno::ECANCELED::Errno
68
- @runqueue << [f, c[:result]]
69
- else
70
- @runqueue << [f, c[:result]]
71
- end
72
- end
73
- fiber_wait(id)
74
- end
75
-
76
- def cancel_fiber_op(f)
77
- op_id = f.__op_id
78
- if op_id
79
- ring.prep_cancel(op_id)
80
- end
81
- end
82
-
83
- def move_on_after(interval)
84
- f = Fiber.current
85
- cancel_id = ring.prep_timeout(interval: interval) do |c|
86
- if c[:result] != Errno::ECANCELED::Errno
87
- cancel_fiber_op(f)
88
- end
89
- end
90
- v = yield
91
- ring.prep_cancel(cancel_id)
92
- v
93
- end
94
- end
95
-
96
- s = Scheduler.new
97
-
98
- puts "Going to sleep..."
99
- s.sleep 3
100
- puts "Woke up"
101
-
102
- s.move_on_after(1) do
103
- puts "Going to sleep (move on after 1 second)"
104
- s.sleep 3
105
- end