uringmachine 0.28.3 → 0.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -1
- data/TODO.md +29 -35
- data/benchmark/common.rb +6 -6
- data/benchmark/gets.rb +49 -0
- data/benchmark/{read_each.rb → output.rb} +27 -24
- data/docs/design/buffer_pool.md +35 -0
- data/docs/um_api.md +2 -0
- data/ext/um/extconf.rb +6 -5
- data/ext/um/um.c +42 -13
- data/ext/um/um.h +103 -31
- data/ext/um/um_buffer_pool.c +246 -0
- data/ext/um/um_class.c +24 -12
- data/ext/um/um_op.c +29 -13
- data/ext/um/um_ssl.c +24 -27
- data/ext/um/um_stream.c +380 -150
- data/ext/um/um_stream_class.c +119 -63
- data/ext/um/um_utils.c +6 -6
- data/grant-2025/tasks.md +12 -7
- data/lib/uringmachine/fiber_scheduler.rb +36 -10
- data/lib/uringmachine/version.rb +1 -1
- data/lib/uringmachine.rb +60 -19
- data/test/helper.rb +2 -0
- data/test/test_fiber.rb +93 -12
- data/test/test_fiber_scheduler.rb +5 -47
- data/test/test_stream.rb +447 -125
- data/test/test_um.rb +119 -49
- metadata +5 -4
- data/ext/um/um_buffer.c +0 -49
data/test/test_fiber.rb
CHANGED
|
@@ -109,6 +109,34 @@ class FiberJoinTest < UMBaseTest
|
|
|
109
109
|
assert_equal [:foo, :bar, :baz], res
|
|
110
110
|
end
|
|
111
111
|
|
|
112
|
+
def test_join_array
|
|
113
|
+
f1 = machine.spin do
|
|
114
|
+
:foo
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
f2 = machine.spin do
|
|
118
|
+
machine.sleep(0.001)
|
|
119
|
+
:bar
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
f3 = machine.spin do
|
|
123
|
+
:baz
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
res = machine.join([f1, f2, f3])
|
|
127
|
+
assert_equal [:foo, :bar, :baz], res
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def test_join_procs
|
|
131
|
+
res = machine.join(
|
|
132
|
+
->(_) { machine.snooze; :f1 },
|
|
133
|
+
->(_) { machine.sleep(0.01); :f2 },
|
|
134
|
+
->(_) { machine.sleep(0.02); :f3 }
|
|
135
|
+
)
|
|
136
|
+
assert_equal [:f1, :f2, :f3], res
|
|
137
|
+
assert machine.fiber_set.empty?
|
|
138
|
+
end
|
|
139
|
+
|
|
112
140
|
def test_join_cross_thread
|
|
113
141
|
q = UM::Queue.new
|
|
114
142
|
|
|
@@ -142,7 +170,7 @@ class FiberJoinTest < UMBaseTest
|
|
|
142
170
|
end
|
|
143
171
|
|
|
144
172
|
class WaitFibersTest < UMBaseTest
|
|
145
|
-
def
|
|
173
|
+
def test_await
|
|
146
174
|
q = UM::Queue.new
|
|
147
175
|
x = nil
|
|
148
176
|
|
|
@@ -163,19 +191,40 @@ class WaitFibersTest < UMBaseTest
|
|
|
163
191
|
machine.push q, 2
|
|
164
192
|
end
|
|
165
193
|
|
|
166
|
-
res = machine.
|
|
194
|
+
res = machine.await([f])
|
|
167
195
|
assert_equal 0, x
|
|
168
196
|
assert_equal 3, machine.shift(q)
|
|
169
197
|
assert_equal 1, res
|
|
170
198
|
|
|
171
199
|
done = nil
|
|
172
200
|
f = machine.spin { machine.snooze; done = true }
|
|
173
|
-
res = machine.
|
|
201
|
+
res = machine.await(f)
|
|
174
202
|
assert done
|
|
175
203
|
assert_equal 1, res
|
|
176
204
|
end
|
|
177
205
|
|
|
178
|
-
def
|
|
206
|
+
def test_await_multiple
|
|
207
|
+
f1 = machine.spin do
|
|
208
|
+
:foo
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
f2 = machine.spin do
|
|
212
|
+
machine.sleep(0.001)
|
|
213
|
+
:bar
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
f3 = machine.spin do
|
|
217
|
+
:baz
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
res = machine.await([f1, f2, f3])
|
|
221
|
+
assert_equal 3, res
|
|
222
|
+
assert_equal true, f1.done?
|
|
223
|
+
assert_equal true, f2.done?
|
|
224
|
+
assert_equal true, f3.done?
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
def test_await_multiple_splat
|
|
179
228
|
f1 = machine.spin do
|
|
180
229
|
:foo
|
|
181
230
|
end
|
|
@@ -189,11 +238,43 @@ class WaitFibersTest < UMBaseTest
|
|
|
189
238
|
:baz
|
|
190
239
|
end
|
|
191
240
|
|
|
192
|
-
res = machine.
|
|
241
|
+
res = machine.await(f1, f2, f3)
|
|
242
|
+
assert_equal 3, res
|
|
243
|
+
assert_equal true, f1.done?
|
|
244
|
+
assert_equal true, f2.done?
|
|
245
|
+
assert_equal true, f3.done?
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
def test_await_procs
|
|
249
|
+
buf = []
|
|
250
|
+
res = machine.await(
|
|
251
|
+
->(_) { machine.snooze; buf << :f1 },
|
|
252
|
+
->(_) { machine.sleep(0.01); buf << :f2 },
|
|
253
|
+
->(_) { machine.sleep(0.02); buf << :f3 }
|
|
254
|
+
)
|
|
255
|
+
assert_equal 3, res
|
|
256
|
+
assert_equal [:f1, :f2, :f3], buf
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
def test_await_mixed
|
|
260
|
+
buf = []
|
|
261
|
+
|
|
262
|
+
f1 = machine.spin do
|
|
263
|
+
machine.sleep(0.01)
|
|
264
|
+
buf << :f1
|
|
265
|
+
end
|
|
266
|
+
f2 = ->(_) { buf << :f2_in; machine.sleep(0.02); buf << :f2_out }
|
|
267
|
+
f3 = machine.spin do
|
|
268
|
+
machine.sleep(0.005)
|
|
269
|
+
buf << :f3
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
res = machine.await(f1, f2, f3)
|
|
193
273
|
assert_equal 3, res
|
|
274
|
+
assert_equal [:f2_in, :f3, :f1, :f2_out], buf
|
|
194
275
|
end
|
|
195
276
|
|
|
196
|
-
def
|
|
277
|
+
def test_await_cross_thread
|
|
197
278
|
q = UM::Queue.new
|
|
198
279
|
|
|
199
280
|
t2 = Thread.new do
|
|
@@ -203,32 +284,32 @@ class WaitFibersTest < UMBaseTest
|
|
|
203
284
|
m2.snooze
|
|
204
285
|
:foo
|
|
205
286
|
end
|
|
206
|
-
m2.
|
|
287
|
+
m2.await(f)
|
|
207
288
|
end
|
|
208
289
|
|
|
209
290
|
f = machine.shift(q)
|
|
210
291
|
assert_kind_of Fiber, f
|
|
211
|
-
res = machine.
|
|
292
|
+
res = machine.await(f)
|
|
212
293
|
assert_equal 1, res
|
|
213
294
|
ensure
|
|
214
295
|
t2.join
|
|
215
296
|
end
|
|
216
297
|
|
|
217
|
-
def
|
|
298
|
+
def test_await_with_exception
|
|
218
299
|
f = machine.spin do
|
|
219
300
|
raise "Foobar"
|
|
220
301
|
end
|
|
221
302
|
|
|
222
|
-
res = machine.
|
|
303
|
+
res = machine.await(f)
|
|
223
304
|
assert_equal 1, res
|
|
224
305
|
end
|
|
225
306
|
|
|
226
|
-
def
|
|
307
|
+
def test_await_terminate
|
|
227
308
|
f1 = machine.spin { machine.sleep(1) }
|
|
228
309
|
f2 = machine.spin { machine.sleep(1) }
|
|
229
310
|
done = false
|
|
230
311
|
a = machine.spin do
|
|
231
|
-
machine.
|
|
312
|
+
machine.await([f1, f2])
|
|
232
313
|
rescue UM::Terminate
|
|
233
314
|
done = true
|
|
234
315
|
end
|
|
@@ -235,7 +235,6 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
235
235
|
assert_equal 'oba', buf
|
|
236
236
|
assert_equal({
|
|
237
237
|
fiber: 1,
|
|
238
|
-
blocking_operation_wait: 1,
|
|
239
238
|
io_pread: 1,
|
|
240
239
|
io_close: 1,
|
|
241
240
|
join: 1
|
|
@@ -261,7 +260,6 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
261
260
|
assert_equal 'fobazr', IO.read(fn)
|
|
262
261
|
assert_equal({
|
|
263
262
|
fiber: 1,
|
|
264
|
-
blocking_operation_wait: 1,
|
|
265
263
|
io_pwrite: 1,
|
|
266
264
|
io_close: 1,
|
|
267
265
|
join: 1
|
|
@@ -402,7 +400,6 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
402
400
|
assert_equal 'foobar', buf
|
|
403
401
|
assert_equal({
|
|
404
402
|
fiber: 2,
|
|
405
|
-
blocking_operation_wait: 2,
|
|
406
403
|
io_write: 1,
|
|
407
404
|
io_read: 2,
|
|
408
405
|
io_close: 2,
|
|
@@ -425,12 +422,11 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
425
422
|
sleep 0.001
|
|
426
423
|
File.open(fn, 'r') { buf = it.read }
|
|
427
424
|
end
|
|
428
|
-
assert_equal 2, machine.metrics[:total_ops]
|
|
429
425
|
@scheduler.join
|
|
426
|
+
assert_equal 8, machine.metrics[:total_ops]
|
|
430
427
|
assert_equal 'foobar', buf
|
|
431
428
|
assert_equal({
|
|
432
429
|
fiber: 2,
|
|
433
|
-
blocking_operation_wait: 2,
|
|
434
430
|
io_write: 1,
|
|
435
431
|
io_read: 2,
|
|
436
432
|
io_close: 2,
|
|
@@ -452,7 +448,6 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
452
448
|
assert_equal 'foo', IO.read(fn)
|
|
453
449
|
assert_equal({
|
|
454
450
|
fiber: 1,
|
|
455
|
-
blocking_operation_wait: 1,
|
|
456
451
|
io_write: 1,
|
|
457
452
|
io_close: 1,
|
|
458
453
|
join: 1
|
|
@@ -472,7 +467,6 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
472
467
|
assert_equal 'foobar', IO.read(fn)
|
|
473
468
|
assert_equal({
|
|
474
469
|
fiber: 1,
|
|
475
|
-
blocking_operation_wait: 1,
|
|
476
470
|
io_write: 2,
|
|
477
471
|
io_close: 1,
|
|
478
472
|
join: 1
|
|
@@ -492,7 +486,6 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
492
486
|
# assert_equal 'foo', IO.read(fn)
|
|
493
487
|
assert_equal({
|
|
494
488
|
fiber: 1,
|
|
495
|
-
blocking_operation_wait: 1, # open
|
|
496
489
|
io_write: 1,
|
|
497
490
|
io_close: 1,
|
|
498
491
|
join: 1
|
|
@@ -667,7 +660,6 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
667
660
|
fiber: 1,
|
|
668
661
|
io_write: 2,
|
|
669
662
|
io_read: 1,
|
|
670
|
-
blocking_operation_wait: 1,
|
|
671
663
|
process_wait: 1,
|
|
672
664
|
join: 1
|
|
673
665
|
}, scheduler_calls_tally)
|
|
@@ -718,7 +710,6 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
718
710
|
fiber: 1,
|
|
719
711
|
io_read: 2,
|
|
720
712
|
io_close: 1,
|
|
721
|
-
blocking_operation_wait: 1,
|
|
722
713
|
address_resolve: 1,
|
|
723
714
|
join: 1
|
|
724
715
|
}, scheduler_calls_tally)
|
|
@@ -727,7 +718,7 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
727
718
|
def test_fiber_scheduler_timeout_after
|
|
728
719
|
res = nil
|
|
729
720
|
Fiber.schedule do
|
|
730
|
-
Timeout.timeout(0.
|
|
721
|
+
Timeout.timeout(0.1) do
|
|
731
722
|
sleep 1
|
|
732
723
|
end
|
|
733
724
|
res = true
|
|
@@ -764,30 +755,6 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
764
755
|
r.close rescue nil
|
|
765
756
|
w.close rescue nil
|
|
766
757
|
end
|
|
767
|
-
|
|
768
|
-
def test_fiber_scheduler_blocking_operation_wait_single_issuer
|
|
769
|
-
buf = []
|
|
770
|
-
(1..10).each { |i|
|
|
771
|
-
op = -> { i * 10}
|
|
772
|
-
buf << @scheduler.blocking_operation_wait(op)
|
|
773
|
-
sleep 0.01
|
|
774
|
-
@machine.snooze
|
|
775
|
-
}
|
|
776
|
-
assert_equal (1..10).map { it * 10 }, buf
|
|
777
|
-
|
|
778
|
-
buf = []
|
|
779
|
-
(1..20).each { |i|
|
|
780
|
-
op = -> { i * 10}
|
|
781
|
-
Fiber.schedule do
|
|
782
|
-
sleep 0.001
|
|
783
|
-
buf << @scheduler.blocking_operation_wait(op)
|
|
784
|
-
sleep 0.001
|
|
785
|
-
end
|
|
786
|
-
}
|
|
787
|
-
@scheduler.join
|
|
788
|
-
|
|
789
|
-
assert_equal (1..20).map { it * 10 }, buf.sort
|
|
790
|
-
end
|
|
791
758
|
end
|
|
792
759
|
|
|
793
760
|
class FiberSchedulerIOClassMethodsTest < UMBaseTest
|
|
@@ -816,7 +783,6 @@ class FiberSchedulerIOClassMethodsTest < UMBaseTest
|
|
|
816
783
|
assert_equal({
|
|
817
784
|
fiber: 1,
|
|
818
785
|
io_read: 2,
|
|
819
|
-
blocking_operation_wait: 1,
|
|
820
786
|
io_close: 1,
|
|
821
787
|
join: 1
|
|
822
788
|
}, scheduler_calls_tally)
|
|
@@ -832,7 +798,6 @@ class FiberSchedulerIOClassMethodsTest < UMBaseTest
|
|
|
832
798
|
assert_equal '==***', IO.read(@fn)
|
|
833
799
|
assert_equal({
|
|
834
800
|
fiber: 1,
|
|
835
|
-
blocking_operation_wait: 1,
|
|
836
801
|
io_write: 1,
|
|
837
802
|
io_close: 1,
|
|
838
803
|
join: 1
|
|
@@ -850,7 +815,6 @@ class FiberSchedulerIOClassMethodsTest < UMBaseTest
|
|
|
850
815
|
assert_equal '===', IO.read(fn2)
|
|
851
816
|
assert_equal({
|
|
852
817
|
fiber: 1,
|
|
853
|
-
blocking_operation_wait: 3,
|
|
854
818
|
io_close: 2,
|
|
855
819
|
join: 1
|
|
856
820
|
}, scheduler_calls_tally)
|
|
@@ -868,7 +832,6 @@ class FiberSchedulerIOClassMethodsTest < UMBaseTest
|
|
|
868
832
|
assert_equal({
|
|
869
833
|
fiber: 1,
|
|
870
834
|
io_read: 3,
|
|
871
|
-
blocking_operation_wait: 1,
|
|
872
835
|
io_close: 1,
|
|
873
836
|
join: 1
|
|
874
837
|
}, scheduler_calls_tally)
|
|
@@ -899,7 +862,6 @@ class FiberSchedulerIOClassMethodsTest < UMBaseTest
|
|
|
899
862
|
assert_equal({
|
|
900
863
|
fiber: 1,
|
|
901
864
|
io_read: 2,
|
|
902
|
-
blocking_operation_wait: 1,
|
|
903
865
|
io_close: 1,
|
|
904
866
|
join: 1
|
|
905
867
|
}, scheduler_calls_tally)
|
|
@@ -915,7 +877,6 @@ class FiberSchedulerIOClassMethodsTest < UMBaseTest
|
|
|
915
877
|
assert_equal({
|
|
916
878
|
fiber: 1,
|
|
917
879
|
io_read: 3,
|
|
918
|
-
blocking_operation_wait: 1,
|
|
919
880
|
io_close: 1,
|
|
920
881
|
join: 1
|
|
921
882
|
}, scheduler_calls_tally)
|
|
@@ -948,7 +909,6 @@ class FiberSchedulerIOClassMethodsTest < UMBaseTest
|
|
|
948
909
|
assert_equal '==***', IO.read(@fn)
|
|
949
910
|
assert_equal({
|
|
950
911
|
fiber: 1,
|
|
951
|
-
blocking_operation_wait: 1,
|
|
952
912
|
io_write: 1,
|
|
953
913
|
io_close: 1,
|
|
954
914
|
join: 1
|
|
@@ -1459,7 +1419,6 @@ class FiberSchedulerNetHTTPTest < UMBaseTest
|
|
|
1459
1419
|
assert_equal C, calls[:fiber]
|
|
1460
1420
|
assert_equal C, calls[:io_close]
|
|
1461
1421
|
assert_in_range (C * 2)..(C * 4), calls[:io_wait]
|
|
1462
|
-
assert_in_range (C * 7)..(C * 20), calls[:blocking_operation_wait]
|
|
1463
1422
|
end
|
|
1464
1423
|
end
|
|
1465
1424
|
|
|
@@ -1534,9 +1493,9 @@ class FiberSchedulerMultiTCPTest < UMBaseTest
|
|
|
1534
1493
|
W.times {
|
|
1535
1494
|
fibers << Fiber.schedule { run_client(port) }
|
|
1536
1495
|
}
|
|
1537
|
-
@machine.
|
|
1496
|
+
@machine.await(fibers)
|
|
1538
1497
|
server.close
|
|
1539
|
-
@machine.
|
|
1498
|
+
@machine.await(server_fiber)
|
|
1540
1499
|
rescue Exception => e
|
|
1541
1500
|
p test_run_server: e
|
|
1542
1501
|
p e.backtrace
|
|
@@ -1598,7 +1557,7 @@ class FiberSchedulerMultiTCPTest < UMBaseTest
|
|
|
1598
1557
|
run_server(port)
|
|
1599
1558
|
end
|
|
1600
1559
|
end
|
|
1601
|
-
@machine.
|
|
1560
|
+
@machine.await(fibers)
|
|
1602
1561
|
@calls = scheduler_calls_tally
|
|
1603
1562
|
ensure
|
|
1604
1563
|
# p ensure: ios
|
|
@@ -1653,7 +1612,6 @@ class FiberSchedulerErrorTest < UMBaseTest
|
|
|
1653
1612
|
assert_equal({
|
|
1654
1613
|
fiber: 1,
|
|
1655
1614
|
io_read: 1,
|
|
1656
|
-
blocking_operation_wait: 3,
|
|
1657
1615
|
io_close: 1,
|
|
1658
1616
|
join: 1
|
|
1659
1617
|
}, scheduler_calls_tally)
|