uringmachine 0.23.1 → 0.24.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/.github/workflows/test.yml +1 -1
- data/CHANGELOG.md +8 -0
- data/Gemfile +1 -1
- data/TODO.md +52 -12
- data/benchmark/bm_io_pipe.rb +43 -1
- data/benchmark/bm_io_socketpair.rb +32 -2
- data/benchmark/bm_mutex_io.rb +47 -5
- data/benchmark/chart_bm_io_pipe_x.png +0 -0
- data/benchmark/common.rb +161 -17
- data/benchmark/http_parse.rb +9 -9
- data/benchmark/http_server_accept_queue.rb +104 -0
- data/benchmark/http_server_multi_accept.rb +93 -0
- data/benchmark/http_server_multi_ractor.rb +99 -0
- data/benchmark/http_server_single_thread.rb +80 -0
- data/benchmark/ips_io_pipe.rb +146 -0
- data/docs/design/buffer_pool.md +183 -0
- data/docs/um_api.md +91 -0
- data/examples/fiber_scheduler_file_io.rb +34 -0
- data/examples/fiber_scheduler_file_io_async.rb +33 -0
- data/ext/um/um.c +65 -48
- data/ext/um/um.h +11 -1
- data/ext/um/um_class.c +54 -11
- data/ext/um/um_sidecar.c +106 -0
- data/ext/um/um_stream.c +31 -0
- data/ext/um/um_stream_class.c +14 -0
- data/grant-2025/interim-report.md +130 -0
- data/grant-2025/journal.md +166 -2
- data/grant-2025/tasks.md +27 -17
- data/lib/uringmachine/fiber_scheduler.rb +35 -27
- data/lib/uringmachine/version.rb +1 -1
- data/lib/uringmachine.rb +4 -6
- data/test/helper.rb +8 -3
- data/test/test_fiber.rb +16 -0
- data/test/test_fiber_scheduler.rb +184 -72
- data/test/test_stream.rb +16 -0
- data/test/test_um.rb +94 -24
- metadata +14 -2
|
@@ -18,6 +18,7 @@ class MethodCallAuditor
|
|
|
18
18
|
def respond_to?(sym, include_all = false) = @target.respond_to?(sym, include_all)
|
|
19
19
|
|
|
20
20
|
def method_missing(sym, *args, &block)
|
|
21
|
+
# UM.debug({sym:}.inspect)
|
|
21
22
|
res = @target.send(sym, *args, &block)
|
|
22
23
|
@calls << ({ sym:, args:, res:})
|
|
23
24
|
res
|
|
@@ -105,7 +106,7 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
105
106
|
io_read: 3,
|
|
106
107
|
io_close: 1,
|
|
107
108
|
join: 1
|
|
108
|
-
},
|
|
109
|
+
}, scheduler_calls_tally)
|
|
109
110
|
ensure
|
|
110
111
|
i.close rescue nil
|
|
111
112
|
o.close rescue nil
|
|
@@ -128,7 +129,7 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
128
129
|
fiber: 1,
|
|
129
130
|
io_read: 1,
|
|
130
131
|
join: 1
|
|
131
|
-
},
|
|
132
|
+
}, scheduler_calls_tally)
|
|
132
133
|
ensure
|
|
133
134
|
i.close rescue nil
|
|
134
135
|
o.close rescue nil
|
|
@@ -153,7 +154,7 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
153
154
|
fiber: 1,
|
|
154
155
|
io_write: 1,
|
|
155
156
|
join: 1
|
|
156
|
-
},
|
|
157
|
+
}, scheduler_calls_tally)
|
|
157
158
|
ensure
|
|
158
159
|
i.close rescue nil
|
|
159
160
|
o.close rescue nil
|
|
@@ -174,7 +175,7 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
174
175
|
assert_equal({
|
|
175
176
|
fiber: 1,
|
|
176
177
|
join: 1
|
|
177
|
-
},
|
|
178
|
+
}, scheduler_calls_tally)
|
|
178
179
|
ensure
|
|
179
180
|
i.close rescue nil
|
|
180
181
|
o.close rescue nil
|
|
@@ -201,7 +202,7 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
201
202
|
io_pread: 1,
|
|
202
203
|
io_close: 1,
|
|
203
204
|
join: 1
|
|
204
|
-
},
|
|
205
|
+
}, scheduler_calls_tally)
|
|
205
206
|
ensure
|
|
206
207
|
FileUtils.rm(fn) rescue nil
|
|
207
208
|
end
|
|
@@ -227,7 +228,7 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
227
228
|
io_pwrite: 1,
|
|
228
229
|
io_close: 1,
|
|
229
230
|
join: 1
|
|
230
|
-
},
|
|
231
|
+
}, scheduler_calls_tally)
|
|
231
232
|
ensure
|
|
232
233
|
FileUtils.rm(fn) rescue nil
|
|
233
234
|
end
|
|
@@ -250,7 +251,7 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
250
251
|
fiber: 2,
|
|
251
252
|
kernel_sleep: 2,
|
|
252
253
|
join: 1
|
|
253
|
-
},
|
|
254
|
+
}, scheduler_calls_tally)
|
|
254
255
|
end
|
|
255
256
|
|
|
256
257
|
def test_fiber_scheduler_block
|
|
@@ -275,7 +276,7 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
275
276
|
block: 1,
|
|
276
277
|
unblock: 1,
|
|
277
278
|
join: 1
|
|
278
|
-
},
|
|
279
|
+
}, scheduler_calls_tally)
|
|
279
280
|
end
|
|
280
281
|
|
|
281
282
|
def test_fiber_scheduler_process_wait
|
|
@@ -303,7 +304,7 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
303
304
|
fiber: 1,
|
|
304
305
|
process_wait: 1,
|
|
305
306
|
join: 1
|
|
306
|
-
},
|
|
307
|
+
}, scheduler_calls_tally)
|
|
307
308
|
ensure
|
|
308
309
|
if child_pid
|
|
309
310
|
Process.wait(child_pid) rescue nil
|
|
@@ -337,7 +338,7 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
337
338
|
fiber: 2,
|
|
338
339
|
io_wait: 1,
|
|
339
340
|
join: 1
|
|
340
|
-
},
|
|
341
|
+
}, scheduler_calls_tally)
|
|
341
342
|
ensure
|
|
342
343
|
s1.close rescue nil
|
|
343
344
|
s2.close rescue nil
|
|
@@ -362,11 +363,12 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
362
363
|
assert_equal({
|
|
363
364
|
fiber: 2,
|
|
364
365
|
blocking_operation_wait: 2,
|
|
366
|
+
io_write: 1,
|
|
365
367
|
io_read: 2,
|
|
366
368
|
io_close: 2,
|
|
367
369
|
kernel_sleep: 1,
|
|
368
370
|
join: 1
|
|
369
|
-
},
|
|
371
|
+
}, scheduler_calls_tally)
|
|
370
372
|
ensure
|
|
371
373
|
FileUtils.rm(fn) rescue nil
|
|
372
374
|
end
|
|
@@ -381,7 +383,7 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
381
383
|
buf = nil
|
|
382
384
|
Fiber.schedule do
|
|
383
385
|
sleep 0.001
|
|
384
|
-
File.open(fn, 'r') { buf = it.read
|
|
386
|
+
File.open(fn, 'r') { buf = it.read }
|
|
385
387
|
end
|
|
386
388
|
assert_equal 2, machine.metrics[:total_ops]
|
|
387
389
|
@scheduler.join
|
|
@@ -389,15 +391,74 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
389
391
|
assert_equal({
|
|
390
392
|
fiber: 2,
|
|
391
393
|
blocking_operation_wait: 2,
|
|
394
|
+
io_write: 1,
|
|
392
395
|
io_read: 2,
|
|
393
396
|
io_close: 2,
|
|
394
397
|
kernel_sleep: 1,
|
|
395
398
|
join: 1
|
|
396
|
-
},
|
|
399
|
+
}, scheduler_calls_tally)
|
|
397
400
|
ensure
|
|
398
401
|
FileUtils.rm(fn) rescue nil
|
|
399
402
|
end
|
|
400
403
|
|
|
404
|
+
def test_fiber_scheduler_file_write_buffered
|
|
405
|
+
fn = "/tmp/um_#{SecureRandom.hex}"
|
|
406
|
+
Fiber.schedule do
|
|
407
|
+
File.open(fn, 'w') {
|
|
408
|
+
it << 'foo'
|
|
409
|
+
}
|
|
410
|
+
end
|
|
411
|
+
@scheduler.join
|
|
412
|
+
assert_equal 'foo', IO.read(fn)
|
|
413
|
+
assert_equal({
|
|
414
|
+
fiber: 1,
|
|
415
|
+
blocking_operation_wait: 1,
|
|
416
|
+
io_write: 1,
|
|
417
|
+
io_close: 1,
|
|
418
|
+
join: 1
|
|
419
|
+
}, scheduler_calls_tally)
|
|
420
|
+
end
|
|
421
|
+
|
|
422
|
+
def test_fiber_scheduler_file_write_buffered_flush
|
|
423
|
+
fn = "/tmp/um_#{SecureRandom.hex}"
|
|
424
|
+
Fiber.schedule do
|
|
425
|
+
File.open(fn, 'w') {
|
|
426
|
+
it << 'foo'
|
|
427
|
+
it.flush
|
|
428
|
+
it << 'bar'
|
|
429
|
+
}
|
|
430
|
+
end
|
|
431
|
+
@scheduler.join
|
|
432
|
+
assert_equal 'foobar', IO.read(fn)
|
|
433
|
+
assert_equal({
|
|
434
|
+
fiber: 1,
|
|
435
|
+
blocking_operation_wait: 1,
|
|
436
|
+
io_write: 2,
|
|
437
|
+
io_close: 1,
|
|
438
|
+
join: 1
|
|
439
|
+
}, scheduler_calls_tally)
|
|
440
|
+
end
|
|
441
|
+
|
|
442
|
+
def test_fiber_scheduler_file_write_unbuffered
|
|
443
|
+
# fn = "/tmp/um_#{SecureRandom.hex}"
|
|
444
|
+
fn = '/dev/null'
|
|
445
|
+
Fiber.schedule do
|
|
446
|
+
File.open(fn, 'w') {
|
|
447
|
+
it.sync = true
|
|
448
|
+
it << 'foo'
|
|
449
|
+
}
|
|
450
|
+
end
|
|
451
|
+
@scheduler.join
|
|
452
|
+
# assert_equal 'foo', IO.read(fn)
|
|
453
|
+
assert_equal({
|
|
454
|
+
fiber: 1,
|
|
455
|
+
blocking_operation_wait: 1, # open
|
|
456
|
+
io_write: 1,
|
|
457
|
+
io_close: 1,
|
|
458
|
+
join: 1
|
|
459
|
+
}, scheduler_calls_tally)
|
|
460
|
+
end
|
|
461
|
+
|
|
401
462
|
def test_fiber_scheduler_mutex
|
|
402
463
|
mutex = Mutex.new
|
|
403
464
|
|
|
@@ -432,7 +493,7 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
432
493
|
block: 1,
|
|
433
494
|
unblock: 1,
|
|
434
495
|
join: 1
|
|
435
|
-
},
|
|
496
|
+
}, scheduler_calls_tally)
|
|
436
497
|
end
|
|
437
498
|
|
|
438
499
|
def test_fiber_scheduler_queue_shift
|
|
@@ -458,7 +519,7 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
458
519
|
block: 1,
|
|
459
520
|
unblock: 1,
|
|
460
521
|
join: 1
|
|
461
|
-
},
|
|
522
|
+
}, scheduler_calls_tally)
|
|
462
523
|
end
|
|
463
524
|
|
|
464
525
|
def test_fiber_scheduler_queue_shift_with_timeout
|
|
@@ -481,7 +542,7 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
481
542
|
fiber: 2,
|
|
482
543
|
block: 1,
|
|
483
544
|
join: 1
|
|
484
|
-
},
|
|
545
|
+
}, scheduler_calls_tally)
|
|
485
546
|
end
|
|
486
547
|
|
|
487
548
|
def test_fiber_scheduler_thread_join
|
|
@@ -502,7 +563,7 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
502
563
|
block: 1,
|
|
503
564
|
unblock: 1,
|
|
504
565
|
join: 1
|
|
505
|
-
},
|
|
566
|
+
}, scheduler_calls_tally)
|
|
506
567
|
end
|
|
507
568
|
|
|
508
569
|
def test_fiber_scheduler_system
|
|
@@ -519,7 +580,7 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
519
580
|
fiber: 1,
|
|
520
581
|
process_wait: 1,
|
|
521
582
|
join: 1
|
|
522
|
-
},
|
|
583
|
+
}, scheduler_calls_tally)
|
|
523
584
|
ensure
|
|
524
585
|
Process.wait(0, Process::WNOHANG) rescue nil
|
|
525
586
|
end
|
|
@@ -540,7 +601,7 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
540
601
|
io_read: 2,
|
|
541
602
|
process_wait: 1,
|
|
542
603
|
join: 1
|
|
543
|
-
},
|
|
604
|
+
}, scheduler_calls_tally)
|
|
544
605
|
ensure
|
|
545
606
|
Process.wait(0, Process::WNOHANG) rescue nil
|
|
546
607
|
end
|
|
@@ -569,7 +630,7 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
569
630
|
blocking_operation_wait: 1,
|
|
570
631
|
process_wait: 1,
|
|
571
632
|
join: 1
|
|
572
|
-
},
|
|
633
|
+
}, scheduler_calls_tally)
|
|
573
634
|
ensure
|
|
574
635
|
Process.wait(0, Process::WNOHANG) rescue nil
|
|
575
636
|
end
|
|
@@ -596,7 +657,7 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
596
657
|
io_read: 2,
|
|
597
658
|
fiber_interrupt: 1,
|
|
598
659
|
join: 1
|
|
599
|
-
},
|
|
660
|
+
}, scheduler_calls_tally)
|
|
600
661
|
ensure
|
|
601
662
|
r.close rescue nil
|
|
602
663
|
w.close rescue nil
|
|
@@ -620,7 +681,7 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
620
681
|
blocking_operation_wait: 1,
|
|
621
682
|
address_resolve: 1,
|
|
622
683
|
join: 1
|
|
623
|
-
},
|
|
684
|
+
}, scheduler_calls_tally)
|
|
624
685
|
end
|
|
625
686
|
|
|
626
687
|
def test_fiber_scheduler_timeout_after
|
|
@@ -641,7 +702,7 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
641
702
|
timeout_after: 1,
|
|
642
703
|
kernel_sleep: 1,
|
|
643
704
|
join: 1
|
|
644
|
-
},
|
|
705
|
+
}, scheduler_calls_tally)
|
|
645
706
|
end
|
|
646
707
|
|
|
647
708
|
def test_fiber_scheduler_io_select
|
|
@@ -654,7 +715,7 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
654
715
|
end
|
|
655
716
|
@machine.snooze
|
|
656
717
|
w << 'foo'
|
|
657
|
-
@machine.snooze
|
|
718
|
+
2.times { @machine.snooze }
|
|
658
719
|
assert_equal [[[r], [], []]], buf
|
|
659
720
|
@machine.snooze
|
|
660
721
|
@scheduler.join
|
|
@@ -718,7 +779,7 @@ class FiberSchedulerIOClassMethodsTest < UMBaseTest
|
|
|
718
779
|
blocking_operation_wait: 1,
|
|
719
780
|
io_close: 1,
|
|
720
781
|
join: 1
|
|
721
|
-
},
|
|
782
|
+
}, scheduler_calls_tally)
|
|
722
783
|
end
|
|
723
784
|
|
|
724
785
|
def test_IO_s_binwrite
|
|
@@ -732,9 +793,10 @@ class FiberSchedulerIOClassMethodsTest < UMBaseTest
|
|
|
732
793
|
assert_equal({
|
|
733
794
|
fiber: 1,
|
|
734
795
|
blocking_operation_wait: 1,
|
|
796
|
+
io_write: 1,
|
|
735
797
|
io_close: 1,
|
|
736
798
|
join: 1
|
|
737
|
-
},
|
|
799
|
+
}, scheduler_calls_tally)
|
|
738
800
|
end
|
|
739
801
|
|
|
740
802
|
def test_IO_s_copy_stream
|
|
@@ -751,7 +813,7 @@ class FiberSchedulerIOClassMethodsTest < UMBaseTest
|
|
|
751
813
|
blocking_operation_wait: 3,
|
|
752
814
|
io_close: 2,
|
|
753
815
|
join: 1
|
|
754
|
-
},
|
|
816
|
+
}, scheduler_calls_tally)
|
|
755
817
|
ensure
|
|
756
818
|
FileUtils.rm(fn2) rescue nil
|
|
757
819
|
end
|
|
@@ -769,7 +831,7 @@ class FiberSchedulerIOClassMethodsTest < UMBaseTest
|
|
|
769
831
|
blocking_operation_wait: 1,
|
|
770
832
|
io_close: 1,
|
|
771
833
|
join: 1
|
|
772
|
-
},
|
|
834
|
+
}, scheduler_calls_tally)
|
|
773
835
|
end
|
|
774
836
|
|
|
775
837
|
def test_IO_s_popen
|
|
@@ -784,7 +846,7 @@ class FiberSchedulerIOClassMethodsTest < UMBaseTest
|
|
|
784
846
|
io_read: 2,
|
|
785
847
|
io_close: 1,
|
|
786
848
|
join: 1
|
|
787
|
-
},
|
|
849
|
+
}, scheduler_calls_tally)
|
|
788
850
|
end
|
|
789
851
|
|
|
790
852
|
def test_IO_s_read
|
|
@@ -800,7 +862,7 @@ class FiberSchedulerIOClassMethodsTest < UMBaseTest
|
|
|
800
862
|
blocking_operation_wait: 1,
|
|
801
863
|
io_close: 1,
|
|
802
864
|
join: 1
|
|
803
|
-
},
|
|
865
|
+
}, scheduler_calls_tally)
|
|
804
866
|
end
|
|
805
867
|
|
|
806
868
|
def test_IO_s_readlines
|
|
@@ -816,7 +878,7 @@ class FiberSchedulerIOClassMethodsTest < UMBaseTest
|
|
|
816
878
|
blocking_operation_wait: 1,
|
|
817
879
|
io_close: 1,
|
|
818
880
|
join: 1
|
|
819
|
-
},
|
|
881
|
+
}, scheduler_calls_tally)
|
|
820
882
|
end
|
|
821
883
|
|
|
822
884
|
def test_IO_s_select
|
|
@@ -831,7 +893,7 @@ class FiberSchedulerIOClassMethodsTest < UMBaseTest
|
|
|
831
893
|
fiber: 1,
|
|
832
894
|
io_select: 1,
|
|
833
895
|
join: 1
|
|
834
|
-
},
|
|
896
|
+
}, scheduler_calls_tally)
|
|
835
897
|
ensure
|
|
836
898
|
io.close rescue nil
|
|
837
899
|
end
|
|
@@ -847,9 +909,10 @@ class FiberSchedulerIOClassMethodsTest < UMBaseTest
|
|
|
847
909
|
assert_equal({
|
|
848
910
|
fiber: 1,
|
|
849
911
|
blocking_operation_wait: 1,
|
|
912
|
+
io_write: 1,
|
|
850
913
|
io_close: 1,
|
|
851
914
|
join: 1
|
|
852
|
-
},
|
|
915
|
+
}, scheduler_calls_tally)
|
|
853
916
|
end
|
|
854
917
|
end
|
|
855
918
|
|
|
@@ -883,7 +946,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
|
|
|
883
946
|
fiber: 1,
|
|
884
947
|
io_write: 1,
|
|
885
948
|
join: 1
|
|
886
|
-
},
|
|
949
|
+
}, scheduler_calls_tally)
|
|
887
950
|
end
|
|
888
951
|
|
|
889
952
|
def test_IO_i_close
|
|
@@ -897,7 +960,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
|
|
|
897
960
|
fiber: 1,
|
|
898
961
|
io_close: 1,
|
|
899
962
|
join: 1
|
|
900
|
-
},
|
|
963
|
+
}, scheduler_calls_tally)
|
|
901
964
|
end
|
|
902
965
|
|
|
903
966
|
def test_IO_i_close_read
|
|
@@ -910,7 +973,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
|
|
|
910
973
|
assert_equal({
|
|
911
974
|
fiber: 1,
|
|
912
975
|
join: 1
|
|
913
|
-
},
|
|
976
|
+
}, scheduler_calls_tally)
|
|
914
977
|
end
|
|
915
978
|
|
|
916
979
|
def test_IO_i_close_write
|
|
@@ -923,7 +986,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
|
|
|
923
986
|
assert_equal({
|
|
924
987
|
fiber: 1,
|
|
925
988
|
join: 1
|
|
926
|
-
},
|
|
989
|
+
}, scheduler_calls_tally)
|
|
927
990
|
end
|
|
928
991
|
|
|
929
992
|
def test_IO_i_each_byte
|
|
@@ -937,7 +1000,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
|
|
|
937
1000
|
fiber: 1,
|
|
938
1001
|
io_read: 2,
|
|
939
1002
|
join: 1
|
|
940
|
-
},
|
|
1003
|
+
}, scheduler_calls_tally)
|
|
941
1004
|
end
|
|
942
1005
|
|
|
943
1006
|
def test_IO_i_each_char
|
|
@@ -951,7 +1014,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
|
|
|
951
1014
|
fiber: 1,
|
|
952
1015
|
io_read: 2,
|
|
953
1016
|
join: 1
|
|
954
|
-
},
|
|
1017
|
+
}, scheduler_calls_tally)
|
|
955
1018
|
end
|
|
956
1019
|
|
|
957
1020
|
def test_IO_i_each_line
|
|
@@ -965,7 +1028,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
|
|
|
965
1028
|
fiber: 1,
|
|
966
1029
|
io_read: 3,
|
|
967
1030
|
join: 1
|
|
968
|
-
},
|
|
1031
|
+
}, scheduler_calls_tally)
|
|
969
1032
|
end
|
|
970
1033
|
|
|
971
1034
|
def test_IO_i_getbyte
|
|
@@ -979,7 +1042,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
|
|
|
979
1042
|
fiber: 1,
|
|
980
1043
|
io_read: 1,
|
|
981
1044
|
join: 1
|
|
982
|
-
},
|
|
1045
|
+
}, scheduler_calls_tally)
|
|
983
1046
|
end
|
|
984
1047
|
|
|
985
1048
|
def test_IO_i_getc
|
|
@@ -993,7 +1056,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
|
|
|
993
1056
|
fiber: 1,
|
|
994
1057
|
io_read: 1,
|
|
995
1058
|
join: 1
|
|
996
|
-
},
|
|
1059
|
+
}, scheduler_calls_tally)
|
|
997
1060
|
end
|
|
998
1061
|
|
|
999
1062
|
def test_IO_i_gets
|
|
@@ -1007,7 +1070,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
|
|
|
1007
1070
|
fiber: 1,
|
|
1008
1071
|
io_read: 2,
|
|
1009
1072
|
join: 1
|
|
1010
|
-
},
|
|
1073
|
+
}, scheduler_calls_tally)
|
|
1011
1074
|
end
|
|
1012
1075
|
|
|
1013
1076
|
def test_IO_i_pread
|
|
@@ -1021,7 +1084,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
|
|
|
1021
1084
|
fiber: 1,
|
|
1022
1085
|
io_pread: 1,
|
|
1023
1086
|
join: 1
|
|
1024
|
-
},
|
|
1087
|
+
}, scheduler_calls_tally)
|
|
1025
1088
|
end
|
|
1026
1089
|
|
|
1027
1090
|
def test_IO_i_print
|
|
@@ -1036,7 +1099,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
|
|
|
1036
1099
|
fiber: 1,
|
|
1037
1100
|
io_write: 3,
|
|
1038
1101
|
join: 1
|
|
1039
|
-
},
|
|
1102
|
+
}, scheduler_calls_tally)
|
|
1040
1103
|
end
|
|
1041
1104
|
|
|
1042
1105
|
def test_IO_i_printf
|
|
@@ -1051,7 +1114,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
|
|
|
1051
1114
|
fiber: 1,
|
|
1052
1115
|
io_write: 1,
|
|
1053
1116
|
join: 1
|
|
1054
|
-
},
|
|
1117
|
+
}, scheduler_calls_tally)
|
|
1055
1118
|
end
|
|
1056
1119
|
|
|
1057
1120
|
def test_IO_i_putc
|
|
@@ -1066,7 +1129,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
|
|
|
1066
1129
|
fiber: 1,
|
|
1067
1130
|
io_write: 1,
|
|
1068
1131
|
join: 1
|
|
1069
|
-
},
|
|
1132
|
+
}, scheduler_calls_tally)
|
|
1070
1133
|
end
|
|
1071
1134
|
|
|
1072
1135
|
def test_IO_i_puts
|
|
@@ -1081,7 +1144,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
|
|
|
1081
1144
|
fiber: 1,
|
|
1082
1145
|
io_write: 2,
|
|
1083
1146
|
join: 1
|
|
1084
|
-
},
|
|
1147
|
+
}, scheduler_calls_tally)
|
|
1085
1148
|
end
|
|
1086
1149
|
|
|
1087
1150
|
def test_IO_i_pwrite
|
|
@@ -1096,7 +1159,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
|
|
|
1096
1159
|
fiber: 1,
|
|
1097
1160
|
io_pwrite: 1,
|
|
1098
1161
|
join: 1
|
|
1099
|
-
},
|
|
1162
|
+
}, scheduler_calls_tally)
|
|
1100
1163
|
end
|
|
1101
1164
|
|
|
1102
1165
|
def test_IO_i_read
|
|
@@ -1110,7 +1173,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
|
|
|
1110
1173
|
fiber: 1,
|
|
1111
1174
|
io_read: 2,
|
|
1112
1175
|
join: 1
|
|
1113
|
-
},
|
|
1176
|
+
}, scheduler_calls_tally)
|
|
1114
1177
|
end
|
|
1115
1178
|
|
|
1116
1179
|
def test_IO_i_readbyte
|
|
@@ -1124,7 +1187,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
|
|
|
1124
1187
|
fiber: 1,
|
|
1125
1188
|
io_read: 1,
|
|
1126
1189
|
join: 1
|
|
1127
|
-
},
|
|
1190
|
+
}, scheduler_calls_tally)
|
|
1128
1191
|
end
|
|
1129
1192
|
|
|
1130
1193
|
def test_IO_i_readchar
|
|
@@ -1138,7 +1201,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
|
|
|
1138
1201
|
fiber: 1,
|
|
1139
1202
|
io_read: 1,
|
|
1140
1203
|
join: 1
|
|
1141
|
-
},
|
|
1204
|
+
}, scheduler_calls_tally)
|
|
1142
1205
|
end
|
|
1143
1206
|
|
|
1144
1207
|
def test_IO_i_readline
|
|
@@ -1152,7 +1215,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
|
|
|
1152
1215
|
fiber: 1,
|
|
1153
1216
|
io_read: 2,
|
|
1154
1217
|
join: 1
|
|
1155
|
-
},
|
|
1218
|
+
}, scheduler_calls_tally)
|
|
1156
1219
|
end
|
|
1157
1220
|
|
|
1158
1221
|
def test_IO_i_readlines
|
|
@@ -1166,7 +1229,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
|
|
|
1166
1229
|
fiber: 1,
|
|
1167
1230
|
io_read: 3,
|
|
1168
1231
|
join: 1
|
|
1169
|
-
},
|
|
1232
|
+
}, scheduler_calls_tally)
|
|
1170
1233
|
end
|
|
1171
1234
|
|
|
1172
1235
|
def test_IO_i_readpartial
|
|
@@ -1180,7 +1243,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
|
|
|
1180
1243
|
fiber: 1,
|
|
1181
1244
|
io_read: 1,
|
|
1182
1245
|
join: 1
|
|
1183
|
-
},
|
|
1246
|
+
}, scheduler_calls_tally)
|
|
1184
1247
|
end
|
|
1185
1248
|
|
|
1186
1249
|
def test_IO_i_sysread
|
|
@@ -1194,7 +1257,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
|
|
|
1194
1257
|
fiber: 1,
|
|
1195
1258
|
io_read: 1,
|
|
1196
1259
|
join: 1
|
|
1197
|
-
},
|
|
1260
|
+
}, scheduler_calls_tally)
|
|
1198
1261
|
end
|
|
1199
1262
|
|
|
1200
1263
|
def test_IO_i_syswrite
|
|
@@ -1209,7 +1272,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
|
|
|
1209
1272
|
fiber: 1,
|
|
1210
1273
|
io_write: 1,
|
|
1211
1274
|
join: 1
|
|
1212
|
-
},
|
|
1275
|
+
}, scheduler_calls_tally)
|
|
1213
1276
|
end
|
|
1214
1277
|
|
|
1215
1278
|
def test_IO_i_wait
|
|
@@ -1223,7 +1286,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
|
|
|
1223
1286
|
fiber: 1,
|
|
1224
1287
|
io_wait: 1,
|
|
1225
1288
|
join: 1
|
|
1226
|
-
},
|
|
1289
|
+
}, scheduler_calls_tally)
|
|
1227
1290
|
end
|
|
1228
1291
|
|
|
1229
1292
|
def test_IO_i_wait_pipe_read_timeout
|
|
@@ -1238,7 +1301,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
|
|
|
1238
1301
|
fiber: 1,
|
|
1239
1302
|
io_wait: 1,
|
|
1240
1303
|
join: 1
|
|
1241
|
-
},
|
|
1304
|
+
}, scheduler_calls_tally)
|
|
1242
1305
|
ensure
|
|
1243
1306
|
r.close rescue nil
|
|
1244
1307
|
w.close rescue nil
|
|
@@ -1255,7 +1318,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
|
|
|
1255
1318
|
fiber: 1,
|
|
1256
1319
|
io_wait: 1,
|
|
1257
1320
|
join: 1
|
|
1258
|
-
},
|
|
1321
|
+
}, scheduler_calls_tally)
|
|
1259
1322
|
end
|
|
1260
1323
|
|
|
1261
1324
|
def test_IO_i_wait_writable
|
|
@@ -1269,7 +1332,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
|
|
|
1269
1332
|
fiber: 1,
|
|
1270
1333
|
io_wait: 1,
|
|
1271
1334
|
join: 1
|
|
1272
|
-
},
|
|
1335
|
+
}, scheduler_calls_tally)
|
|
1273
1336
|
end
|
|
1274
1337
|
|
|
1275
1338
|
def test_IO_i_write
|
|
@@ -1284,7 +1347,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
|
|
|
1284
1347
|
fiber: 1,
|
|
1285
1348
|
io_write: 1,
|
|
1286
1349
|
join: 1
|
|
1287
|
-
},
|
|
1350
|
+
}, scheduler_calls_tally)
|
|
1288
1351
|
end
|
|
1289
1352
|
end
|
|
1290
1353
|
|
|
@@ -1317,14 +1380,12 @@ class FiberSchedulerQueueTest < UMBaseTest
|
|
|
1317
1380
|
end
|
|
1318
1381
|
}
|
|
1319
1382
|
@scheduler.join
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
join: 1
|
|
1327
|
-
}, @scheduler.calls.map { it[:sym] }.tally)
|
|
1383
|
+
|
|
1384
|
+
calls = scheduler_calls_tally
|
|
1385
|
+
assert_equal 10, calls[:fiber]
|
|
1386
|
+
assert_equal 25, calls[:kernel_sleep]
|
|
1387
|
+
assert_equal 25, calls[:yield]
|
|
1388
|
+
assert_equal 1, calls[:join]
|
|
1328
1389
|
end
|
|
1329
1390
|
end
|
|
1330
1391
|
|
|
@@ -1405,13 +1466,14 @@ class FiberSchedulerMultiPipeTest < UMBaseTest
|
|
|
1405
1466
|
io_write: 1000,
|
|
1406
1467
|
io_close: 10,
|
|
1407
1468
|
join: 1
|
|
1408
|
-
},
|
|
1469
|
+
}, scheduler_calls_tally)
|
|
1409
1470
|
ensure
|
|
1410
1471
|
ios.each { it.close rescue nil }
|
|
1411
1472
|
end
|
|
1412
1473
|
end
|
|
1413
1474
|
|
|
1414
1475
|
class FiberSchedulerMultiTCPTest < UMBaseTest
|
|
1476
|
+
|
|
1415
1477
|
C = 10
|
|
1416
1478
|
W = 10
|
|
1417
1479
|
I = 10
|
|
@@ -1497,7 +1559,7 @@ class FiberSchedulerMultiTCPTest < UMBaseTest
|
|
|
1497
1559
|
end
|
|
1498
1560
|
end
|
|
1499
1561
|
@machine.await_fibers(fibers)
|
|
1500
|
-
@calls =
|
|
1562
|
+
@calls = scheduler_calls_tally
|
|
1501
1563
|
ensure
|
|
1502
1564
|
# p ensure: ios
|
|
1503
1565
|
ios.each { it.close rescue nil }
|
|
@@ -1525,3 +1587,53 @@ class FiberSchedulerMultiTCPTest < UMBaseTest
|
|
|
1525
1587
|
}, @calls)
|
|
1526
1588
|
end
|
|
1527
1589
|
end
|
|
1590
|
+
|
|
1591
|
+
class FiberSchedulerErrorTest < UMBaseTest
|
|
1592
|
+
def setup
|
|
1593
|
+
super
|
|
1594
|
+
@raw_scheduler = UM::FiberScheduler.new(@machine)
|
|
1595
|
+
@scheduler = MethodCallAuditor.new(@raw_scheduler)
|
|
1596
|
+
Fiber.set_scheduler(@scheduler)
|
|
1597
|
+
end
|
|
1598
|
+
|
|
1599
|
+
def teardown
|
|
1600
|
+
Fiber.set_scheduler(nil)
|
|
1601
|
+
super
|
|
1602
|
+
end
|
|
1603
|
+
|
|
1604
|
+
def test_fiber_scheduler_io_read_error
|
|
1605
|
+
ret = nil
|
|
1606
|
+
Fiber.schedule do
|
|
1607
|
+
File.open(Dir.tmpdir, 'r') { it.read(42) }
|
|
1608
|
+
rescue => e
|
|
1609
|
+
ret = e
|
|
1610
|
+
end
|
|
1611
|
+
@scheduler.join
|
|
1612
|
+
assert_kind_of Errno::EISDIR, ret
|
|
1613
|
+
assert_equal({
|
|
1614
|
+
fiber: 1,
|
|
1615
|
+
io_read: 1,
|
|
1616
|
+
blocking_operation_wait: 3,
|
|
1617
|
+
io_close: 1,
|
|
1618
|
+
join: 1
|
|
1619
|
+
}, scheduler_calls_tally)
|
|
1620
|
+
end
|
|
1621
|
+
|
|
1622
|
+
def test_fiber_scheduler_io_write_error
|
|
1623
|
+
ret = nil
|
|
1624
|
+
r, w = IO.pipe
|
|
1625
|
+
r.close
|
|
1626
|
+
Fiber.schedule do
|
|
1627
|
+
w << 'foo'
|
|
1628
|
+
rescue => e
|
|
1629
|
+
ret = e
|
|
1630
|
+
end
|
|
1631
|
+
@scheduler.join
|
|
1632
|
+
assert_kind_of Errno::EPIPE, ret
|
|
1633
|
+
assert_equal({
|
|
1634
|
+
fiber: 1,
|
|
1635
|
+
io_write: 1,
|
|
1636
|
+
join: 1
|
|
1637
|
+
}, scheduler_calls_tally)
|
|
1638
|
+
end
|
|
1639
|
+
end
|