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.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +30 -0
  3. data/Gemfile.lock +6 -6
  4. data/README.md +0 -1
  5. data/Rakefile +1 -1
  6. data/TODO.md +18 -9
  7. data/docs/_config.yml +56 -7
  8. data/docs/_sass/custom/custom.scss +6 -26
  9. data/docs/_sass/overrides.scss +0 -46
  10. data/docs/{user-guide → _user-guide}/all-about-timers.md +0 -0
  11. data/docs/_user-guide/index.md +9 -0
  12. data/docs/{user-guide → _user-guide}/web-server.md +0 -0
  13. data/docs/api-reference/index.md +9 -0
  14. data/docs/api-reference/polyphony-process.md +1 -1
  15. data/docs/api-reference/thread.md +1 -1
  16. data/docs/faq.md +21 -11
  17. data/docs/favicon.ico +0 -0
  18. data/docs/getting-started/index.md +10 -0
  19. data/docs/getting-started/installing.md +2 -6
  20. data/docs/getting-started/overview.md +486 -0
  21. data/docs/getting-started/tutorial.md +27 -19
  22. data/docs/index.md +6 -2
  23. data/docs/main-concepts/concurrency.md +0 -5
  24. data/docs/main-concepts/design-principles.md +2 -12
  25. data/docs/main-concepts/index.md +9 -0
  26. data/docs/polyphony-logo.png +0 -0
  27. data/examples/adapters/concurrent-ruby.rb +9 -0
  28. data/examples/adapters/redis_blpop.rb +12 -0
  29. data/examples/core/01-spinning-up-fibers.rb +1 -0
  30. data/examples/core/03-interrupting.rb +4 -1
  31. data/examples/core/04-handling-signals.rb +19 -0
  32. data/examples/core/xx-daemon.rb +14 -0
  33. data/examples/performance/thread-vs-fiber/polyphony_server.rb +6 -18
  34. data/examples/performance/thread-vs-fiber/polyphony_server_read_loop.rb +58 -0
  35. data/examples/performance/xx-array.rb +11 -0
  36. data/examples/performance/xx-fiber-switch.rb +9 -0
  37. data/examples/performance/xx-snooze.rb +15 -0
  38. data/ext/polyphony/fiber.c +0 -3
  39. data/ext/polyphony/libev_agent.c +303 -81
  40. data/ext/polyphony/libev_queue.c +8 -5
  41. data/ext/polyphony/polyphony.c +0 -16
  42. data/ext/polyphony/polyphony.h +6 -6
  43. data/ext/polyphony/polyphony_ext.c +0 -2
  44. data/ext/polyphony/thread.c +8 -42
  45. data/lib/polyphony.rb +29 -2
  46. data/lib/polyphony/adapters/redis.rb +3 -2
  47. data/lib/polyphony/core/channel.rb +2 -2
  48. data/lib/polyphony/core/global_api.rb +6 -4
  49. data/lib/polyphony/core/resource_pool.rb +19 -9
  50. data/lib/polyphony/extensions/core.rb +8 -3
  51. data/lib/polyphony/extensions/fiber.rb +0 -12
  52. data/lib/polyphony/extensions/io.rb +4 -0
  53. data/lib/polyphony/extensions/openssl.rb +34 -10
  54. data/lib/polyphony/extensions/socket.rb +2 -2
  55. data/lib/polyphony/version.rb +1 -1
  56. data/polyphony.gemspec +1 -1
  57. data/test/test_agent.rb +59 -6
  58. data/test/test_fiber.rb +3 -3
  59. data/test/test_global_api.rb +48 -15
  60. data/test/test_resource_pool.rb +12 -0
  61. data/test/test_socket.rb +5 -4
  62. data/test/test_throttler.rb +6 -5
  63. metadata +21 -21
  64. data/docs/_includes/head.html +0 -40
  65. data/docs/_includes/nav.html +0 -51
  66. data/docs/_includes/prevnext.html +0 -17
  67. data/docs/_layouts/default.html +0 -106
  68. data/docs/api-reference.md +0 -11
  69. data/docs/api-reference/gyro-async.md +0 -57
  70. data/docs/api-reference/gyro-child.md +0 -29
  71. data/docs/api-reference/gyro-queue.md +0 -44
  72. data/docs/api-reference/gyro-timer.md +0 -51
  73. data/docs/api-reference/gyro.md +0 -25
  74. data/docs/getting-started.md +0 -10
  75. data/docs/main-concepts.md +0 -10
  76. data/docs/user-guide.md +0 -10
  77. data/examples/core/forever_sleep.rb +0 -19
  78. 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
