polyphony 0.19 → 0.20

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 (186) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -1
  3. data/.rubocop.yml +87 -1
  4. data/CHANGELOG.md +35 -0
  5. data/Gemfile.lock +17 -6
  6. data/README.md +200 -139
  7. data/Rakefile +4 -4
  8. data/TODO.md +35 -7
  9. data/bin/poly +11 -0
  10. data/docs/getting-started/getting-started.md +1 -1
  11. data/docs/summary.md +3 -0
  12. data/docs/technical-overview/exception-handling.md +94 -0
  13. data/docs/technical-overview/fiber-scheduling.md +99 -0
  14. data/examples/core/cancel.rb +8 -4
  15. data/examples/core/channel_echo.rb +18 -17
  16. data/examples/core/defer.rb +12 -0
  17. data/examples/core/enumerator.rb +4 -4
  18. data/examples/core/fiber_error.rb +9 -0
  19. data/examples/core/fiber_error_with_backtrace.rb +73 -0
  20. data/examples/core/fork.rb +6 -6
  21. data/examples/core/genserver.rb +16 -8
  22. data/examples/core/lock.rb +3 -3
  23. data/examples/core/move_on.rb +4 -3
  24. data/examples/core/move_on_twice.rb +5 -5
  25. data/examples/core/move_on_with_ensure.rb +8 -11
  26. data/examples/core/move_on_with_value.rb +14 -0
  27. data/examples/core/{multiple_spawn.rb → multiple_spin.rb} +5 -5
  28. data/examples/core/nested_cancel.rb +5 -5
  29. data/examples/core/{nested_multiple_spawn.rb → nested_multiple_spin.rb} +6 -6
  30. data/examples/core/nested_spin.rb +17 -0
  31. data/examples/core/pingpong.rb +21 -0
  32. data/examples/core/pulse.rb +4 -5
  33. data/examples/core/resource.rb +6 -4
  34. data/examples/core/resource_cancel.rb +6 -9
  35. data/examples/core/resource_delegate.rb +3 -3
  36. data/examples/core/sleep.rb +3 -3
  37. data/examples/core/sleep_spin.rb +19 -0
  38. data/examples/core/snooze.rb +32 -0
  39. data/examples/core/spin.rb +14 -0
  40. data/examples/core/{spawn_cancel.rb → spin_cancel.rb} +6 -7
  41. data/examples/core/spin_error.rb +17 -0
  42. data/examples/core/spin_error_backtrace.rb +30 -0
  43. data/examples/core/spin_uncaught_error.rb +15 -0
  44. data/examples/core/supervisor.rb +8 -8
  45. data/examples/core/supervisor_with_cancel_scope.rb +7 -7
  46. data/examples/core/supervisor_with_error.rb +8 -8
  47. data/examples/core/supervisor_with_manual_move_on.rb +6 -7
  48. data/examples/core/suspend.rb +13 -0
  49. data/examples/core/thread.rb +1 -1
  50. data/examples/core/thread_cancel.rb +9 -11
  51. data/examples/core/thread_pool.rb +18 -14
  52. data/examples/core/throttle.rb +7 -7
  53. data/examples/core/timeout.rb +3 -3
  54. data/examples/fs/read.rb +7 -9
  55. data/examples/http/config.ru +7 -3
  56. data/examples/http/cuba.ru +22 -0
  57. data/examples/http/happy_eyeballs.rb +6 -4
  58. data/examples/http/http_client.rb +1 -1
  59. data/examples/http/http_get.rb +1 -1
  60. data/examples/http/http_parse_experiment.rb +21 -16
  61. data/examples/http/http_proxy.rb +28 -26
  62. data/examples/http/http_server.rb +10 -10
  63. data/examples/http/http_server_forked.rb +6 -5
  64. data/examples/http/http_server_throttled.rb +3 -3
  65. data/examples/http/http_ws_server.rb +11 -11
  66. data/examples/http/https_raw_client.rb +1 -1
  67. data/examples/http/https_server.rb +8 -8
  68. data/examples/http/https_wss_server.rb +13 -11
  69. data/examples/http/rack_server.rb +2 -2
  70. data/examples/http/rack_server_https.rb +4 -4
  71. data/examples/http/rack_server_https_forked.rb +5 -5
  72. data/examples/http/websocket_secure_server.rb +6 -6
  73. data/examples/http/websocket_server.rb +5 -5
  74. data/examples/interfaces/pg_client.rb +4 -4
  75. data/examples/interfaces/pg_pool.rb +13 -6
  76. data/examples/interfaces/pg_transaction.rb +5 -4
  77. data/examples/interfaces/redis_channels.rb +15 -11
  78. data/examples/interfaces/redis_client.rb +2 -2
  79. data/examples/interfaces/redis_pubsub.rb +2 -1
  80. data/examples/interfaces/redis_pubsub_perf.rb +13 -9
  81. data/examples/io/backticks.rb +11 -0
  82. data/examples/io/cat.rb +4 -5
  83. data/examples/io/echo_client.rb +9 -4
  84. data/examples/io/echo_client_from_stdin.rb +20 -0
  85. data/examples/io/echo_pipe.rb +7 -8
  86. data/examples/io/echo_server.rb +8 -6
  87. data/examples/io/echo_server_with_timeout.rb +13 -10
  88. data/examples/io/echo_stdin.rb +3 -3
  89. data/examples/io/httparty.rb +2 -2
  90. data/examples/io/httparty_multi.rb +8 -4
  91. data/examples/io/httparty_threaded.rb +6 -2
  92. data/examples/io/io_read.rb +2 -2
  93. data/examples/io/irb.rb +16 -4
  94. data/examples/io/net-http.rb +3 -3
  95. data/examples/io/open.rb +17 -0
  96. data/examples/io/system.rb +3 -3
  97. data/examples/io/tcpserver.rb +15 -0
  98. data/examples/io/tcpsocket.rb +6 -5
  99. data/examples/performance/multi_snooze.rb +29 -0
  100. data/examples/performance/{perf_snooze.rb → snooze.rb} +7 -5
  101. data/examples/performance/snooze_raw.rb +39 -0
  102. data/ext/gyro/async.c +165 -0
  103. data/ext/gyro/child.c +167 -0
  104. data/ext/{ev → gyro}/extconf.rb +4 -3
  105. data/ext/gyro/gyro.c +316 -0
  106. data/ext/{ev/ev.h → gyro/gyro.h} +12 -7
  107. data/ext/gyro/gyro_ext.c +23 -0
  108. data/ext/{ev → gyro}/io.c +65 -57
  109. data/ext/{ev → gyro}/libev.h +0 -0
  110. data/ext/gyro/signal.c +117 -0
  111. data/ext/{ev → gyro}/socket.c +61 -6
  112. data/ext/gyro/timer.c +199 -0
  113. data/ext/libev/Changes +35 -0
  114. data/ext/libev/README +2 -1
  115. data/ext/libev/ev.c +213 -151
  116. data/ext/libev/ev.h +95 -88
  117. data/ext/libev/ev_epoll.c +26 -15
  118. data/ext/libev/ev_kqueue.c +11 -5
  119. data/ext/libev/ev_linuxaio.c +642 -0
  120. data/ext/libev/ev_poll.c +13 -8
  121. data/ext/libev/ev_port.c +5 -2
  122. data/ext/libev/ev_vars.h +14 -3
  123. data/ext/libev/ev_wrap.h +16 -0
  124. data/lib/ev_ext.bundle +0 -0
  125. data/lib/polyphony.rb +46 -50
  126. data/lib/polyphony/auto_run.rb +12 -0
  127. data/lib/polyphony/core/cancel_scope.rb +11 -7
  128. data/lib/polyphony/core/channel.rb +16 -9
  129. data/lib/polyphony/core/coprocess.rb +101 -51
  130. data/lib/polyphony/core/exceptions.rb +14 -12
  131. data/lib/polyphony/core/resource_pool.rb +21 -8
  132. data/lib/polyphony/core/supervisor.rb +10 -5
  133. data/lib/polyphony/core/sync.rb +7 -6
  134. data/lib/polyphony/core/thread.rb +4 -4
  135. data/lib/polyphony/core/thread_pool.rb +4 -4
  136. data/lib/polyphony/core/throttler.rb +6 -4
  137. data/lib/polyphony/extensions/core.rb +253 -0
  138. data/lib/polyphony/extensions/io.rb +28 -16
  139. data/lib/polyphony/extensions/openssl.rb +2 -1
  140. data/lib/polyphony/extensions/socket.rb +47 -52
  141. data/lib/polyphony/http.rb +4 -3
  142. data/lib/polyphony/http/agent.rb +68 -57
  143. data/lib/polyphony/http/server.rb +5 -5
  144. data/lib/polyphony/http/server/http1.rb +268 -0
  145. data/lib/polyphony/http/server/http2.rb +62 -0
  146. data/lib/polyphony/http/server/http2_stream.rb +104 -0
  147. data/lib/polyphony/http/server/rack.rb +64 -0
  148. data/lib/polyphony/http/server/request.rb +119 -0
  149. data/lib/polyphony/net.rb +26 -15
  150. data/lib/polyphony/postgres.rb +17 -13
  151. data/lib/polyphony/redis.rb +16 -15
  152. data/lib/polyphony/version.rb +1 -1
  153. data/lib/polyphony/websocket.rb +11 -4
  154. data/polyphony.gemspec +13 -9
  155. data/test/eg.rb +27 -0
  156. data/test/helper.rb +25 -0
  157. data/test/run.rb +5 -0
  158. data/test/test_async.rb +33 -0
  159. data/test/test_coprocess.rb +239 -77
  160. data/test/test_core.rb +95 -61
  161. data/test/test_gyro.rb +148 -0
  162. data/test/test_http_server.rb +313 -0
  163. data/test/test_io.rb +79 -27
  164. data/test/test_kernel.rb +22 -12
  165. data/test/test_signal.rb +36 -0
  166. data/test/test_timer.rb +24 -0
  167. metadata +89 -33
  168. data/examples/core/nested_async.rb +0 -17
  169. data/examples/core/next_tick.rb +0 -12
  170. data/examples/core/sleep_spawn.rb +0 -19
  171. data/examples/core/spawn.rb +0 -14
  172. data/examples/core/spawn_error.rb +0 -28
  173. data/examples/performance/perf_multi_snooze.rb +0 -21
  174. data/ext/ev/async.c +0 -168
  175. data/ext/ev/child.c +0 -169
  176. data/ext/ev/ev_ext.c +0 -23
  177. data/ext/ev/ev_module.c +0 -242
  178. data/ext/ev/signal.c +0 -119
  179. data/ext/ev/timer.c +0 -197
  180. data/lib/polyphony/core/fiber_pool.rb +0 -98
  181. data/lib/polyphony/extensions/kernel.rb +0 -169
  182. data/lib/polyphony/http/http1_adapter.rb +0 -254
  183. data/lib/polyphony/http/http2_adapter.rb +0 -157
  184. data/lib/polyphony/http/rack.rb +0 -25
  185. data/lib/polyphony/http/request.rb +0 -66
  186. data/test/test_ev.rb +0 -110
