polyphony 0.45.5 → 0.46.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 +2 -0
- data/.gitmodules +0 -0
- data/CHANGELOG.md +4 -0
- data/Gemfile.lock +1 -1
- data/README.md +3 -3
- data/Rakefile +1 -1
- data/TODO.md +4 -4
- data/examples/performance/thread-vs-fiber/polyphony_server.rb +1 -2
- data/ext/liburing/liburing.h +585 -0
- data/ext/liburing/liburing/README.md +4 -0
- data/ext/liburing/liburing/barrier.h +73 -0
- data/ext/liburing/liburing/compat.h +15 -0
- data/ext/liburing/liburing/io_uring.h +343 -0
- data/ext/liburing/queue.c +333 -0
- data/ext/liburing/register.c +187 -0
- data/ext/liburing/setup.c +210 -0
- data/ext/liburing/syscall.c +54 -0
- data/ext/liburing/syscall.h +18 -0
- data/ext/polyphony/backend.h +0 -14
- data/ext/polyphony/backend_common.h +109 -0
- data/ext/polyphony/backend_io_uring.c +884 -0
- data/ext/polyphony/backend_io_uring_context.c +73 -0
- data/ext/polyphony/backend_io_uring_context.h +52 -0
- data/ext/polyphony/{libev_backend.c → backend_libev.c} +202 -294
- data/ext/polyphony/event.c +1 -1
- data/ext/polyphony/extconf.rb +31 -13
- data/ext/polyphony/fiber.c +29 -22
- data/ext/polyphony/libev.c +4 -0
- data/ext/polyphony/libev.h +8 -2
- data/ext/polyphony/liburing.c +8 -0
- data/ext/polyphony/playground.c +51 -0
- data/ext/polyphony/polyphony.c +5 -5
- data/ext/polyphony/polyphony.h +16 -12
- data/ext/polyphony/polyphony_ext.c +10 -4
- data/ext/polyphony/queue.c +1 -1
- data/ext/polyphony/thread.c +11 -9
- data/lib/polyphony/adapters/trace.rb +2 -2
- data/lib/polyphony/core/global_api.rb +1 -4
- data/lib/polyphony/extensions/debug.rb +13 -0
- data/lib/polyphony/extensions/fiber.rb +2 -2
- data/lib/polyphony/extensions/socket.rb +59 -10
- data/lib/polyphony/version.rb +1 -1
- data/test/helper.rb +36 -4
- data/test/io_uring_test.rb +55 -0
- data/test/stress.rb +5 -2
- data/test/test_backend.rb +4 -6
- data/test/test_ext.rb +1 -2
- data/test/test_fiber.rb +22 -16
- data/test/test_global_api.rb +33 -35
- data/test/test_throttler.rb +3 -6
- data/test/test_trace.rb +7 -5
- metadata +22 -3
data/test/test_global_api.rb
CHANGED
@@ -72,28 +72,32 @@ class ExceptionTest < MiniTest::Test
|
|
72
72
|
rescue Exception => e
|
73
73
|
frames << 3
|
74
74
|
raise e
|
75
|
-
end
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
75
|
+
end
|
76
|
+
begin
|
77
|
+
5.times { snooze }
|
78
|
+
rescue Exception => e
|
79
|
+
error = e
|
80
|
+
ensure
|
81
|
+
assert_kind_of RuntimeError, error
|
82
|
+
assert_equal [2, 3], frames
|
83
|
+
end
|
82
84
|
end
|
83
85
|
|
84
86
|
def test_cross_fiber_backtrace_with_dead_calling_fiber
|
85
87
|
error = nil
|
86
|
-
|
88
|
+
begin
|
87
89
|
spin do
|
88
90
|
spin do
|
89
|
-
|
91
|
+
spin do
|
92
|
+
raise 'foo'
|
93
|
+
end.await
|
90
94
|
end.await
|
91
95
|
end.await
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
96
|
+
rescue Exception => e
|
97
|
+
error = e
|
98
|
+
ensure
|
99
|
+
assert_kind_of RuntimeError, error
|
100
|
+
end
|
97
101
|
end
|
98
102
|
end
|
99
103
|
|
@@ -133,8 +137,7 @@ class MoveOnAfterTest < MiniTest::Test
|
|
133
137
|
t1 = Time.now
|
134
138
|
|
135
139
|
assert_nil v
|
136
|
-
|
137
|
-
assert t1 - t0 < 0.02
|
140
|
+
assert_in_range 0.014..0.02, t1 - t0
|
138
141
|
end
|
139
142
|
|
140
143
|
def test_move_on_after_without_block
|
@@ -185,8 +188,7 @@ class CancelAfterTest < MiniTest::Test
|
|
185
188
|
sleep 0.007
|
186
189
|
end
|
187
190
|
t1 = Time.now
|
188
|
-
|
189
|
-
assert t1 - t0 < 0.02
|
191
|
+
assert_in_range 0.014..0.02, t1 - t0
|
190
192
|
end
|
191
193
|
|
192
194
|
class CustomException < Exception
|
@@ -255,12 +257,10 @@ class SpinLoopTest < MiniTest::Test
|
|
255
257
|
buffer = []
|
256
258
|
counter = 0
|
257
259
|
t0 = Time.now
|
258
|
-
f = spin_loop(rate:
|
259
|
-
sleep 0.
|
260
|
+
f = spin_loop(rate: 100) { buffer << (counter += 1) }
|
261
|
+
sleep 0.02
|
260
262
|
f.stop
|
261
|
-
|
262
|
-
expected = (elapsed * 10).to_i
|
263
|
-
assert counter >= expected - 1 && counter <= expected + 1
|
263
|
+
assert_in_range 1..3, counter
|
264
264
|
end
|
265
265
|
end
|
266
266
|
|
@@ -270,22 +270,22 @@ class ThrottledLoopTest < MiniTest::Test
|
|
270
270
|
counter = 0
|
271
271
|
t0 = Time.now
|
272
272
|
f = spin do
|
273
|
-
throttled_loop(
|
273
|
+
throttled_loop(100) { buffer << (counter += 1) }
|
274
274
|
end
|
275
|
-
sleep 0.
|
276
|
-
|
277
|
-
elapsed = Time.now - t0
|
278
|
-
expected = (elapsed * 10).to_i
|
279
|
-
assert counter >= expected - 1 && counter <= expected + 1
|
275
|
+
sleep 0.03
|
276
|
+
assert_in_range 2..4, counter
|
280
277
|
end
|
281
278
|
|
282
279
|
def test_throttled_loop_with_count
|
283
280
|
buffer = []
|
284
281
|
counter = 0
|
282
|
+
t0 = Time.now
|
285
283
|
f = spin do
|
286
284
|
throttled_loop(50, count: 5) { buffer << (counter += 1) }
|
287
285
|
end
|
288
286
|
f.await
|
287
|
+
t1 = Time.now
|
288
|
+
assert_in_range 0.075..0.15, t1 - t0
|
289
289
|
assert_equal [1, 2, 3, 4, 5], buffer
|
290
290
|
end
|
291
291
|
end
|
@@ -304,13 +304,11 @@ class GlobalAPIEtcTest < MiniTest::Test
|
|
304
304
|
buffer = []
|
305
305
|
t0 = Time.now
|
306
306
|
f = spin do
|
307
|
-
every(0.
|
307
|
+
every(0.01) { buffer << 1 }
|
308
308
|
end
|
309
|
-
sleep 0.
|
309
|
+
sleep 0.05
|
310
310
|
f.stop
|
311
|
-
|
312
|
-
expected = (elapsed / 0.1).to_i
|
313
|
-
assert buffer.size >= expected - 2 && buffer.size <= expected + 2
|
311
|
+
assert_in_range 4..6, buffer.size
|
314
312
|
end
|
315
313
|
|
316
314
|
def test_sleep
|
@@ -378,4 +376,4 @@ class GlobalAPIEtcTest < MiniTest::Test
|
|
378
376
|
|
379
377
|
assert_equal [0, 1, 2], values
|
380
378
|
end
|
381
|
-
end
|
379
|
+
end
|
data/test/test_throttler.rb
CHANGED
@@ -10,9 +10,7 @@ class ThrottlerTest < MiniTest::Test
|
|
10
10
|
f = spin { loop { t.process { buffer << 1 } } }
|
11
11
|
sleep 0.2
|
12
12
|
f.stop
|
13
|
-
|
14
|
-
expected = (elapsed * 10).to_i
|
15
|
-
assert buffer.size >= expected - 1 && buffer.size <= expected + 1
|
13
|
+
assert_in_range 1..3, buffer.size
|
16
14
|
ensure
|
17
15
|
t.stop
|
18
16
|
end
|
@@ -25,7 +23,7 @@ class ThrottlerTest < MiniTest::Test
|
|
25
23
|
end
|
26
24
|
sleep 0.25
|
27
25
|
f.stop
|
28
|
-
|
26
|
+
assert_in_range 2..6, buffer.size
|
29
27
|
ensure
|
30
28
|
t.stop
|
31
29
|
end
|
@@ -36,8 +34,7 @@ class ThrottlerTest < MiniTest::Test
|
|
36
34
|
f = spin { loop { t.process { buffer << 1 } } }
|
37
35
|
sleep 0.02
|
38
36
|
f.stop
|
39
|
-
|
40
|
-
assert buffer.size <= 3
|
37
|
+
assert_in_range 2..3, buffer.size
|
41
38
|
ensure
|
42
39
|
t.stop
|
43
40
|
end
|
data/test/test_trace.rb
CHANGED
@@ -35,7 +35,9 @@ class TraceTest < MiniTest::Test
|
|
35
35
|
def test_2_fiber_trace
|
36
36
|
records = []
|
37
37
|
thread = Thread.current
|
38
|
-
t = Polyphony::Trace.new(:fiber_all)
|
38
|
+
t = Polyphony::Trace.new(:fiber_all) do |r|
|
39
|
+
records << r if Thread.current == thread && r[:event] =~ /^fiber_/
|
40
|
+
end
|
39
41
|
t.enable
|
40
42
|
Polyphony.trace(true)
|
41
43
|
|
@@ -50,15 +52,15 @@ class TraceTest < MiniTest::Test
|
|
50
52
|
[:current, :fiber_switchpoint],
|
51
53
|
[:f, :fiber_run],
|
52
54
|
[:f, :fiber_switchpoint],
|
53
|
-
[:f, :
|
55
|
+
[:f, :fiber_event_poll_enter],
|
54
56
|
[:f, :fiber_schedule],
|
55
|
-
[:f, :
|
57
|
+
[:f, :fiber_event_poll_leave],
|
56
58
|
[:f, :fiber_run],
|
57
59
|
[:f, :fiber_terminate],
|
58
60
|
[:current, :fiber_switchpoint],
|
59
|
-
[:current, :
|
61
|
+
[:current, :fiber_event_poll_enter],
|
60
62
|
[:current, :fiber_schedule],
|
61
|
-
[:current, :
|
63
|
+
[:current, :fiber_event_poll_leave],
|
62
64
|
[:current, :fiber_run]
|
63
65
|
], events
|
64
66
|
ensure
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: polyphony
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.46.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sharon Rosner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-10-
|
11
|
+
date: 2020-10-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake-compiler
|
@@ -278,6 +278,7 @@ extra_rdoc_files:
|
|
278
278
|
files:
|
279
279
|
- ".github/workflows/test.yml"
|
280
280
|
- ".gitignore"
|
281
|
+
- ".gitmodules"
|
281
282
|
- ".rubocop.yml"
|
282
283
|
- ".vscode/launch.json"
|
283
284
|
- CHANGELOG.md
|
@@ -415,13 +416,29 @@ files:
|
|
415
416
|
- ext/libev/ev_win32.c
|
416
417
|
- ext/libev/ev_wrap.h
|
417
418
|
- ext/libev/test_libev_win32.c
|
419
|
+
- ext/liburing/liburing.h
|
420
|
+
- ext/liburing/liburing/README.md
|
421
|
+
- ext/liburing/liburing/barrier.h
|
422
|
+
- ext/liburing/liburing/compat.h
|
423
|
+
- ext/liburing/liburing/io_uring.h
|
424
|
+
- ext/liburing/queue.c
|
425
|
+
- ext/liburing/register.c
|
426
|
+
- ext/liburing/setup.c
|
427
|
+
- ext/liburing/syscall.c
|
428
|
+
- ext/liburing/syscall.h
|
418
429
|
- ext/polyphony/backend.h
|
430
|
+
- ext/polyphony/backend_common.h
|
431
|
+
- ext/polyphony/backend_io_uring.c
|
432
|
+
- ext/polyphony/backend_io_uring_context.c
|
433
|
+
- ext/polyphony/backend_io_uring_context.h
|
434
|
+
- ext/polyphony/backend_libev.c
|
419
435
|
- ext/polyphony/event.c
|
420
436
|
- ext/polyphony/extconf.rb
|
421
437
|
- ext/polyphony/fiber.c
|
422
438
|
- ext/polyphony/libev.c
|
423
439
|
- ext/polyphony/libev.h
|
424
|
-
- ext/polyphony/
|
440
|
+
- ext/polyphony/liburing.c
|
441
|
+
- ext/polyphony/playground.c
|
425
442
|
- ext/polyphony/polyphony.c
|
426
443
|
- ext/polyphony/polyphony.h
|
427
444
|
- ext/polyphony/polyphony_ext.c
|
@@ -451,6 +468,7 @@ files:
|
|
451
468
|
- lib/polyphony/core/thread_pool.rb
|
452
469
|
- lib/polyphony/core/throttler.rb
|
453
470
|
- lib/polyphony/extensions/core.rb
|
471
|
+
- lib/polyphony/extensions/debug.rb
|
454
472
|
- lib/polyphony/extensions/fiber.rb
|
455
473
|
- lib/polyphony/extensions/io.rb
|
456
474
|
- lib/polyphony/extensions/openssl.rb
|
@@ -462,6 +480,7 @@ files:
|
|
462
480
|
- test/coverage.rb
|
463
481
|
- test/eg.rb
|
464
482
|
- test/helper.rb
|
483
|
+
- test/io_uring_test.rb
|
465
484
|
- test/q.rb
|
466
485
|
- test/run.rb
|
467
486
|
- test/stress.rb
|