- def sysread(maxlen, buf)
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 result
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 syswrite(buf)
41
- loop do
42
- case (result = write_nonblock(buf, exception: false))
43
- when :wait_readable then Thread.current.agent.wait_io(io, false)
44
- when :wait_writable then Thread.current.agent.wait_io(io, true)
45
- else result
46
- end
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 ? @io.accept : orig_accept
131
+ @io.accept
132
132
  end
133
133
 
134
134
  alias_method :orig_close, :close
135
135
  def close
136
- @io ? @io.close : orig_close
136
+ @io.close
137
137
  end
138
138
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Polyphony
4
- VERSION = '0.41'
4
+ VERSION = '0.43.3'
5
5
  end
@@ -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.2.7'
39
+ s.add_development_dependency 'just-the-docs', '~>0.3.0'
40
40
  end
@@ -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
- suspend
23
- assert Time.now - t0 >= 0.01
24
- assert_equal 1, count
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
- Thread.current.agent.post_fork
76
+ @agent.post_fork
71
77
  exit(42)
72
78
  end
73
79
 
74
- result = Thread.current.agent.waitpid(pid)
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
@@ -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.01; buffer << :foo; :foo }
486
- f2 = spin { sleep 0.03; buffer << :bar; :bar }
487
- f3 = spin { sleep 0.05; buffer << :baz; :baz }
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
@@ -106,7 +106,7 @@ class MoveOnAfterTest < MiniTest::Test
106
106
  end
107
107
  t1 = Time.now
108
108
 
109
- assert t1 - t0 < 0.03
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.02
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.02
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.02
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.02
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
- f = spin_loop(rate: 50) { buffer << (counter += 1) }
228
+ t0 = Time.now
229
+ f = spin_loop(rate: 10) { buffer << (counter += 1) }
205
230
  sleep 0.2
206
231
  f.stop
207
- assert counter >= 9 && counter <= 11
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(50) { buffer << (counter += 1) }
244
+ throttled_loop(10) { buffer << (counter += 1) }
217
245
  end
218
- sleep 0.2
246
+ sleep 0.3
219
247
  f.stop
220
- assert counter >= 9 && counter <= 11
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.01) { buffer << 1 }
278
+ every(0.1) { buffer << 1 }
248
279
  end
249
- sleep 0.05
280
+ sleep 0.5
250
281
  f.stop
251
- assert (4..5).include?(buffer.size)
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.05
289
+ sleep 0.1
257
290
  elapsed = Time.now - t0
258
- assert (0.045..0.08).include? elapsed
291
+ assert (0.05..0.15).include? elapsed
259
292
 
260
293
  f = spin { sleep }
261
294
  snooze
@@ -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
@@ -8,7 +8,8 @@ class SocketTest < MiniTest::Test
8
8
  end
9
9
 
10
10
  def test_tcp
11
- server = TCPServer.new('127.0.0.1', 1234)
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', 1234)
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.stop
30
- snooze
30
+ server_fiber&.stop
31
+ server_fiber&.await
31
32
  server&.close
32
33
  end
33
34
  end
@@ -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(100)
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.02
11
+ sleep 0.2
11
12
  f.stop
12
- snooze
13
- assert buffer.size >= 2
14
- assert buffer.size <= 3
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: '0.41'
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-06-27 00:00:00.000000000 Z
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.2.7
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.2.7
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/api-reference.md
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/gyro-async.md
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/getting-started.md
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/user-guide.md
287
- - docs/user-guide/all-about-timers.md
288
- - docs/user-guide/web-server.md
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/forever_sleep.rb
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