@@ -7,6 +7,6 @@ app_path = ARGV.first || File.expand_path('./config.ru', __dir__)
7
7
  app = Polyphony::HTTP::Rack.load(app_path)
8
8
  opts = { reuse_addr: true, dont_linger: true }
9
9
 
10
- puts "listening on port 1234"
10
+ puts 'listening on port 1234'
11
11
  puts "pid: #{Process.pid}"
12
- Polyphony::HTTP::Server.serve('0.0.0.0', 1234, opts, &app)
12
+ Polyphony::HTTP::Server.serve('0.0.0.0', 1234, opts, &app)
@@ -9,11 +9,11 @@ app = Polyphony::HTTP::Rack.load(app_path)
9
9
 
10
10
  authority = Localhost::Authority.fetch
11
11
  opts = {
12
- reuse_addr: true,
13
- dont_linger: true,
12
+ reuse_addr: true,
13
+ dont_linger: true,
14
14
  secure_context: authority.server_context
15
15
  }
16
16
 
17
- puts "listening on port 1234"
17
+ puts 'listening on port 1234'
18
18
  puts "pid: #{Process.pid}"
19
- Polyphony::HTTP::Server.serve('0.0.0.0', 1234, opts, &app)
19
+ Polyphony::HTTP::Server.serve('0.0.0.0', 1234, opts, &app)
@@ -9,19 +9,19 @@ app = Polyphony::HTTP::Rack.load(app_path)
9
9
 
