polyphony 0.41 → 0.43.3
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 +30 -0
- data/Gemfile.lock +6 -6
- data/README.md +0 -1
- data/Rakefile +1 -1
- data/TODO.md +18 -9
- data/docs/_config.yml +56 -7
- data/docs/_sass/custom/custom.scss +6 -26
- data/docs/_sass/overrides.scss +0 -46
- data/docs/{user-guide → _user-guide}/all-about-timers.md +0 -0
- data/docs/_user-guide/index.md +9 -0
- data/docs/{user-guide → _user-guide}/web-server.md +0 -0
- data/docs/api-reference/index.md +9 -0
- data/docs/api-reference/polyphony-process.md +1 -1
- data/docs/api-reference/thread.md +1 -1
- data/docs/faq.md +21 -11
- data/docs/favicon.ico +0 -0
- data/docs/getting-started/index.md +10 -0
- data/docs/getting-started/installing.md +2 -6
- data/docs/getting-started/overview.md +486 -0
- data/docs/getting-started/tutorial.md +27 -19
- data/docs/index.md +6 -2
- data/docs/main-concepts/concurrency.md +0 -5
- data/docs/main-concepts/design-principles.md +2 -12
- data/docs/main-concepts/index.md +9 -0
- data/docs/polyphony-logo.png +0 -0
- data/examples/adapters/concurrent-ruby.rb +9 -0
- data/examples/adapters/redis_blpop.rb +12 -0
- data/examples/core/01-spinning-up-fibers.rb +1 -0
- data/examples/core/03-interrupting.rb +4 -1
- data/examples/core/04-handling-signals.rb +19 -0
- data/examples/core/xx-daemon.rb +14 -0
- data/examples/performance/thread-vs-fiber/polyphony_server.rb +6 -18
- data/examples/performance/thread-vs-fiber/polyphony_server_read_loop.rb +58 -0
- data/examples/performance/xx-array.rb +11 -0
- data/examples/performance/xx-fiber-switch.rb +9 -0
- data/examples/performance/xx-snooze.rb +15 -0
- data/ext/polyphony/fiber.c +0 -3
- data/ext/polyphony/libev_agent.c +303 -81
- data/ext/polyphony/libev_queue.c +8 -5
- data/ext/polyphony/polyphony.c +0 -16
- data/ext/polyphony/polyphony.h +6 -6
- data/ext/polyphony/polyphony_ext.c +0 -2
- data/ext/polyphony/thread.c +8 -42
- data/lib/polyphony.rb +29 -2
- data/lib/polyphony/adapters/redis.rb +3 -2
- data/lib/polyphony/core/channel.rb +2 -2
- data/lib/polyphony/core/global_api.rb +6 -4
- data/lib/polyphony/core/resource_pool.rb +19 -9
- data/lib/polyphony/extensions/core.rb +8 -3
- data/lib/polyphony/extensions/fiber.rb +0 -12
- data/lib/polyphony/extensions/io.rb +4 -0
- data/lib/polyphony/extensions/openssl.rb +34 -10
- data/lib/polyphony/extensions/socket.rb +2 -2
- data/lib/polyphony/version.rb +1 -1
- data/polyphony.gemspec +1 -1
- data/test/test_agent.rb +59 -6
- data/test/test_fiber.rb +3 -3
- data/test/test_global_api.rb +48 -15
- data/test/test_resource_pool.rb +12 -0
- data/test/test_socket.rb +5 -4
- data/test/test_throttler.rb +6 -5
- metadata +21 -21
- data/docs/_includes/head.html +0 -40
- data/docs/_includes/nav.html +0 -51
- data/docs/_includes/prevnext.html +0 -17
- data/docs/_layouts/default.html +0 -106
- data/docs/api-reference.md +0 -11
- data/docs/api-reference/gyro-async.md +0 -57
- data/docs/api-reference/gyro-child.md +0 -29
- data/docs/api-reference/gyro-queue.md +0 -44
- data/docs/api-reference/gyro-timer.md +0 -51
- data/docs/api-reference/gyro.md +0 -25
- data/docs/getting-started.md +0 -10
- data/docs/main-concepts.md +0 -10
- data/docs/user-guide.md +0 -10
- data/examples/core/forever_sleep.rb +0 -19
- data/ext/polyphony/socket.c +0 -213
@@ -370,15 +370,3 @@ class ::Fiber
|
|
370
370
|
end
|
371
371
|
|
372
372
|
Fiber.current.setup_main_fiber
|
373
|
-
|
374
|
-
# This at_exit handler is needed only when the original process exits. Due to
|
375
|
-
# the behaviour of fibers on fork (and especially on exit from forked
|
376
|
-
# processes,) we use a separate mechanism to terminate fibers in forked
|
377
|
-
# processes (see Polyphony.fork).
|
378
|
-
orig_pid = Process.pid
|
379
|
-
at_exit do
|
380
|
-
next unless orig_pid == Process.pid
|
381
|
-
|
382
|
-
Polyphony.terminate_threads
|
383
|
-
Fiber.current.shutdown_all_children
|
384
|
-
end
|
@@ -201,6 +201,10 @@ class ::IO
|
|
201
201
|
buf ? readpartial(maxlen, buf) : readpartial(maxlen)
|
202
202
|
end
|
203
203
|
|
204
|
+
def read_loop(&block)
|
205
|
+
Thread.current.agent.read_loop(self, &block)
|
206
|
+
end
|
207
|
+
|
204
208
|
# alias_method :orig_read, :read
|
205
209
|
# def read(length = nil, outbuf = nil)
|
206
210
|
# if length
|
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'openssl'
|
4
|
-
|
5
4
|
require_relative './socket'
|
6
5
|
|
7
6
|
# Open ssl socket helper methods (to make it compatible with Socket API)
|
@@ -18,12 +17,36 @@ class ::OpenSSL::SSL::SSLSocket
|
|
18
17
|
io.reuse_addr
|
19
18
|
end
|
20
19
|
|
21
|
-
|
20
|
+
alias_method :orig_accept, :accept
|
21
|
+
def accept
|
22
|
+
loop do
|
23
|
+
result = accept_nonblock(exception: false)
|
24
|
+
case result
|
25
|
+
when :wait_readable then Thread.current.agent.wait_io(io, false)
|
26
|
+
when :wait_writable then Thread.current.agent.wait_io(io, true)
|
27
|
+
else
|
28
|
+
return result
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
alias_method :orig_sysread, :sysread
|
34
|
+
def sysread(maxlen, buf = +'')
|
22
35
|
loop do
|
23
36
|
case (result = read_nonblock(maxlen, buf, exception: false))
|
24
37
|
when :wait_readable then Thread.current.agent.wait_io(io, false)
|
38
|
+
else return result
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
alias_method :orig_syswrite, :syswrite
|
44
|
+
def syswrite(buf)
|
45
|
+
loop do
|
46
|
+
case (result = write_nonblock(buf, exception: false))
|
25
47
|
when :wait_writable then Thread.current.agent.wait_io(io, true)
|
26
|
-
else
|
48
|
+
else
|
49
|
+
return result
|
27
50
|
end
|
28
51
|
end
|
29
52
|
end
|
@@ -37,13 +60,14 @@ class ::OpenSSL::SSL::SSLSocket
|
|
37
60
|
# @sync = osync
|
38
61
|
end
|
39
62
|
|
40
|
-
def
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
63
|
+
def readpartial(maxlen, buf = +'')
|
64
|
+
result = sysread(maxlen, buf)
|
65
|
+
result || (raise EOFError)
|
66
|
+
end
|
67
|
+
|
68
|
+
def read_loop
|
69
|
+
while (data = sysread(8192))
|
70
|
+
yield data
|
47
71
|
end
|
48
72
|
end
|
49
73
|
end
|
@@ -128,11 +128,11 @@ class ::TCPServer
|
|
128
128
|
|
129
129
|
alias_method :orig_accept, :accept
|
130
130
|
def accept
|
131
|
-
@io
|
131
|
+
@io.accept
|
132
132
|
end
|
133
133
|
|
134
134
|
alias_method :orig_close, :close
|
135
135
|
def close
|
136
|
-
@io
|
136
|
+
@io.close
|
137
137
|
end
|
138
138
|
end
|
data/lib/polyphony/version.rb
CHANGED
data/polyphony.gemspec
CHANGED
@@ -36,5 +36,5 @@ Gem::Specification.new do |s|
|
|
36
36
|
s.add_development_dependency 'jekyll', '~>3.8.6'
|
37
37
|
s.add_development_dependency 'jekyll-remote-theme', '~>0.4.1'
|
38
38
|
s.add_development_dependency 'jekyll-seo-tag', '~>2.6.1'
|
39
|
-
s.add_development_dependency 'just-the-docs', '~>0.
|
39
|
+
s.add_development_dependency 'just-the-docs', '~>0.3.0'
|
40
40
|
end
|
data/test/test_agent.rb
CHANGED
@@ -5,11 +5,14 @@ require_relative 'helper'
|
|
5
5
|
class AgentTest < MiniTest::Test
|
6
6
|
def setup
|
7
7
|
super
|
8
|
+
@prev_agent = Thread.current.agent
|
8
9
|
@agent = Polyphony::LibevAgent.new
|
10
|
+
Thread.current.agent = @agent
|
9
11
|
end
|
10
12
|
|
11
13
|
def teardown
|
12
14
|
@agent.finalize
|
15
|
+
Thread.current.agent = @prev_agent
|
13
16
|
end
|
14
17
|
|
15
18
|
def test_sleep
|
@@ -18,10 +21,13 @@ class AgentTest < MiniTest::Test
|
|
18
21
|
spin {
|
19
22
|
@agent.sleep 0.01
|
20
23
|
count += 1
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
24
|
+
@agent.sleep 0.01
|
25
|
+
count += 1
|
26
|
+
@agent.sleep 0.01
|
27
|
+
count += 1
|
28
|
+
}.await
|
29
|
+
assert Time.now - t0 >= 0.03
|
30
|
+
assert_equal 3, count
|
25
31
|
end
|
26
32
|
|
27
33
|
def test_write_read_partial
|
@@ -67,11 +73,58 @@ class AgentTest < MiniTest::Test
|
|
67
73
|
|
68
74
|
def test_waitpid
|
69
75
|
pid = fork do
|
70
|
-
|
76
|
+
@agent.post_fork
|
71
77
|
exit(42)
|
72
78
|
end
|
73
79
|
|
74
|
-
result =
|
80
|
+
result = @agent.waitpid(pid)
|
75
81
|
assert_equal [pid, 42], result
|
76
82
|
end
|
83
|
+
|
84
|
+
def test_read_loop
|
85
|
+
i, o = IO.pipe
|
86
|
+
|
87
|
+
buf = []
|
88
|
+
spin do
|
89
|
+
buf << :ready
|
90
|
+
@agent.read_loop(i) { |d| buf << d }
|
91
|
+
buf << :done
|
92
|
+
end
|
93
|
+
|
94
|
+
# writing always causes snoozing
|
95
|
+
o << 'foo'
|
96
|
+
o << 'bar'
|
97
|
+
o.close
|
98
|
+
|
99
|
+
# read_loop will snooze after every read
|
100
|
+
4.times { snooze }
|
101
|
+
|
102
|
+
assert_equal [:ready, 'foo', 'bar', :done], buf
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_accept_loop
|
106
|
+
server = TCPServer.new('127.0.0.1', 1234)
|
107
|
+
|
108
|
+
clients = []
|
109
|
+
server_fiber = spin do
|
110
|
+
@agent.accept_loop(server) { |c| clients << c }
|
111
|
+
end
|
112
|
+
|
113
|
+
c1 = TCPSocket.new('127.0.0.1', 1234)
|
114
|
+
10.times { snooze }
|
115
|
+
|
116
|
+
assert_equal 1, clients.size
|
117
|
+
|
118
|
+
c2 = TCPSocket.new('127.0.0.1', 1234)
|
119
|
+
10.times { snooze }
|
120
|
+
|
121
|
+
assert_equal 2, clients.size
|
122
|
+
|
123
|
+
ensure
|
124
|
+
c1&.close
|
125
|
+
c2&.close
|
126
|
+
server_fiber.stop
|
127
|
+
snooze
|
128
|
+
server&.close
|
129
|
+
end
|
77
130
|
end
|
data/test/test_fiber.rb
CHANGED
@@ -482,9 +482,9 @@ class FiberTest < MiniTest::Test
|
|
482
482
|
def test_select_from_multiple_fibers
|
483
483
|
sleep 0
|
484
484
|
buffer = []
|
485
|
-
f1 = spin { sleep 0.
|
486
|
-
f2 = spin { sleep 0.
|
487
|
-
f3 = spin { sleep 0.
|
485
|
+
f1 = spin { sleep 0.1; buffer << :foo; :foo }
|
486
|
+
f2 = spin { sleep 0.3; buffer << :bar; :bar }
|
487
|
+
f3 = spin { sleep 0.5; buffer << :baz; :baz }
|
488
488
|
|
489
489
|
selected, result = Fiber.select(f1, f2, f3)
|
490
490
|
assert_equal :foo, result
|
data/test/test_global_api.rb
CHANGED
@@ -106,7 +106,7 @@ class MoveOnAfterTest < MiniTest::Test
|
|
106
106
|
end
|
107
107
|
t1 = Time.now
|
108
108
|
|
109
|
-
assert t1 - t0 < 0.
|
109
|
+
assert t1 - t0 < 0.1
|
110
110
|
assert_nil v
|
111
111
|
end
|
112
112
|
|
@@ -118,7 +118,7 @@ class MoveOnAfterTest < MiniTest::Test
|
|
118
118
|
end
|
119
119
|
t1 = Time.now
|
120
120
|
|
121
|
-
assert t1 - t0 < 0.
|
121
|
+
assert t1 - t0 < 0.1
|
122
122
|
assert_equal :bar, v
|
123
123
|
end
|
124
124
|
|
@@ -129,7 +129,7 @@ class MoveOnAfterTest < MiniTest::Test
|
|
129
129
|
assert_equal Fiber.current, f.parent
|
130
130
|
v = sleep 1
|
131
131
|
t1 = Time.now
|
132
|
-
assert t1 - t0 < 0.
|
132
|
+
assert t1 - t0 < 0.1
|
133
133
|
assert_equal 'foo', v
|
134
134
|
end
|
135
135
|
end
|
@@ -145,7 +145,7 @@ class CancelAfterTest < MiniTest::Test
|
|
145
145
|
end
|
146
146
|
end
|
147
147
|
t1 = Time.now
|
148
|
-
assert t1 - t0 < 0.
|
148
|
+
assert t1 - t0 < 0.1
|
149
149
|
end
|
150
150
|
|
151
151
|
def test_cancel_after_without_block
|
@@ -157,7 +157,31 @@ class CancelAfterTest < MiniTest::Test
|
|
157
157
|
sleep 1
|
158
158
|
end
|
159
159
|
t1 = Time.now
|
160
|
-
assert t1 - t0 < 0.
|
160
|
+
assert t1 - t0 < 0.1
|
161
|
+
end
|
162
|
+
|
163
|
+
class CustomException < Exception
|
164
|
+
end
|
165
|
+
|
166
|
+
def test_cancel_after_with_custom_exception
|
167
|
+
assert_raises CustomException do
|
168
|
+
cancel_after(0.01, with_exception: CustomException) do
|
169
|
+
sleep 1
|
170
|
+
:foo
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
begin
|
175
|
+
e = nil
|
176
|
+
cancel_after(0.01, with_exception: 'foo') do
|
177
|
+
sleep 1
|
178
|
+
:foo
|
179
|
+
end
|
180
|
+
rescue => e
|
181
|
+
ensure
|
182
|
+
assert_kind_of RuntimeError, e
|
183
|
+
assert_equal 'foo', e.message
|
184
|
+
end
|
161
185
|
end
|
162
186
|
end
|
163
187
|
|
@@ -201,10 +225,13 @@ class SpinLoopTest < MiniTest::Test
|
|
201
225
|
def test_spin_loop_with_rate
|
202
226
|
buffer = []
|
203
227
|
counter = 0
|
204
|
-
|
228
|
+
t0 = Time.now
|
229
|
+
f = spin_loop(rate: 10) { buffer << (counter += 1) }
|
205
230
|
sleep 0.2
|
206
231
|
f.stop
|
207
|
-
|
232
|
+
elapsed = Time.now - t0
|
233
|
+
expected = (elapsed * 10).to_i
|
234
|
+
assert counter >= expected - 1 && counter <= expected + 1
|
208
235
|
end
|
209
236
|
end
|
210
237
|
|
@@ -212,12 +239,15 @@ class ThrottledLoopTest < MiniTest::Test
|
|
212
239
|
def test_throttled_loop
|
213
240
|
buffer = []
|
214
241
|
counter = 0
|
242
|
+
t0 = Time.now
|
215
243
|
f = spin do
|
216
|
-
throttled_loop(
|
244
|
+
throttled_loop(10) { buffer << (counter += 1) }
|
217
245
|
end
|
218
|
-
sleep 0.
|
246
|
+
sleep 0.3
|
219
247
|
f.stop
|
220
|
-
|
248
|
+
elapsed = Time.now - t0
|
249
|
+
expected = (elapsed * 10).to_i
|
250
|
+
assert counter >= expected - 1 && counter <= expected + 1
|
221
251
|
end
|
222
252
|
|
223
253
|
def test_throttled_loop_with_count
|
@@ -243,19 +273,22 @@ class GlobalAPIEtcTest < MiniTest::Test
|
|
243
273
|
|
244
274
|
def test_every
|
245
275
|
buffer = []
|
276
|
+
t0 = Time.now
|
246
277
|
f = spin do
|
247
|
-
every(0.
|
278
|
+
every(0.1) { buffer << 1 }
|
248
279
|
end
|
249
|
-
sleep 0.
|
280
|
+
sleep 0.5
|
250
281
|
f.stop
|
251
|
-
|
282
|
+
elapsed = Time.now - t0
|
283
|
+
expected = (elapsed / 0.1).to_i
|
284
|
+
assert buffer.size >= expected - 2 && buffer.size <= expected + 2
|
252
285
|
end
|
253
286
|
|
254
287
|
def test_sleep
|
255
288
|
t0 = Time.now
|
256
|
-
sleep 0.
|
289
|
+
sleep 0.1
|
257
290
|
elapsed = Time.now - t0
|
258
|
-
assert (0.
|
291
|
+
assert (0.05..0.15).include? elapsed
|
259
292
|
|
260
293
|
f = spin { sleep }
|
261
294
|
snooze
|
data/test/test_resource_pool.rb
CHANGED
@@ -123,4 +123,16 @@ class ResourcePoolTest < MiniTest::Test
|
|
123
123
|
pool.preheat!
|
124
124
|
assert_equal 2, pool.size
|
125
125
|
end
|
126
|
+
|
127
|
+
def test_reentrant_resource_pool
|
128
|
+
resources = [+'a', +'b']
|
129
|
+
pool = Polyphony::ResourcePool.new(limit: 1) { resources.shift }
|
130
|
+
|
131
|
+
pool.acquire do |r|
|
132
|
+
assert_equal 'a', r
|
133
|
+
pool.acquire do |r|
|
134
|
+
assert_equal 'a', r
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
126
138
|
end
|
data/test/test_socket.rb
CHANGED
@@ -8,7 +8,8 @@ class SocketTest < MiniTest::Test
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def test_tcp
|
11
|
-
|
11
|
+
port = rand(1234..5678)
|
12
|
+
server = TCPServer.new('127.0.0.1', port)
|
12
13
|
|
13
14
|
server_fiber = spin do
|
14
15
|
while (socket = server.accept)
|
@@ -21,13 +22,13 @@ class SocketTest < MiniTest::Test
|
|
21
22
|
end
|
22
23
|
|
23
24
|
snooze
|
24
|
-
client = TCPSocket.new('127.0.0.1',
|
25
|
+
client = TCPSocket.new('127.0.0.1', port)
|
25
26
|
client.write("1234\n")
|
26
27
|
assert_equal "1234\n", client.readpartial(8192)
|
27
28
|
client.close
|
28
29
|
ensure
|
29
|
-
server_fiber
|
30
|
-
|
30
|
+
server_fiber&.stop
|
31
|
+
server_fiber&.await
|
31
32
|
server&.close
|
32
33
|
end
|
33
34
|
end
|
data/test/test_throttler.rb
CHANGED
@@ -4,14 +4,15 @@ require_relative 'helper'
|
|
4
4
|
|
5
5
|
class ThrottlerTest < MiniTest::Test
|
6
6
|
def test_throttler_with_rate
|
7
|
-
t = Polyphony::Throttler.new(
|
7
|
+
t = Polyphony::Throttler.new(10)
|
8
8
|
buffer = []
|
9
|
+
t0 = Time.now
|
9
10
|
f = spin { loop { t.process { buffer << 1 } } }
|
10
|
-
sleep 0.
|
11
|
+
sleep 0.2
|
11
12
|
f.stop
|
12
|
-
|
13
|
-
|
14
|
-
assert buffer.size <=
|
13
|
+
elapsed = Time.now - t0
|
14
|
+
expected = (elapsed * 10).to_i
|
15
|
+
assert buffer.size >= expected - 1 && buffer.size <= expected + 1
|
15
16
|
ensure
|
16
17
|
t.stop
|
17
18
|
end
|
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:
|
4
|
+
version: 0.43.3
|
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-
|
11
|
+
date: 2020-07-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httparty
|
@@ -212,14 +212,14 @@ dependencies:
|
|
212
212
|
requirements:
|
213
213
|
- - "~>"
|
214
214
|
- !ruby/object:Gem::Version
|
215
|
-
version: 0.
|
215
|
+
version: 0.3.0
|
216
216
|
type: :development
|
217
217
|
prerelease: false
|
218
218
|
version_requirements: !ruby/object:Gem::Requirement
|
219
219
|
requirements:
|
220
220
|
- - "~>"
|
221
221
|
- !ruby/object:Gem::Version
|
222
|
-
version: 0.
|
222
|
+
version: 0.3.0
|
223
223
|
description:
|
224
224
|
email: ciconia@gmail.com
|
225
225
|
executables: []
|
@@ -242,20 +242,14 @@ files:
|
|
242
242
|
- TODO.md
|
243
243
|
- bin/polyphony-debug
|
244
244
|
- docs/_config.yml
|
245
|
-
- docs/_includes/head.html
|
246
|
-
- docs/_includes/nav.html
|
247
|
-
- docs/_includes/prevnext.html
|
248
|
-
- docs/_layouts/default.html
|
249
245
|
- docs/_sass/custom/custom.scss
|
250
246
|
- docs/_sass/overrides.scss
|
251
|
-
- docs/
|
247
|
+
- docs/_user-guide/all-about-timers.md
|
248
|
+
- docs/_user-guide/index.md
|
249
|
+
- docs/_user-guide/web-server.md
|
252
250
|
- docs/api-reference/exception.md
|
253
251
|
- docs/api-reference/fiber.md
|
254
|
-
- docs/api-reference/
|
255
|
-
- docs/api-reference/gyro-child.md
|
256
|
-
- docs/api-reference/gyro-queue.md
|
257
|
-
- docs/api-reference/gyro-timer.md
|
258
|
-
- docs/api-reference/gyro.md
|
252
|
+
- docs/api-reference/index.md
|
259
253
|
- docs/api-reference/io.md
|
260
254
|
- docs/api-reference/object.md
|
261
255
|
- docs/api-reference/polyphony-baseexception.md
|
@@ -273,23 +267,25 @@ files:
|
|
273
267
|
- docs/assets/img/echo-fibers.svg
|
274
268
|
- docs/assets/img/sleeping-fiber.svg
|
275
269
|
- docs/faq.md
|
276
|
-
- docs/
|
270
|
+
- docs/favicon.ico
|
271
|
+
- docs/getting-started/index.md
|
277
272
|
- docs/getting-started/installing.md
|
273
|
+
- docs/getting-started/overview.md
|
278
274
|
- docs/getting-started/tutorial.md
|
279
275
|
- docs/index.md
|
280
|
-
- docs/main-concepts.md
|
281
276
|
- docs/main-concepts/concurrency.md
|
282
277
|
- docs/main-concepts/design-principles.md
|
283
278
|
- docs/main-concepts/exception-handling.md
|
284
279
|
- docs/main-concepts/extending.md
|
285
280
|
- docs/main-concepts/fiber-scheduling.md
|
286
|
-
- docs/
|
287
|
-
- docs/
|
288
|
-
-
|
281
|
+
- docs/main-concepts/index.md
|
282
|
+
- docs/polyphony-logo.png
|
283
|
+
- examples/adapters/concurrent-ruby.rb
|
289
284
|
- examples/adapters/pg_client.rb
|
290
285
|
- examples/adapters/pg_notify.rb
|
291
286
|
- examples/adapters/pg_pool.rb
|
292
287
|
- examples/adapters/pg_transaction.rb
|
288
|
+
- examples/adapters/redis_blpop.rb
|
293
289
|
- examples/adapters/redis_channels.rb
|
294
290
|
- examples/adapters/redis_client.rb
|
295
291
|
- examples/adapters/redis_pubsub.rb
|
@@ -297,11 +293,12 @@ files:
|
|
297
293
|
- examples/core/01-spinning-up-fibers.rb
|
298
294
|
- examples/core/02-awaiting-fibers.rb
|
299
295
|
- examples/core/03-interrupting.rb
|
300
|
-
- examples/core/
|
296
|
+
- examples/core/04-handling-signals.rb
|
301
297
|
- examples/core/xx-agent.rb
|
302
298
|
- examples/core/xx-at_exit.rb
|
303
299
|
- examples/core/xx-caller.rb
|
304
300
|
- examples/core/xx-channels.rb
|
301
|
+
- examples/core/xx-daemon.rb
|
305
302
|
- examples/core/xx-deadlock.rb
|
306
303
|
- examples/core/xx-deferring-an-operation.rb
|
307
304
|
- examples/core/xx-erlang-style-genserver.rb
|
@@ -361,10 +358,14 @@ files:
|
|
361
358
|
- examples/performance/snooze_raw.rb
|
362
359
|
- examples/performance/thread-vs-fiber/polyphony_mt_server.rb
|
363
360
|
- examples/performance/thread-vs-fiber/polyphony_server.rb
|
361
|
+
- examples/performance/thread-vs-fiber/polyphony_server_read_loop.rb
|
364
362
|
- examples/performance/thread-vs-fiber/threaded_server.rb
|
365
363
|
- examples/performance/thread-vs-fiber/xx-httparty_multi.rb
|
366
364
|
- examples/performance/thread-vs-fiber/xx-httparty_threaded.rb
|
367
365
|
- examples/performance/thread_pool_perf.rb
|
366
|
+
- examples/performance/xx-array.rb
|
367
|
+
- examples/performance/xx-fiber-switch.rb
|
368
|
+
- examples/performance/xx-snooze.rb
|
368
369
|
- ext/libev/Changes
|
369
370
|
- ext/libev/LICENSE
|
370
371
|
- ext/libev/README
|
@@ -390,7 +391,6 @@ files:
|
|
390
391
|
- ext/polyphony/polyphony.c
|
391
392
|
- ext/polyphony/polyphony.h
|
392
393
|
- ext/polyphony/polyphony_ext.c
|
393
|
-
- ext/polyphony/socket.c
|
394
394
|
- ext/polyphony/thread.c
|
395
395
|
- ext/polyphony/tracing.c
|
396
396
|
- lib/polyphony.rb
|