polyphony 0.72 → 0.75
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 +15 -11
- data/.github/workflows/test_io_uring.yml +32 -0
- data/.gitignore +3 -1
- data/CHANGELOG.md +24 -0
- data/Gemfile.lock +16 -13
- data/bin/pdbg +0 -0
- data/bin/polyphony-debug +0 -0
- data/bin/stress.rb +0 -0
- data/bin/test +0 -0
- data/docs/api-reference/exception.md +5 -1
- data/examples/core/ring.rb +29 -0
- data/ext/polyphony/backend_common.c +90 -12
- data/ext/polyphony/backend_common.h +9 -1
- data/ext/polyphony/backend_io_uring.c +257 -134
- data/ext/polyphony/backend_io_uring_context.c +1 -0
- data/ext/polyphony/backend_io_uring_context.h +2 -1
- data/ext/polyphony/backend_libev.c +33 -29
- data/ext/polyphony/event.c +5 -2
- data/ext/polyphony/extconf.rb +1 -0
- data/ext/polyphony/polyphony.c +11 -1
- data/ext/polyphony/polyphony.h +9 -2
- data/ext/polyphony/queue.c +10 -5
- data/ext/polyphony/runqueue_ring_buffer.c +3 -1
- data/ext/polyphony/socket_extensions.c +5 -2
- data/ext/polyphony/thread.c +1 -1
- data/lib/polyphony/{extensions → core}/debug.rb +0 -0
- data/lib/polyphony/core/global_api.rb +0 -3
- data/lib/polyphony/extensions/exception.rb +45 -0
- data/lib/polyphony/extensions/fiber.rb +85 -4
- data/lib/polyphony/extensions/{core.rb → kernel.rb} +0 -73
- data/lib/polyphony/extensions/openssl.rb +5 -1
- data/lib/polyphony/extensions/process.rb +19 -0
- data/lib/polyphony/extensions/socket.rb +12 -6
- data/lib/polyphony/extensions/thread.rb +9 -3
- data/lib/polyphony/extensions/timeout.rb +10 -0
- data/lib/polyphony/extensions.rb +9 -0
- data/lib/polyphony/version.rb +1 -1
- data/lib/polyphony.rb +4 -4
- data/test/helper.rb +0 -5
- data/test/test_backend.rb +3 -5
- data/test/test_global_api.rb +21 -12
- data/test/test_io.rb +2 -2
- data/test/test_kernel.rb +2 -2
- data/test/test_process_supervision.rb +1 -1
- data/test/test_signal.rb +20 -1
- data/test/test_socket.rb +35 -2
- data/test/test_thread.rb +1 -1
- data/test/test_thread_pool.rb +1 -1
- data/test/test_throttler.rb +3 -3
- data/test/test_timer.rb +1 -1
- data/test/test_trace.rb +7 -1
- metadata +11 -5
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Overrides for Process
|
4
|
+
module ::Process
|
5
|
+
class << self
|
6
|
+
alias_method :orig_detach, :detach
|
7
|
+
def detach(pid)
|
8
|
+
fiber = spin { Polyphony.backend_waitpid(pid) }
|
9
|
+
fiber.define_singleton_method(:pid) { pid }
|
10
|
+
fiber
|
11
|
+
end
|
12
|
+
|
13
|
+
alias_method :orig_daemon, :daemon
|
14
|
+
def daemon(*args)
|
15
|
+
orig_daemon(*args)
|
16
|
+
Polyphony.original_pid = Process.pid
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -31,7 +31,7 @@ class ::Socket
|
|
31
31
|
alias_method :orig_read, :read
|
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
|
-
return Polyphony.backend_recv(self,
|
34
|
+
return Polyphony.backend_recv(self, +'', maxlen, 0) if maxlen
|
35
35
|
|
36
36
|
buf = +''
|
37
37
|
len = buf.bytesize
|
@@ -120,8 +120,13 @@ class ::TCPSocket
|
|
120
120
|
|
121
121
|
attr_reader :io
|
122
122
|
|
123
|
+
def self.open(*args)
|
124
|
+
new(*args)
|
125
|
+
end
|
126
|
+
|
123
127
|
def initialize(remote_host, remote_port, local_host = nil, local_port = nil)
|
124
|
-
|
128
|
+
remote_addr = Addrinfo.tcp(remote_host, remote_port)
|
129
|
+
@io = Socket.new remote_addr.afamily, Socket::SOCK_STREAM
|
125
130
|
if local_host && local_port
|
126
131
|
addr = Addrinfo.tcp(local_host, local_port)
|
127
132
|
@io.bind(addr)
|
@@ -167,7 +172,7 @@ class ::TCPSocket
|
|
167
172
|
alias_method :orig_read, :read
|
168
173
|
def read(maxlen = nil, buf = nil, buf_pos = 0)
|
169
174
|
return Polyphony.backend_recv(self, buf, maxlen, buf_pos) if buf
|
170
|
-
return Polyphony.backend_recv(self,
|
175
|
+
return Polyphony.backend_recv(self, +'', maxlen, 0) if maxlen
|
171
176
|
|
172
177
|
buf = +''
|
173
178
|
len = buf.bytesize
|
@@ -224,8 +229,9 @@ end
|
|
224
229
|
# Override stock TCPServer code by encapsulating a Socket instance.
|
225
230
|
class ::TCPServer
|
226
231
|
def initialize(hostname = nil, port = 0)
|
227
|
-
|
228
|
-
@io.
|
232
|
+
addr = Addrinfo.tcp(hostname, port)
|
233
|
+
@io = Socket.new addr.afamily, Socket::SOCK_STREAM
|
234
|
+
@io.bind(addr)
|
229
235
|
@io.listen(0)
|
230
236
|
end
|
231
237
|
|
@@ -259,7 +265,7 @@ class ::UNIXSocket
|
|
259
265
|
alias_method :orig_read, :read
|
260
266
|
def read(maxlen = nil, buf = nil, buf_pos = 0)
|
261
267
|
return Polyphony.backend_recv(self, buf, maxlen, buf_pos) if buf
|
262
|
-
return Polyphony.backend_recv(self,
|
268
|
+
return Polyphony.backend_recv(self, +'', maxlen, 0) if maxlen
|
263
269
|
|
264
270
|
buf = +''
|
265
271
|
len = buf.bytesize
|
@@ -18,14 +18,20 @@ class ::Thread
|
|
18
18
|
def execute
|
19
19
|
# backend must be created in the context of the new thread, therefore it
|
20
20
|
# cannot be created in Thread#initialize
|
21
|
-
|
21
|
+
raise_error = false
|
22
|
+
begin
|
23
|
+
@backend = Polyphony::Backend.new
|
24
|
+
rescue Exception => e
|
25
|
+
raise_error = true
|
26
|
+
raise e
|
27
|
+
end
|
22
28
|
setup
|
23
29
|
@ready = true
|
24
30
|
result = @block.(*@args)
|
25
31
|
rescue Polyphony::MoveOn, Polyphony::Terminate => e
|
26
32
|
result = e.value
|
27
33
|
rescue Exception => e
|
28
|
-
result = e
|
34
|
+
raise_error ? (raise e) : (result = e)
|
29
35
|
ensure
|
30
36
|
@ready = true
|
31
37
|
finalize(result)
|
@@ -48,7 +54,7 @@ class ::Thread
|
|
48
54
|
@result = result
|
49
55
|
signal_waiters(result)
|
50
56
|
end
|
51
|
-
@backend
|
57
|
+
@backend&.finalize
|
52
58
|
end
|
53
59
|
|
54
60
|
def signal_waiters(result)
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'timeout'
|
4
|
+
|
5
|
+
# Override Timeout to use cancel scope
|
6
|
+
module ::Timeout
|
7
|
+
def self.timeout(sec, klass = Timeout::Error, message = 'execution expired', &block)
|
8
|
+
cancel_after(sec, with_exception: [klass, message], &block)
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative './extensions/exception'
|
4
|
+
require_relative './extensions/fiber'
|
5
|
+
require_relative './extensions/io'
|
6
|
+
require_relative './extensions/kernel'
|
7
|
+
require_relative './extensions/process'
|
8
|
+
require_relative './extensions/thread'
|
9
|
+
require_relative './extensions/timeout'
|
data/lib/polyphony/version.rb
CHANGED
data/lib/polyphony.rb
CHANGED
@@ -2,15 +2,13 @@
|
|
2
2
|
|
3
3
|
require 'fiber'
|
4
4
|
require_relative './polyphony_ext'
|
5
|
-
|
6
|
-
require_relative './polyphony/extensions/core'
|
7
5
|
require_relative './polyphony/extensions/thread'
|
8
|
-
require_relative './polyphony/extensions/fiber'
|
9
|
-
require_relative './polyphony/extensions/io'
|
10
6
|
|
11
7
|
Thread.current.setup_fiber_scheduling
|
12
8
|
Thread.current.backend = Polyphony::Backend.new
|
13
9
|
|
10
|
+
require_relative './polyphony/extensions'
|
11
|
+
require_relative './polyphony/core/exceptions'
|
14
12
|
require_relative './polyphony/core/global_api'
|
15
13
|
require_relative './polyphony/core/resource_pool'
|
16
14
|
require_relative './polyphony/core/sync'
|
@@ -43,6 +41,8 @@ module Polyphony
|
|
43
41
|
run_forked_block(&block)
|
44
42
|
rescue SystemExit
|
45
43
|
# fall through to ensure
|
44
|
+
rescue Polyphony::MoveOn
|
45
|
+
exit!
|
46
46
|
rescue Exception => e
|
47
47
|
STDERR << e.full_message
|
48
48
|
exit!
|
data/test/helper.rb
CHANGED
@@ -21,10 +21,6 @@ IS_LINUX = RUBY_PLATFORM =~ /linux/
|
|
21
21
|
# Minitest::Reporters::SpecReporter.new
|
22
22
|
# ]
|
23
23
|
|
24
|
-
class ::Fiber
|
25
|
-
attr_writer :auto_watcher
|
26
|
-
end
|
27
|
-
|
28
24
|
module ::Kernel
|
29
25
|
def trace(*args)
|
30
26
|
STDOUT.orig_write(format_trace(args))
|
@@ -59,7 +55,6 @@ class MiniTest::Test
|
|
59
55
|
puts "Children left after #{self.name}: #{Fiber.current.children.inspect}"
|
60
56
|
exit!
|
61
57
|
end
|
62
|
-
Fiber.current.instance_variable_set(:@auto_watcher, nil)
|
63
58
|
rescue => e
|
64
59
|
puts e
|
65
60
|
puts e.backtrace.join("\n")
|
data/test/test_backend.rb
CHANGED
@@ -243,16 +243,14 @@ class BackendTest < MiniTest::Test
|
|
243
243
|
end
|
244
244
|
|
245
245
|
def test_timer_loop
|
246
|
-
|
247
|
-
|
248
|
-
i = 0
|
246
|
+
counter = 0
|
249
247
|
f = spin do
|
250
|
-
@backend.timer_loop(0.01) {
|
248
|
+
@backend.timer_loop(0.01) { counter += 1 }
|
251
249
|
end
|
252
250
|
@backend.sleep(0.05)
|
253
251
|
f.stop
|
254
252
|
f.await # TODO: check why this test sometimes segfaults if we don't a<wait fiber
|
255
|
-
assert_in_range 4..6,
|
253
|
+
assert_in_range 4..6, counter if IS_LINUX
|
256
254
|
end
|
257
255
|
|
258
256
|
class MyTimeoutException < Exception
|
data/test/test_global_api.rb
CHANGED
@@ -162,7 +162,7 @@ class MoveOnAfterTest < MiniTest::Test
|
|
162
162
|
end
|
163
163
|
t1 = Time.now
|
164
164
|
assert_equal 1, o
|
165
|
-
assert_in_range 0.008..0.015, t1 - t0
|
165
|
+
assert_in_range 0.008..0.015, t1 - t0 if IS_LINUX
|
166
166
|
|
167
167
|
t0 = Time.now
|
168
168
|
o = move_on_after(0.05, with_value: 1) do
|
@@ -172,7 +172,7 @@ class MoveOnAfterTest < MiniTest::Test
|
|
172
172
|
end
|
173
173
|
t1 = Time.now
|
174
174
|
assert_equal 2, o
|
175
|
-
assert_in_range 0.008..0.013, t1 - t0
|
175
|
+
assert_in_range 0.008..0.013, t1 - t0 if IS_LINUX
|
176
176
|
end
|
177
177
|
end
|
178
178
|
|
@@ -297,7 +297,7 @@ class SpinLoopTest < MiniTest::Test
|
|
297
297
|
f = spin_loop(rate: 100) { buffer << (counter += 1) }
|
298
298
|
sleep 0.02
|
299
299
|
f.stop
|
300
|
-
assert_in_range 1..3, counter
|
300
|
+
assert_in_range 1..3, counter if IS_LINUX
|
301
301
|
end
|
302
302
|
|
303
303
|
def test_spin_loop_with_interval
|
@@ -307,7 +307,7 @@ class SpinLoopTest < MiniTest::Test
|
|
307
307
|
f = spin_loop(interval: 0.01) { buffer << (counter += 1) }
|
308
308
|
sleep 0.02
|
309
309
|
f.stop
|
310
|
-
assert_in_range 1..3, counter
|
310
|
+
assert_in_range 1..3, counter if IS_LINUX
|
311
311
|
end
|
312
312
|
|
313
313
|
def test_spin_loop_break
|
@@ -386,10 +386,10 @@ class ThrottledLoopTest < MiniTest::Test
|
|
386
386
|
counter = 0
|
387
387
|
t0 = Time.now
|
388
388
|
f = spin do
|
389
|
-
throttled_loop(
|
389
|
+
throttled_loop(10) { buffer << (counter += 1) }
|
390
390
|
end
|
391
|
-
sleep 0.
|
392
|
-
assert_in_range 2..4, counter
|
391
|
+
sleep 0.3
|
392
|
+
assert_in_range 2..4, counter if IS_LINUX
|
393
393
|
end
|
394
394
|
|
395
395
|
def test_throttled_loop_with_count
|
@@ -412,13 +412,11 @@ class GlobalAPIEtcTest < MiniTest::Test
|
|
412
412
|
f = after(0.001) { buffer << 2 }
|
413
413
|
snooze
|
414
414
|
assert_equal [], buffer
|
415
|
-
sleep 0.
|
415
|
+
sleep 0.0015
|
416
416
|
assert_equal [2], buffer
|
417
417
|
end
|
418
418
|
|
419
419
|
def test_every
|
420
|
-
skip unless IS_LINUX
|
421
|
-
|
422
420
|
buffer = []
|
423
421
|
t0 = Time.now
|
424
422
|
f = spin do
|
@@ -426,14 +424,25 @@ class GlobalAPIEtcTest < MiniTest::Test
|
|
426
424
|
end
|
427
425
|
sleep 0.05
|
428
426
|
f.stop
|
429
|
-
assert_in_range 4..6, buffer.size
|
427
|
+
assert_in_range 4..6, buffer.size if IS_LINUX
|
428
|
+
end
|
429
|
+
|
430
|
+
def test_every_with_slow_op
|
431
|
+
buffer = []
|
432
|
+
t0 = Time.now
|
433
|
+
f = spin do
|
434
|
+
every(0.01) { sleep 0.05; buffer << 1 }
|
435
|
+
end
|
436
|
+
sleep 0.15
|
437
|
+
f.stop
|
438
|
+
assert_in_range 2..3, buffer.size if IS_LINUX
|
430
439
|
end
|
431
440
|
|
432
441
|
def test_sleep
|
433
442
|
t0 = Time.now
|
434
443
|
sleep 0.1
|
435
444
|
elapsed = Time.now - t0
|
436
|
-
|
445
|
+
assert_in_range 0.05..0.15, elapsed if IS_LINUX
|
437
446
|
|
438
447
|
f = spin { sleep }
|
439
448
|
snooze
|
data/test/test_io.rb
CHANGED
@@ -354,9 +354,9 @@ class IOClassMethodsTest < MiniTest::Test
|
|
354
354
|
skip unless IS_LINUX
|
355
355
|
|
356
356
|
counter = 0
|
357
|
-
timer = spin { throttled_loop(
|
357
|
+
timer = spin { throttled_loop(20) { counter += 1 } }
|
358
358
|
|
359
|
-
IO.popen('sleep 0.
|
359
|
+
IO.popen('sleep 0.5') { |io| io.read(8192) }
|
360
360
|
assert(counter >= 5)
|
361
361
|
|
362
362
|
result = nil
|
data/test/test_kernel.rb
CHANGED
@@ -51,8 +51,8 @@ class KernelTest < MiniTest::Test
|
|
51
51
|
counter = 0
|
52
52
|
timer = spin { throttled_loop(200) { counter += 1 } }
|
53
53
|
|
54
|
-
`sleep 0.
|
55
|
-
|
54
|
+
`sleep 0.05`
|
55
|
+
assert_in_range 8..14, counter if IS_LINUX
|
56
56
|
|
57
57
|
result = `echo "hello"`
|
58
58
|
assert_equal "hello\n", result
|
data/test/test_signal.rb
CHANGED
@@ -93,4 +93,23 @@ class SignalTrapTest < Minitest::Test
|
|
93
93
|
buffer = i.read
|
94
94
|
assert_equal "INT\n", buffer
|
95
95
|
end
|
96
|
-
|
96
|
+
|
97
|
+
def test_busy_signal_handling
|
98
|
+
i, o = IO.pipe
|
99
|
+
pid = Polyphony.fork do
|
100
|
+
main = Fiber.current
|
101
|
+
trap('INT') { o.puts 'INT'; o.close; main.stop }
|
102
|
+
i.close
|
103
|
+
f1 = spin_loop { snooze }
|
104
|
+
f2 = spin_loop { snooze }
|
105
|
+
f1.await
|
106
|
+
end
|
107
|
+
|
108
|
+
o.close
|
109
|
+
sleep 0.1
|
110
|
+
Process.kill('INT', pid)
|
111
|
+
Thread.current.backend.waitpid(pid)
|
112
|
+
buffer = i.read
|
113
|
+
assert_equal "INT\n", buffer
|
114
|
+
end
|
115
|
+
end
|
data/test/test_socket.rb
CHANGED
@@ -9,9 +9,9 @@ class SocketTest < MiniTest::Test
|
|
9
9
|
super
|
10
10
|
end
|
11
11
|
|
12
|
-
def start_tcp_server_on_random_port
|
12
|
+
def start_tcp_server_on_random_port(host = '127.0.0.1')
|
13
13
|
port = rand(1100..60000)
|
14
|
-
server = TCPServer.new(
|
14
|
+
server = TCPServer.new(host, port)
|
15
15
|
[port, server]
|
16
16
|
rescue Errno::EADDRINUSE
|
17
17
|
retry
|
@@ -40,6 +40,39 @@ class SocketTest < MiniTest::Test
|
|
40
40
|
server&.close
|
41
41
|
end
|
42
42
|
|
43
|
+
def test_tcpsocket_open_with_hostname
|
44
|
+
client = TCPSocket.open('google.com', 80)
|
45
|
+
client.write("GET / HTTP/1.0\r\nHost: google.com\r\n\r\n")
|
46
|
+
result = nil
|
47
|
+
move_on_after(1) {
|
48
|
+
result = client.read
|
49
|
+
}
|
50
|
+
assert result =~ /HTTP\/1.0 301 Moved Permanently/
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_tcp_ipv6
|
54
|
+
port, server = start_tcp_server_on_random_port('::1')
|
55
|
+
server_fiber = spin do
|
56
|
+
while (socket = server.accept)
|
57
|
+
spin do
|
58
|
+
while (data = socket.gets(8192))
|
59
|
+
socket << data
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
snooze
|
66
|
+
client = TCPSocket.new('::1', port)
|
67
|
+
client.write("1234\n")
|
68
|
+
assert_equal "1234\n", client.recv(8192)
|
69
|
+
client.close
|
70
|
+
ensure
|
71
|
+
server_fiber&.stop
|
72
|
+
server_fiber&.await
|
73
|
+
server&.close
|
74
|
+
end
|
75
|
+
|
43
76
|
def test_read
|
44
77
|
port, server = start_tcp_server_on_random_port
|
45
78
|
server_fiber = spin do
|
data/test/test_thread.rb
CHANGED
@@ -132,7 +132,7 @@ class ThreadTest < MiniTest::Test
|
|
132
132
|
Thread.backend.trace_proc = proc {|*r| records << r }
|
133
133
|
suspend
|
134
134
|
assert_equal [
|
135
|
-
[:fiber_switchpoint, Fiber.current]
|
135
|
+
[:fiber_switchpoint, Fiber.current, ["#{__FILE__}:#{__LINE__ - 2}:in `test_that_suspend_returns_immediately_if_no_watchers'"] + caller]
|
136
136
|
], records
|
137
137
|
ensure
|
138
138
|
Thread.backend.trace_proc = nil
|
data/test/test_thread_pool.rb
CHANGED
data/test/test_throttler.rb
CHANGED
@@ -10,7 +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
|
-
assert_in_range 1..4, buffer.size
|
13
|
+
assert_in_range 1..4, buffer.size if IS_LINUX
|
14
14
|
ensure
|
15
15
|
t.stop
|
16
16
|
end
|
@@ -23,7 +23,7 @@ class ThrottlerTest < MiniTest::Test
|
|
23
23
|
end
|
24
24
|
sleep 0.25
|
25
25
|
f.stop
|
26
|
-
assert_in_range
|
26
|
+
assert_in_range 4..6, buffer.size if IS_LINUX
|
27
27
|
ensure
|
28
28
|
t.stop
|
29
29
|
end
|
@@ -34,7 +34,7 @@ class ThrottlerTest < MiniTest::Test
|
|
34
34
|
f = spin { loop { t.process { buffer << 1 } } }
|
35
35
|
sleep 0.02
|
36
36
|
f.stop
|
37
|
-
assert_in_range 2..4, buffer.size
|
37
|
+
assert_in_range 2..4, buffer.size if IS_LINUX
|
38
38
|
ensure
|
39
39
|
t.stop
|
40
40
|
end
|
data/test/test_timer.rb
CHANGED
data/test/test_trace.rb
CHANGED
@@ -10,7 +10,7 @@ class TraceTest < MiniTest::Test
|
|
10
10
|
|
11
11
|
assert_equal [
|
12
12
|
[:fiber_schedule, Fiber.current, nil, false],
|
13
|
-
[:fiber_switchpoint, Fiber.current],
|
13
|
+
[:fiber_switchpoint, Fiber.current, ["#{__FILE__}:#{__LINE__ - 4}:in `test_tracing_enabled'"] + caller],
|
14
14
|
[:fiber_run, Fiber.current, nil]
|
15
15
|
], events
|
16
16
|
ensure
|
@@ -22,9 +22,15 @@ class TraceTest < MiniTest::Test
|
|
22
22
|
Thread.backend.trace_proc = proc { |*e| events << e }
|
23
23
|
|
24
24
|
f = spin { sleep 0; :byebye }
|
25
|
+
l0 = __LINE__ + 1
|
25
26
|
suspend
|
26
27
|
sleep 0
|
27
28
|
|
29
|
+
Thread.backend.trace_proc = nil
|
30
|
+
|
31
|
+
# remove caller info for :fiber_switchpoint events
|
32
|
+
events.each {|e| e.pop if e[0] == :fiber_switchpoint }
|
33
|
+
|
28
34
|
assert_equal [
|
29
35
|
[:fiber_create, f],
|
30
36
|
[:fiber_schedule, f, nil, false],
|
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.75'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sharon Rosner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-02-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake-compiler
|
@@ -146,6 +146,7 @@ extra_rdoc_files:
|
|
146
146
|
files:
|
147
147
|
- ".github/FUNDING.yml"
|
148
148
|
- ".github/workflows/test.yml"
|
149
|
+
- ".github/workflows/test_io_uring.yml"
|
149
150
|
- ".gitignore"
|
150
151
|
- ".gitmodules"
|
151
152
|
- ".rubocop.yml"
|
@@ -233,6 +234,7 @@ files:
|
|
233
234
|
- examples/core/queue.rb
|
234
235
|
- examples/core/recurrent-timer.rb
|
235
236
|
- examples/core/resource_delegate.rb
|
237
|
+
- examples/core/ring.rb
|
236
238
|
- examples/core/spin.rb
|
237
239
|
- examples/core/spin_error_backtrace.rb
|
238
240
|
- examples/core/supervise-process.rb
|
@@ -354,6 +356,7 @@ files:
|
|
354
356
|
- lib/polyphony/adapters/redis.rb
|
355
357
|
- lib/polyphony/adapters/sequel.rb
|
356
358
|
- lib/polyphony/core/channel.rb
|
359
|
+
- lib/polyphony/core/debug.rb
|
357
360
|
- lib/polyphony/core/exceptions.rb
|
358
361
|
- lib/polyphony/core/global_api.rb
|
359
362
|
- lib/polyphony/core/resource_pool.rb
|
@@ -362,13 +365,16 @@ files:
|
|
362
365
|
- lib/polyphony/core/throttler.rb
|
363
366
|
- lib/polyphony/core/timer.rb
|
364
367
|
- lib/polyphony/debugger.rb
|
365
|
-
- lib/polyphony/extensions
|
366
|
-
- lib/polyphony/extensions/
|
368
|
+
- lib/polyphony/extensions.rb
|
369
|
+
- lib/polyphony/extensions/exception.rb
|
367
370
|
- lib/polyphony/extensions/fiber.rb
|
368
371
|
- lib/polyphony/extensions/io.rb
|
372
|
+
- lib/polyphony/extensions/kernel.rb
|
369
373
|
- lib/polyphony/extensions/openssl.rb
|
374
|
+
- lib/polyphony/extensions/process.rb
|
370
375
|
- lib/polyphony/extensions/socket.rb
|
371
376
|
- lib/polyphony/extensions/thread.rb
|
377
|
+
- lib/polyphony/extensions/timeout.rb
|
372
378
|
- lib/polyphony/net.rb
|
373
379
|
- lib/polyphony/version.rb
|
374
380
|
- polyphony.gemspec
|
@@ -425,7 +431,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
425
431
|
- !ruby/object:Gem::Version
|
426
432
|
version: '0'
|
427
433
|
requirements: []
|
428
|
-
rubygems_version: 3.
|
434
|
+
rubygems_version: 3.2.32
|
429
435
|
signing_key:
|
430
436
|
specification_version: 4
|
431
437
|
summary: Fine grained concurrency for Ruby
|