10
10
  authority = Localhost::Authority.fetch
11
11
  opts = {
12
- reuse_addr: true,
13
- dont_linger: true,
12
+ reuse_addr: true,
13
+ dont_linger: true,
14
14
  secure_context: authority.server_context
15
15
  }
16
16
  server = Polyphony::HTTP::Server.listen('0.0.0.0', 1234, opts)
17
- puts "Listening on port 1234"
17
+ puts 'Listening on port 1234'
18
18
 
19
19
  child_pids = []
20
20
  4.times do
21
21
  child_pids << Polyphony.fork do
22
22
  puts "forked pid: #{Process.pid}"
23
- Polyphony::HTTP::Server.each(server, opts, &app)
23
+ server.each(&app)
24
24
  end
25
25
  end
26
26
 
27
- child_pids.each { |pid| EV::Child.new(pid).await }
27
+ child_pids.each { |pid| EV::Child.new(pid).await }
@@ -7,23 +7,23 @@ require 'localhost/authority'
7
7
  STDOUT.sync = true
8
8
 
9
9
  def ws_handler(conn)
10
- while msg = conn.recv
10
+ while (msg = conn.recv)
11
11
  conn << "you said: #{msg}"
12
12
  end
13
13
  end
14
14
 
15
15
  authority = Localhost::Authority.fetch
