polyphony 0.68 → 0.72
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/FUNDING.yml +1 -0
- data/CHANGELOG.md +32 -5
- data/Gemfile.lock +2 -2
- data/TODO.md +1 -24
- data/bin/pdbg +1 -1
- data/bin/polyphony-debug +0 -0
- data/bin/stress.rb +0 -0
- data/bin/test +0 -0
- data/docs/_user-guide/all-about-timers.md +1 -1
- data/docs/api-reference/fiber.md +2 -2
- data/docs/faq.md +1 -1
- data/docs/getting-started/overview.md +8 -8
- data/docs/getting-started/tutorial.md +3 -3
- data/docs/main-concepts/concurrency.md +1 -1
- data/docs/main-concepts/extending.md +3 -3
- data/docs/main-concepts/fiber-scheduling.md +1 -1
- data/examples/core/calc.rb +37 -0
- data/examples/core/calc_with_restart.rb +40 -0
- data/examples/core/calc_with_supervise.rb +37 -0
- data/examples/core/message_based_supervision.rb +1 -1
- data/examples/io/rack_server.rb +1 -1
- data/examples/io/tunnel.rb +1 -1
- data/examples/performance/fiber_transfer.rb +1 -1
- data/examples/performance/line_splitting.rb +1 -1
- data/examples/performance/thread-vs-fiber/compare.rb +1 -1
- data/ext/polyphony/backend_common.c +24 -6
- data/ext/polyphony/backend_common.h +1 -0
- data/ext/polyphony/backend_io_uring.c +27 -40
- data/ext/polyphony/backend_io_uring_context.c +1 -1
- data/ext/polyphony/backend_io_uring_context.h +1 -1
- data/ext/polyphony/backend_libev.c +13 -11
- data/ext/polyphony/extconf.rb +24 -13
- data/ext/polyphony/queue.c +2 -2
- data/ext/polyphony/runqueue_ring_buffer.c +3 -2
- data/lib/polyphony/adapters/irb.rb +11 -1
- data/lib/polyphony/core/global_api.rb +3 -3
- data/lib/polyphony/core/timer.rb +2 -2
- data/lib/polyphony/debugger.rb +3 -3
- data/lib/polyphony/extensions/fiber.rb +30 -15
- data/lib/polyphony/extensions/io.rb +3 -3
- data/lib/polyphony/extensions/openssl.rb +21 -6
- data/lib/polyphony/extensions/socket.rb +4 -5
- data/lib/polyphony/net.rb +0 -1
- data/lib/polyphony/version.rb +1 -1
- data/polyphony.gemspec +1 -1
- data/test/coverage.rb +2 -2
- data/test/stress.rb +1 -1
- data/test/test_backend.rb +12 -12
- data/test/test_event.rb +1 -1
- data/test/test_ext.rb +1 -1
- data/test/test_fiber.rb +52 -12
- data/test/test_global_api.rb +2 -3
- data/test/test_io.rb +3 -3
- data/test/test_process_supervision.rb +38 -9
- data/test/test_queue.rb +6 -6
- data/test/test_socket.rb +12 -10
- data/test/test_supervise.rb +249 -81
- data/test/test_sync.rb +2 -2
- data/test/test_thread.rb +22 -2
- data/test/test_thread_pool.rb +1 -1
- data/test/test_throttler.rb +1 -1
- data/test/test_timer.rb +2 -2
- data/test/test_trace.rb +1 -1
- metadata +7 -3
@@ -76,7 +76,7 @@ end
|
|
76
76
|
|
77
77
|
# IO instance method patches
|
78
78
|
class ::IO
|
79
|
-
def
|
79
|
+
def __parser_read_method__
|
80
80
|
:backend_read
|
81
81
|
end
|
82
82
|
|
@@ -103,7 +103,7 @@ class ::IO
|
|
103
103
|
alias_method :orig_getc, :getc
|
104
104
|
def getc
|
105
105
|
return @read_buffer.slice!(0) if @read_buffer && !@read_buffer.empty?
|
106
|
-
|
106
|
+
|
107
107
|
@read_buffer ||= +''
|
108
108
|
Polyphony.backend_read(self, @read_buffer, 8192, false, -1)
|
109
109
|
return @read_buffer.slice!(0) if !@read_buffer.empty?
|
@@ -116,7 +116,7 @@ class ::IO
|
|
116
116
|
if buf
|
117
117
|
return Polyphony.backend_read(self, buf, len, true, buf_pos)
|
118
118
|
end
|
119
|
-
|
119
|
+
|
120
120
|
@read_buffer ||= +''
|
121
121
|
result = Polyphony.backend_read(self, @read_buffer, len, true, -1)
|
122
122
|
return nil unless result
|
@@ -5,7 +5,7 @@ require_relative './socket'
|
|
5
5
|
|
6
6
|
# OpenSSL socket helper methods (to make it compatible with Socket API) and overrides
|
7
7
|
class ::OpenSSL::SSL::SSLSocket
|
8
|
-
def
|
8
|
+
def __parser_read_method__
|
9
9
|
:readpartial
|
10
10
|
end
|
11
11
|
|
@@ -130,24 +130,32 @@ class ::OpenSSL::SSL::SSLServer
|
|
130
130
|
end
|
131
131
|
end
|
132
132
|
|
133
|
+
# STDOUT.puts 'SSLServer#accept'
|
133
134
|
sock, = @svr.accept
|
135
|
+
# STDOUT.puts "- raw sock: #{sock.inspect}"
|
134
136
|
begin
|
135
137
|
ssl = OpenSSL::SSL::SSLSocket.new(sock, @ctx)
|
138
|
+
# STDOUT.puts "- ssl sock: #{ssl.inspect}"
|
136
139
|
ssl.sync_close = true
|
137
140
|
if @use_accept_worker
|
141
|
+
# STDOUT.puts "- send to accept worker"
|
138
142
|
@accept_worker_fiber << [ssl, Fiber.current]
|
139
|
-
|
143
|
+
# STDOUT.puts "- wait for accept worker"
|
144
|
+
r = receive
|
145
|
+
# STDOUT.puts "- got reply from accept worker: #{r.inspect}"
|
146
|
+
r.invoke if r.is_a?(Exception)
|
140
147
|
else
|
141
148
|
ssl.accept
|
142
149
|
end
|
143
150
|
ssl
|
144
|
-
rescue Exception =>
|
151
|
+
rescue Exception => e
|
152
|
+
# STDOUT.puts "- accept exception: #{e.inspect}"
|
145
153
|
if ssl
|
146
154
|
ssl.close
|
147
155
|
else
|
148
156
|
sock.close
|
149
157
|
end
|
150
|
-
raise
|
158
|
+
raise e
|
151
159
|
end
|
152
160
|
end
|
153
161
|
|
@@ -156,11 +164,18 @@ class ::OpenSSL::SSL::SSLServer
|
|
156
164
|
@accept_worker_thread = Thread.new do
|
157
165
|
fiber << Fiber.current
|
158
166
|
loop do
|
167
|
+
# STDOUT.puts "- accept_worker wait for work"
|
159
168
|
socket, peer = receive
|
169
|
+
# STDOUT.puts "- accept_worker got socket from peer #{peer.inspect}"
|
160
170
|
socket.accept
|
171
|
+
# STDOUT.puts "- accept_worker accept returned"
|
161
172
|
peer << socket
|
162
|
-
|
163
|
-
|
173
|
+
# STDOUT.puts "- accept_worker sent socket back to peer"
|
174
|
+
rescue Polyphony::BaseException
|
175
|
+
raise
|
176
|
+
rescue Exception => e
|
177
|
+
# STDOUT.puts "- accept_worker error: #{e}"
|
178
|
+
peer << e if peer
|
164
179
|
end
|
165
180
|
end
|
166
181
|
@accept_worker_fiber = receive
|
@@ -6,7 +6,7 @@ require_relative './io'
|
|
6
6
|
require_relative '../core/thread_pool'
|
7
7
|
|
8
8
|
class BasicSocket
|
9
|
-
def
|
9
|
+
def __parser_read_method__
|
10
10
|
:backend_recv
|
11
11
|
end
|
12
12
|
end
|
@@ -32,7 +32,7 @@ class ::Socket
|
|
32
32
|
def read(maxlen = nil, buf = nil, buf_pos = 0)
|
33
33
|
return Polyphony.backend_recv(self, buf, maxlen, buf_pos) if buf
|
34
34
|
return Polyphony.backend_recv(self, buf || +'', maxlen, 0) if maxlen
|
35
|
-
|
35
|
+
|
36
36
|
buf = +''
|
37
37
|
len = buf.bytesize
|
38
38
|
while true
|
@@ -168,7 +168,7 @@ class ::TCPSocket
|
|
168
168
|
def read(maxlen = nil, buf = nil, buf_pos = 0)
|
169
169
|
return Polyphony.backend_recv(self, buf, maxlen, buf_pos) if buf
|
170
170
|
return Polyphony.backend_recv(self, buf || +'', maxlen, 0) if maxlen
|
171
|
-
|
171
|
+
|
172
172
|
buf = +''
|
173
173
|
len = buf.bytesize
|
174
174
|
while true
|
@@ -232,7 +232,6 @@ class ::TCPServer
|
|
232
232
|
alias_method :orig_accept, :accept
|
233
233
|
def accept
|
234
234
|
Polyphony.backend_accept(@io, TCPSocket)
|
235
|
-
# @io.accept
|
236
235
|
end
|
237
236
|
|
238
237
|
def accept_loop(&block)
|
@@ -261,7 +260,7 @@ class ::UNIXSocket
|
|
261
260
|
def read(maxlen = nil, buf = nil, buf_pos = 0)
|
262
261
|
return Polyphony.backend_recv(self, buf, maxlen, buf_pos) if buf
|
263
262
|
return Polyphony.backend_recv(self, buf || +'', maxlen, 0) if maxlen
|
264
|
-
|
263
|
+
|
265
264
|
buf = +''
|
266
265
|
len = buf.bytesize
|
267
266
|
while true
|
data/lib/polyphony/net.rb
CHANGED
data/lib/polyphony/version.rb
CHANGED
data/polyphony.gemspec
CHANGED
@@ -27,7 +27,7 @@ Gem::Specification.new do |s|
|
|
27
27
|
s.add_development_dependency 'simplecov', '0.17.1'
|
28
28
|
s.add_development_dependency 'rubocop', '0.85.1'
|
29
29
|
s.add_development_dependency 'pry', '0.13.1'
|
30
|
-
|
30
|
+
|
31
31
|
s.add_development_dependency 'msgpack', '1.4.2'
|
32
32
|
s.add_development_dependency 'httparty', '0.17.1'
|
33
33
|
s.add_development_dependency 'localhost', '~>1.1.4'
|
data/test/coverage.rb
CHANGED
@@ -24,10 +24,10 @@ module Coverage
|
|
24
24
|
@result = {}
|
25
25
|
trace = TracePoint.new(:line) do |tp|
|
26
26
|
next if tp.path =~ /\(/
|
27
|
-
|
27
|
+
|
28
28
|
absolute = File.expand_path(tp.path)
|
29
29
|
next unless LIB_FILES.include?(absolute)# =~ /^#{LIB_DIR}/
|
30
|
-
|
30
|
+
|
31
31
|
@result[absolute] ||= relevant_lines_for_filename(absolute)
|
32
32
|
@result[absolute][tp.lineno - 1] = 1
|
33
33
|
end
|
data/test/stress.rb
CHANGED
data/test/test_backend.rb
CHANGED
@@ -36,7 +36,7 @@ class BackendTest < MiniTest::Test
|
|
36
36
|
f = spin { @backend.read(i, buf, 5, false, 0) }
|
37
37
|
@backend.write(o, 'Hello world')
|
38
38
|
return_value = f.await
|
39
|
-
|
39
|
+
|
40
40
|
assert_equal 'Hello', buf
|
41
41
|
assert_equal return_value, buf
|
42
42
|
end
|
@@ -51,7 +51,7 @@ class BackendTest < MiniTest::Test
|
|
51
51
|
snooze
|
52
52
|
o.close
|
53
53
|
return_value = f.await
|
54
|
-
|
54
|
+
|
55
55
|
assert_equal 'Hello', buf
|
56
56
|
assert_equal return_value, buf
|
57
57
|
end
|
@@ -66,7 +66,7 @@ class BackendTest < MiniTest::Test
|
|
66
66
|
snooze
|
67
67
|
o.close
|
68
68
|
return_value = f.await
|
69
|
-
|
69
|
+
|
70
70
|
assert_equal 'Hello world', buf
|
71
71
|
assert_equal return_value, buf
|
72
72
|
end
|
@@ -77,7 +77,7 @@ class BackendTest < MiniTest::Test
|
|
77
77
|
f = spin { @backend.read(i, buf, 20, false, 0) }
|
78
78
|
@backend.write(o, 'blah')
|
79
79
|
return_value = f.await
|
80
|
-
|
80
|
+
|
81
81
|
assert_equal 'blah', buf
|
82
82
|
assert_equal return_value, buf
|
83
83
|
|
@@ -85,7 +85,7 @@ class BackendTest < MiniTest::Test
|
|
85
85
|
f = spin { @backend.read(i, buf, 20, false, -1) }
|
86
86
|
@backend.write(o, 'klmn')
|
87
87
|
return_value = f.await
|
88
|
-
|
88
|
+
|
89
89
|
assert_equal 'abcdefghijklmn', buf
|
90
90
|
assert_equal return_value, buf
|
91
91
|
|
@@ -93,7 +93,7 @@ class BackendTest < MiniTest::Test
|
|
93
93
|
f = spin { @backend.read(i, buf, 20, false, 3) }
|
94
94
|
@backend.write(o, 'DEF')
|
95
95
|
return_value = f.await
|
96
|
-
|
96
|
+
|
97
97
|
assert_equal 'abcDEF', buf
|
98
98
|
assert_equal return_value, buf
|
99
99
|
end
|
@@ -109,12 +109,12 @@ class BackendTest < MiniTest::Test
|
|
109
109
|
|
110
110
|
o << data
|
111
111
|
o.close
|
112
|
-
|
112
|
+
|
113
113
|
buf = +''
|
114
114
|
|
115
115
|
@backend.read(i, buf, 4096, false, -1)
|
116
116
|
assert_equal 4096, buf.bytesize
|
117
|
-
|
117
|
+
|
118
118
|
@backend.read(i, buf, 1, false, -1)
|
119
119
|
assert_equal 4097, buf.bytesize
|
120
120
|
|
@@ -129,7 +129,7 @@ class BackendTest < MiniTest::Test
|
|
129
129
|
@backend.post_fork
|
130
130
|
exit(42)
|
131
131
|
end
|
132
|
-
|
132
|
+
|
133
133
|
result = @backend.waitpid(pid)
|
134
134
|
assert_equal [pid, 42], result
|
135
135
|
end
|
@@ -427,7 +427,7 @@ class BackendTest < MiniTest::Test
|
|
427
427
|
counter = 0
|
428
428
|
|
429
429
|
@backend.idle_proc = proc { counter += 1 }
|
430
|
-
|
430
|
+
|
431
431
|
3.times { snooze }
|
432
432
|
assert_equal 0, counter
|
433
433
|
|
@@ -488,7 +488,7 @@ class BackendChainTest < MiniTest::Test
|
|
488
488
|
|
489
489
|
snooze
|
490
490
|
client = TCPSocket.new('127.0.0.1', port)
|
491
|
-
|
491
|
+
|
492
492
|
result = Thread.backend.chain(
|
493
493
|
[:send, client, 'hello', 0],
|
494
494
|
[:send, client, " world\n", 0]
|
@@ -512,7 +512,7 @@ class BackendChainTest < MiniTest::Test
|
|
512
512
|
while true
|
513
513
|
len = o.splice(from, 8192)
|
514
514
|
break if len == 0
|
515
|
-
|
515
|
+
|
516
516
|
backend.chain(
|
517
517
|
[:write, to, chunk_header(len)],
|
518
518
|
[:splice, i, to, len]
|
data/test/test_event.rb
CHANGED
data/test/test_ext.rb
CHANGED
data/test/test_fiber.rb
CHANGED
@@ -47,7 +47,7 @@ class FiberTest < MiniTest::Test
|
|
47
47
|
f1 = spin { :foo }
|
48
48
|
f2 = spin { :bar }
|
49
49
|
4.times { snooze }
|
50
|
-
|
50
|
+
|
51
51
|
assert_equal [:foo, :bar], Fiber.await(f1, f2)
|
52
52
|
end
|
53
53
|
|
@@ -67,8 +67,6 @@ class FiberTest < MiniTest::Test
|
|
67
67
|
}
|
68
68
|
Fiber.await(f2, f3)
|
69
69
|
assert_equal [:foo, :bar, :baz], buffer
|
70
|
-
assert_equal [f1], Fiber.current.children
|
71
|
-
Fiber.current.reap_dead_children
|
72
70
|
assert_equal [], Fiber.current.children
|
73
71
|
end
|
74
72
|
|
@@ -93,8 +91,6 @@ class FiberTest < MiniTest::Test
|
|
93
91
|
f1.stop
|
94
92
|
|
95
93
|
snooze
|
96
|
-
assert_equal [f1, f2, f3], Fiber.current.children
|
97
|
-
Fiber.current.reap_dead_children
|
98
94
|
assert_equal [], Fiber.current.children
|
99
95
|
end
|
100
96
|
|
@@ -602,7 +598,6 @@ class FiberTest < MiniTest::Test
|
|
602
598
|
|
603
599
|
f.stop
|
604
600
|
snooze
|
605
|
-
Fiber.current.reap_dead_children
|
606
601
|
assert_equal [], Fiber.current.children
|
607
602
|
end
|
608
603
|
|
@@ -744,7 +739,7 @@ class FiberTest < MiniTest::Test
|
|
744
739
|
def test_setup_raw
|
745
740
|
buffer = []
|
746
741
|
f = Fiber.new { buffer << receive }
|
747
|
-
|
742
|
+
|
748
743
|
assert_nil f.thread
|
749
744
|
snooze
|
750
745
|
f.setup_raw
|
@@ -776,10 +771,11 @@ class FiberTest < MiniTest::Test
|
|
776
771
|
|
777
772
|
snooze
|
778
773
|
assert_equal parent, child.parent
|
779
|
-
child.detach
|
774
|
+
result = child.detach
|
775
|
+
assert_equal result, child
|
780
776
|
assert_equal Fiber.current, child.parent
|
781
777
|
parent.await
|
782
|
-
|
778
|
+
|
783
779
|
child << :bye
|
784
780
|
child.await
|
785
781
|
|
@@ -812,7 +808,7 @@ class FiberTest < MiniTest::Test
|
|
812
808
|
child.attach_to(new_parent)
|
813
809
|
assert_equal new_parent, child.parent
|
814
810
|
parent.await
|
815
|
-
|
811
|
+
|
816
812
|
child << :bye
|
817
813
|
new_parent << :bye_new_parent
|
818
814
|
snooze
|
@@ -825,6 +821,29 @@ class FiberTest < MiniTest::Test
|
|
825
821
|
:bye_new_parent
|
826
822
|
], buf
|
827
823
|
end
|
824
|
+
|
825
|
+
def test_attach_all_children_to
|
826
|
+
children = []
|
827
|
+
f1 = spin do
|
828
|
+
3.times {
|
829
|
+
children << spin { receive }
|
830
|
+
}
|
831
|
+
Fiber.current.parent << :ok
|
832
|
+
receive
|
833
|
+
end
|
834
|
+
|
835
|
+
result = receive
|
836
|
+
assert_equal :ok, result
|
837
|
+
assert_equal 3, children.size
|
838
|
+
|
839
|
+
f2 = spin { supervise }
|
840
|
+
f1.attach_all_children_to(f2)
|
841
|
+
|
842
|
+
snooze
|
843
|
+
|
844
|
+
assert_equal [], f1.children
|
845
|
+
assert_equal children, f2.children
|
846
|
+
end
|
828
847
|
end
|
829
848
|
|
830
849
|
class MailboxTest < MiniTest::Test
|
@@ -954,6 +973,27 @@ class MailboxTest < MiniTest::Test
|
|
954
973
|
assert_equal ['foo'] * 100, messages
|
955
974
|
end
|
956
975
|
|
976
|
+
def test_receive_exception
|
977
|
+
e = RuntimeError.new 'foo'
|
978
|
+
spin { Fiber.current.parent << e }
|
979
|
+
r = receive
|
980
|
+
assert_equal e, r
|
981
|
+
|
982
|
+
spin { Fiber.current.parent.schedule e }
|
983
|
+
assert_raises(RuntimeError) { receive }
|
984
|
+
end
|
985
|
+
|
986
|
+
def test_receive_cross_thread_exception
|
987
|
+
e = RuntimeError.new 'foo'
|
988
|
+
f = Fiber.current
|
989
|
+
Thread.new { f << e }
|
990
|
+
r = receive
|
991
|
+
assert_equal e, r
|
992
|
+
|
993
|
+
Thread.new { f.schedule e }
|
994
|
+
assert_raises(RuntimeError) { receive }
|
995
|
+
end
|
996
|
+
|
957
997
|
def test_receive_all_pending
|
958
998
|
assert_equal [], receive_all_pending
|
959
999
|
|
@@ -1110,7 +1150,7 @@ class RestartTest < MiniTest::Test
|
|
1110
1150
|
assert_equal [1], buffer
|
1111
1151
|
snooze
|
1112
1152
|
assert_equal [1, 1], buffer
|
1113
|
-
|
1153
|
+
|
1114
1154
|
f << 'foo'
|
1115
1155
|
sleep 0.1
|
1116
1156
|
assert_equal [1, 1, 2], buffer
|
@@ -1236,7 +1276,7 @@ class DebugTest < MiniTest::Test
|
|
1236
1276
|
assert_equal true, f.__parked__?
|
1237
1277
|
10.times { snooze }
|
1238
1278
|
assert_equal [], buf
|
1239
|
-
|
1279
|
+
|
1240
1280
|
f.__unpark__
|
1241
1281
|
assert_nil f.__parked__?
|
1242
1282
|
10.times { snooze }
|
data/test/test_global_api.rb
CHANGED
@@ -280,7 +280,7 @@ class SpinLoopTest < MiniTest::Test
|
|
280
280
|
def test_spin_loop_location
|
281
281
|
location = /^#{__FILE__}:#{__LINE__ + 1}/
|
282
282
|
f = spin_loop { snooze }
|
283
|
-
|
283
|
+
|
284
284
|
assert_match location, f.location
|
285
285
|
end
|
286
286
|
|
@@ -375,7 +375,6 @@ class SpinScopeTest < MiniTest::Test
|
|
375
375
|
buffer << e.message
|
376
376
|
end
|
377
377
|
10.times { snooze }
|
378
|
-
Fiber.current.reap_dead_children
|
379
378
|
assert_equal 0, Fiber.current.children.size
|
380
379
|
assert_equal ['foobar'], buffer
|
381
380
|
end
|
@@ -403,7 +402,7 @@ class ThrottledLoopTest < MiniTest::Test
|
|
403
402
|
f.await
|
404
403
|
t1 = Time.now
|
405
404
|
assert_in_range 0.075..0.15, t1 - t0 if IS_LINUX
|
406
|
-
assert_equal [1, 2, 3, 4, 5], buffer
|
405
|
+
assert_equal [1, 2, 3, 4, 5], buffer
|
407
406
|
end
|
408
407
|
end
|
409
408
|
|
data/test/test_io.rb
CHANGED
@@ -107,10 +107,10 @@ class IOTest < MiniTest::Test
|
|
107
107
|
sleep 0.01
|
108
108
|
o << 'hi'
|
109
109
|
}
|
110
|
-
assert_equal 'hi', i.readpartial(2)
|
110
|
+
assert_equal 'hi', i.readpartial(2)
|
111
111
|
o.close
|
112
112
|
|
113
|
-
assert_raises(EOFError) { i.readpartial(1) }
|
113
|
+
assert_raises(EOFError) { i.readpartial(1) }
|
114
114
|
end
|
115
115
|
|
116
116
|
def test_gets
|
@@ -132,7 +132,7 @@ class IOTest < MiniTest::Test
|
|
132
132
|
f << Fiber.current
|
133
133
|
sleep 0.05
|
134
134
|
assert_equal [], buf
|
135
|
-
|
135
|
+
|
136
136
|
o << "ulous\n"
|
137
137
|
receive
|
138
138
|
assert_equal ["fabulous\n"], buf
|
@@ -6,7 +6,7 @@ class ProcessSupervisionTest < MiniTest::Test
|
|
6
6
|
def test_process_supervisor_with_block
|
7
7
|
i, o = IO.pipe
|
8
8
|
|
9
|
-
|
9
|
+
watcher = spin do
|
10
10
|
Polyphony.watch_process do
|
11
11
|
i.close
|
12
12
|
sleep 5
|
@@ -14,31 +14,60 @@ class ProcessSupervisionTest < MiniTest::Test
|
|
14
14
|
o << 'foo'
|
15
15
|
o.close
|
16
16
|
end
|
17
|
-
supervise(on_error: :restart)
|
18
17
|
end
|
19
18
|
|
19
|
+
supervisor = spin { supervise(watcher, restart: :always) }
|
20
|
+
|
20
21
|
sleep 0.05
|
21
|
-
|
22
|
-
|
22
|
+
supervisor.terminate
|
23
|
+
supervisor.await
|
23
24
|
|
24
25
|
o.close
|
25
26
|
msg = i.read
|
26
|
-
i.close
|
27
27
|
assert_equal 'foo', msg
|
28
28
|
end
|
29
29
|
|
30
|
+
def test_process_supervisor_restart_with_block
|
31
|
+
i1, o1 = IO.pipe
|
32
|
+
i2, o2 = IO.pipe
|
33
|
+
|
34
|
+
count = 0
|
35
|
+
watcher = spin do
|
36
|
+
count += 1
|
37
|
+
Polyphony.watch_process do
|
38
|
+
i1.gets
|
39
|
+
o2.puts count
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
supervisor = spin { supervise(watcher, restart: :always) }
|
44
|
+
|
45
|
+
o1.puts
|
46
|
+
l = i2.gets
|
47
|
+
assert_equal "1\n", l
|
48
|
+
|
49
|
+
o1.puts
|
50
|
+
l = i2.gets
|
51
|
+
assert_equal "2\n", l
|
52
|
+
|
53
|
+
o1.puts
|
54
|
+
l = i2.gets
|
55
|
+
assert_equal "3\n", l
|
56
|
+
end
|
57
|
+
|
30
58
|
def test_process_supervisor_with_cmd
|
31
59
|
fn = '/tmp/test_process_supervisor_with_cmd'
|
32
60
|
FileUtils.rm(fn) rescue nil
|
33
61
|
|
34
|
-
|
62
|
+
watcher = spin do
|
35
63
|
Polyphony.watch_process("echo foo >> #{fn}")
|
36
|
-
supervise(on_error: :restart)
|
37
64
|
end
|
38
65
|
|
66
|
+
supervisor = spin { supervise(watcher) }
|
67
|
+
|
39
68
|
sleep 0.05
|
40
|
-
|
41
|
-
|
69
|
+
supervisor.terminate
|
70
|
+
supervisor.await
|
42
71
|
|
43
72
|
assert_equal "foo\n", IO.read(fn)
|
44
73
|
|
data/test/test_queue.rb
CHANGED
@@ -70,7 +70,7 @@ class QueueTest < MiniTest::Test
|
|
70
70
|
|
71
71
|
def test_empty?
|
72
72
|
assert @queue.empty?
|
73
|
-
|
73
|
+
|
74
74
|
@queue << :foo
|
75
75
|
assert !@queue.empty?
|
76
76
|
|
@@ -82,7 +82,7 @@ class QueueTest < MiniTest::Test
|
|
82
82
|
f1 = spin { @queue.shift }
|
83
83
|
f2 = spin { @queue.shift }
|
84
84
|
f3 = spin { @queue.shift }
|
85
|
-
|
85
|
+
|
86
86
|
# let fibers run
|
87
87
|
snooze
|
88
88
|
|
@@ -99,7 +99,7 @@ class QueueTest < MiniTest::Test
|
|
99
99
|
|
100
100
|
def test_fiber_removal_from_queue_simple
|
101
101
|
f1 = spin { @queue.shift }
|
102
|
-
|
102
|
+
|
103
103
|
# let fibers run
|
104
104
|
snooze
|
105
105
|
|
@@ -114,11 +114,11 @@ class QueueTest < MiniTest::Test
|
|
114
114
|
assert_equal 0, @queue.size
|
115
115
|
|
116
116
|
@queue.push 1
|
117
|
-
|
117
|
+
|
118
118
|
assert_equal 1, @queue.size
|
119
119
|
|
120
120
|
@queue.push 2
|
121
|
-
|
121
|
+
|
122
122
|
assert_equal 2, @queue.size
|
123
123
|
|
124
124
|
@queue.shift
|
@@ -231,7 +231,7 @@ class CappedQueueTest < MiniTest::Test
|
|
231
231
|
i = 0
|
232
232
|
spin_loop do
|
233
233
|
i += 1
|
234
|
-
snooze
|
234
|
+
snooze
|
235
235
|
end
|
236
236
|
|
237
237
|
5.times { snooze }
|
data/test/test_socket.rb
CHANGED
@@ -9,9 +9,16 @@ class SocketTest < MiniTest::Test
|
|
9
9
|
super
|
10
10
|
end
|
11
11
|
|
12
|
-
def
|
13
|
-
port = rand(
|
12
|
+
def start_tcp_server_on_random_port
|
13
|
+
port = rand(1100..60000)
|
14
14
|
server = TCPServer.new('127.0.0.1', port)
|
15
|
+
[port, server]
|
16
|
+
rescue Errno::EADDRINUSE
|
17
|
+
retry
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_tcp
|
21
|
+
port, server = start_tcp_server_on_random_port
|
15
22
|
server_fiber = spin do
|
16
23
|
while (socket = server.accept)
|
17
24
|
spin do
|
@@ -34,8 +41,7 @@ class SocketTest < MiniTest::Test
|
|
34
41
|
end
|
35
42
|
|
36
43
|
def test_read
|
37
|
-
port =
|
38
|
-
server = TCPServer.new('127.0.0.1', port)
|
44
|
+
port, server = start_tcp_server_on_random_port
|
39
45
|
server_fiber = spin do
|
40
46
|
while (socket = server.accept)
|
41
47
|
spin do
|
@@ -74,9 +80,7 @@ class SocketTest < MiniTest::Test
|
|
74
80
|
|
75
81
|
# sending multiple strings at once
|
76
82
|
def test_sendv
|
77
|
-
port =
|
78
|
-
server = TCPServer.new('127.0.0.1', port)
|
79
|
-
|
83
|
+
port, server = start_tcp_server_on_random_port
|
80
84
|
server_fiber = spin do
|
81
85
|
while (socket = server.accept)
|
82
86
|
spin do
|
@@ -100,9 +104,7 @@ class SocketTest < MiniTest::Test
|
|
100
104
|
|
101
105
|
|
102
106
|
def test_feed_loop
|
103
|
-
port =
|
104
|
-
server = TCPServer.new('127.0.0.1', port)
|
105
|
-
|
107
|
+
port, server = start_tcp_server_on_random_port
|
106
108
|
server_fiber = spin do
|
107
109
|
reader = MessagePack::Unpacker.new
|
108
110
|
while (socket = server.accept)
|