16
16
  opts = {
17
- reuse_addr: true,
18
- dont_linger: true,
19
- upgrade: {
17
+ reuse_addr: true,
18
+ dont_linger: true,
19
+ upgrade: {
20
20
  websocket: Polyphony::Websocket.handler(&method(:ws_handler))
21
21
  },
22
22
  secure_context: authority.server_context
23
23
  }
24
24
 
25
25
  puts "pid: #{Process.pid}"
26
- puts "Listening on port 1234..."
26
+ puts 'Listening on port 1234...'
27
27
  Polyphony::HTTP::Server.serve('0.0.0.0', 1234, opts) do |req|
28
28
  req.respond("Hello world!\n")
29
- end
29
+ end
@@ -6,21 +6,21 @@ require 'polyphony/http'
6
6
  STDOUT.sync = true
7
7
 
8
8
  def ws_handler(conn)
9
- while msg = conn.recv
9
+ while (msg = conn.recv)
10
10
  conn << "you said: #{msg}"
11
11
  end
12
12
  end
13
13
 
14
14
  opts = {
15
- reuse_addr: true,
15
+ reuse_addr: true,
16
16
  dont_linger: true,
17
- upgrade: {
17
+ upgrade: {
18
18
  websocket: Polyphony::Websocket.handler(&method(:ws_handler))
19
19
  }
20
20
  }
21
21
 
22
22
  puts "pid: #{Process.pid}"
23
- puts "Listening on port 1234..."
23
+ puts 'Listening on port 1234...'
24
24
  Polyphony::HTTP::Server.serve('0.0.0.0', 1234, opts) do |req|
25
25
  req.respond("Hello world!\n")
26
- end
26
+ end
@@ -4,9 +4,9 @@ require 'bundler/setup'
4
4
  require 'polyphony/postgres'
5
5
 
6
6
  def get_records
7
- res = $db.query("select 1 as test")
7
+ $db.query('select 1 as test')
8
8
  # puts "got #{res.ntuples} records: #{res.to_a}"
9
- rescue => e
9
+ rescue StandardError => e
10
10
  puts "got error: #{e.inspect}"
11
11
  puts e.backtrace.join("\n")
12
12
  end
@@ -28,9 +28,9 @@ $db = PG.connect(
28
28
  sslmode: 'require'
29
29
  )
30
30
 
31
- X = 10000
31
+ X = 10_000
32
32
  t0 = Time.now
33
33
  X.times { get_records }
34
34
  puts "query rate: #{X / (Time.now - t0)} reqs/s"
35
35
 
36
- time_printer.stop
36
+ time_printer.stop
@@ -9,14 +9,14 @@ PGOPTS = {
9
9
  password: nil,
10
10
  dbname: 'reality',
11
11
  sslmode: 'require'
12
- }
12
+ }.freeze
13
13
 
14
14
  DBPOOL = Polyphony::ResourcePool.new(limit: 8) { PG.connect(PGOPTS) }
15
15
 
16
16
  def get_records(db)
17
- res = db.query("select pg_sleep(0.001) as test")
17
+ db.query('select pg_sleep(0.001) as test')
18
18
  # puts "got #{res.ntuples} records: #{res.to_a}"
19
- rescue => e
19
+ rescue StandardError => e
20
20
  puts "got error: #{e.inspect}"
21
21
  puts e.backtrace.join("\n")
22
22
  end
@@ -27,9 +27,16 @@ puts "concurrency: #{CONCURRENCY}"
27
27
  DBPOOL.preheat!
28
28
  t0 = Time.now
29
29
  count = 0
30
- coprocs = CONCURRENCY.times.map {
31
- spin { loop { DBPOOL.acquire { |db| get_records(db); count += 1 } } }
32
- }
30
+ coprocs = CONCURRENCY.times.map do
31
+ spin do
32
+ loop do
33
+ DBPOOL.acquire do |db|
34
+ get_records(db)
35
+ count += 1
36
+ end
37
+ end
38
+ end
39
+ end
33
40
  sleep 5
34
41
  puts "count: #{count} query rate: #{count / (Time.now - t0)} queries/s"
35
42
  coprocs.each(&:interrupt)
@@ -12,17 +12,18 @@ DB = PG.connect(
12
12
  )
13
13
 
14
14
  def perform(error)
15
- puts "*" * 40
15
+ puts '*' * 40
16
16
  DB.transaction do
17
- res = DB.query("select 1 as test")
17
+ res = DB.query('select 1 as test')
18
18
  puts "result: #{res.to_a}"
19
19
  raise 'hello' if error
20
+
20
21
  DB.transaction do
21
- res = DB.query("select 2 as test")
22
+ res = DB.query('select 2 as test')
22
23
  puts "result: #{res.to_a}"
23
24
  end
24
25
  end
25
- rescue => e
26
+ rescue StandardError => e
26
27
  puts "error: #{e.inspect}"
27
28
  end
28
29
 
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'bundler/setup'
4
+ require 'polyphony/auto_run'
4
5
  require 'polyphony/redis'
5
6
 
6
7
  class RedisChannel < Polyphony::Channel
@@ -20,8 +21,11 @@ class RedisChannel < Polyphony::Channel
20
21
  subscribe_connection.subscribe(CHANNEL_MASTER_TOPIC) do |on|
21
22
  on.message do |topic, message|
22
23
  message = Marshal.load(message)
23
- topic == CHANNEL_MASTER_TOPIC ? handle_master_message(message) :
24
- handle_channel_message(topic, message)
24
+ topic == if CHANNEL_MASTER_TOPIC
25
+ handle_master_message(message)
26
+ else
27
+ handle_channel_message(topic, message)
28
+ end
25
29
  end
26
30
  end
27
31
  end
@@ -48,20 +52,20 @@ class RedisChannel < Polyphony::Channel
48
52
  def self.watch(channel)
49
53
  @channels[channel.topic] = channel
50
54
  spin do
51
- publish_connection.publish(CHANNEL_MASTER_TOPIC, Marshal.dump({
52
- kind: :subscribe,
53
- topic: channel.topic
54
- }))
55
+ publish_connection.publish(CHANNEL_MASTER_TOPIC, Marshal.dump(
56
+ kind: :subscribe,
57
+ topic: channel.topic
58
+ ))
55
59
  end
56
60
  end
57
61
 
58
62
  def self.unwatch(channel)
59
63
  @channels.delete(channel.topic)
60
64
  spin do
61
- publish_connection.publish(CHANNEL_MASTER_TOPIC, Marshal.dump({
62
- kind: :unsubscribe,
63
- topic: channel.topic
64
- }))
65
+ publish_connection.publish(CHANNEL_MASTER_TOPIC, Marshal.dump(
66
+ kind: :unsubscribe,
67
+ topic: channel.topic
68
+ ))
65
69
  end
66
70
  end
67
71
 
@@ -114,4 +118,4 @@ spin do
114
118
  end
115
119
  channel.close
116
120
  RedisChannel.stop_monitor
117
- end
121
+ end
@@ -5,7 +5,7 @@ require 'polyphony/redis'
5
5
 
6
6
  redis = Redis.new
7
7
 
8
- X = 10000
8
+ X = 10
9
9
 
10
10
  t0 = Time.now
11
11
  X.times { redis.get('abc') }
@@ -13,7 +13,7 @@ puts "get rate: #{X / (Time.now - t0)} reqs/s"
13
13
 
14
14
  puts "abc = #{redis.get('abc')}"
15
15
 
16
- puts "updating value..."
16
+ puts 'updating value...'
17
17
  redis.set('abc', Time.now.to_s)
18
18
 
19
19
  puts "abc = #{redis.get('abc')}"
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'bundler/setup'
4
+ require 'polyphony/auto_run'
4
5
  require 'polyphony/redis'
5
6
 
6
7
  spin do
@@ -8,7 +9,7 @@ spin do
8
9
  redis.subscribe('redis-channel') do |on|
9
10
  on.message do |channel, message|
10
11
  puts "##{channel}: #{message}"
11
- redis.unsubscribe if message == "exit"
12
+ redis.unsubscribe if message == 'exit'
12
13
  end
13
14
  end
14
15
  end
@@ -1,19 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'bundler/setup'
4
+ require 'polyphony/auto_run'
4
5
  require 'polyphony/redis'
5
6
  require 'json'
6
7
 
7
8
  X_SESSIONS = 1000
8
- X_NODES = 10000
9
+ X_NODES = 10_000
9
10
  X_SUBSCRIPTIONS_PER_SESSION = 100
10
11
 
11
12
  $sessions = []
12
13
  X_SESSIONS.times do
13
14
  $sessions << {
14
- subscriptions: X_SUBSCRIPTIONS_PER_SESSION.times.map {
15
+ subscriptions: X_SUBSCRIPTIONS_PER_SESSION.times.map do
15
16
  "node#{rand(X_NODES)}"
16
- }.uniq
17
+ end.uniq
17
18
  }
18
19
  end
19
20
 
@@ -30,20 +31,20 @@ $update_count = 0
30
31
 
31
32
  def distribute_event(event)
32
33
  $update_count += 1
33
- t0 = Time.now
34
+ # t0 = Time.now
34
35
  count = 0
35
36
  $sessions.each do |s|
36
37
  count += 1 if s[:subscriptions].include?(event[:path])
37
38
  end
38
- elapsed = Time.now - t0
39
- rate = X_SESSIONS / elapsed
39
+ # elapsed = Time.now - t0
40
+ # rate = X_SESSIONS / elapsed
40
41
  # puts "elapsed: #{elapsed} (#{rate}/s)" if $update_count % 100 == 0
41
42
  end
42
43
 
43
44
  spin do
44
45
  redis = Redis.new
45
46
  throttled_loop(1000) do
46
- redis.publish('events', {path: "node#{rand(X_NODES)}"}.to_json)
47
+ redis.publish('events', { path: "node#{rand(X_NODES)}" }.to_json)
47
48
  end
48
49
  end
49
50
 
@@ -54,10 +55,13 @@ spin do
54
55
  now = Time.now
55
56
  elapsed = now - last_stamp
56
57
  delta = $update_count - last_count
57
- puts "update rate: #{delta.to_f/elapsed}"
58
+ puts "update rate: #{delta.to_f / elapsed}"
58
59
  last_stamp = now
59
60
  last_count = $update_count
60
61
  end
61
62
  end
62
63
 
63
- Polyphony.trap(:int) { puts "bye..."; exit! }
64
+ Polyphony.trap(:int) do
65
+ puts 'bye...'
66
+ exit!
67
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/setup'
4
+ require 'polyphony/auto_run'
5
+
6
+ timer = spin do
7
+ throttled_loop(5) { STDOUT << '.' }
8
+ end
9
+
10
+ puts `ruby -e "sleep 1; puts :done; STDOUT.close"`
11
+ timer.stop
data/examples/io/cat.rb CHANGED
@@ -1,13 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'bundler/setup'
4
- require 'polyphony'
4
+ require 'polyphony/auto_run'
5
5
 
6
- f = File.open(__FILE__, 'r') do |f|
6
+ File.open(__FILE__, 'r') do |f|
7
7
  line_number = 1
8
8
  while (l = f.gets)
9
- puts "encoding: #{l.encoding.inspect}"
10
- STDOUT.puts '%03d %s' % [line_number, l]
9
+ puts format('%03d %s', line_number, l)
11
10
  line_number += 1
12
11
  end
13
- end
12
+ end
@@ -1,17 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'bundler/setup'
4
- require 'polyphony'
4
+ require 'polyphony/auto_run'
5
+ require 'polyphony/extensions/backtrace'
5
6
 
6
7
  socket = Polyphony::Net.tcp_connect('127.0.0.1', 1234)
7
8
 
8
9
  writer = spin do
9
- throttled_loop(1) { socket << "#{Time.now}\n" rescue nil }
10
+ throttled_loop(1) do
11
+ socket << "#{Time.now}\n"
12
+ rescue StandardError
13
+ nil
14
+ end
10
15
  end
11
16
 
12
17
  reader = spin do
13
- puts "received from echo server:"
14
- while data = socket.readpartial(8192)
18
+ puts 'received from echo server:'
19
+ while (data = socket.readpartial(8192))
15
20
  STDOUT << data
16
21
  end
17
22
  end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/setup'
4
+ require 'polyphony/auto_run'
5
+ require 'polyphony/extensions/backtrace'
6
+
7
+ socket = Polyphony::Net.tcp_connect('127.0.0.1', 1234)
8
+
9
+ writer = spin do
10
+ while (data = gets)
11
+ socket << data
12
+ end
13
+ end
14
+
15
+ spin do
16
+ while (data = socket.readpartial(8192))
17
+ STDOUT << 'received: ' + data
18
+ end
19
+ writer.interrupt
20
+ end
@@ -1,17 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'bundler/setup'
4
- require 'polyphony'
4
+ require 'polyphony/auto_run'
5
5
 
6
6
  i, o = IO.pipe
7
7
 
8
- puts "Write something:"
9
- spin {
10
- throttled_loop(1, count: 3) { o << STDIN.gets }
8
+ puts 'Say something:'
9
+ spin do
10
+ loop { o << STDIN.gets }
11
11
  o.close
12
- }
13
-
14
- while data = i.readpartial(8192)
15
- STDOUT << "You wrote: #{data}"
16
12
  end
17
13
 
14
+ while (data = i.readpartial(8192))
15
+ STDOUT << "You said: #{data}"
16
+ end