polyphony 0.15 → 0.16
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 +6 -0
- data/Gemfile.lock +11 -3
- data/TODO.md +25 -14
- data/docs/getting-started/getting-started.md +1 -1
- data/docs/getting-started/tutorial.md +2 -0
- data/examples/core/cancel.rb +2 -3
- data/examples/core/channel_echo.rb +2 -3
- data/examples/core/enumerator.rb +2 -3
- data/examples/core/fork.rb +2 -2
- data/examples/core/genserver.rb +2 -3
- data/examples/core/lock.rb +2 -3
- data/examples/core/move_on.rb +2 -3
- data/examples/core/move_on_twice.rb +2 -3
- data/examples/core/move_on_with_ensure.rb +2 -3
- data/examples/core/{multiple_async.rb → multiple_spawn.rb} +2 -3
- data/examples/core/nested_async.rb +2 -3
- data/examples/core/nested_cancel.rb +2 -3
- data/examples/core/{nested_multiple_async.rb → nested_multiple_spawn.rb} +2 -3
- data/examples/core/next_tick.rb +4 -5
- data/examples/core/pulse.rb +2 -3
- data/examples/core/resource.rb +2 -3
- data/examples/core/resource_cancel.rb +2 -3
- data/examples/core/resource_delegate.rb +2 -3
- data/examples/core/sleep.rb +2 -3
- data/examples/core/sleep_spawn.rb +19 -0
- data/examples/core/spawn.rb +2 -3
- data/examples/core/spawn_cancel.rb +2 -3
- data/examples/core/spawn_error.rb +2 -2
- data/examples/core/supervisor.rb +2 -3
- data/examples/core/supervisor_with_cancel_scope.rb +2 -3
- data/examples/core/supervisor_with_error.rb +2 -3
- data/examples/core/supervisor_with_manual_move_on.rb +2 -3
- data/examples/core/thread.rb +3 -6
- data/examples/core/thread_cancel.rb +2 -5
- data/examples/core/thread_pool.rb +3 -6
- data/examples/core/throttle.rb +2 -3
- data/examples/fs/read.rb +22 -19
- data/examples/http/happy_eyeballs.rb +2 -2
- data/examples/http/http_client.rb +5 -7
- data/examples/http/http_server.rb +2 -3
- data/examples/http/http_server_forked.rb +2 -3
- data/examples/http/http_server_throttled.rb +2 -3
- data/examples/http/http_ws_server.rb +4 -4
- data/examples/http/https_raw_client.rb +4 -5
- data/examples/http/https_server.rb +2 -3
- data/examples/http/https_wss_server.rb +2 -3
- data/examples/http/rack_server.rb +2 -4
- data/examples/http/rack_server_https.rb +2 -3
- data/examples/http/rack_server_https_forked.rb +2 -3
- data/examples/http/websocket_secure_server.rb +2 -3
- data/examples/http/websocket_server.rb +2 -3
- data/examples/interfaces/pg_client.rb +2 -4
- data/examples/interfaces/pg_pool.rb +4 -6
- data/examples/interfaces/{pg_query.rb → pg_transaction.rb} +2 -4
- data/examples/interfaces/redis_channels.rb +2 -4
- data/examples/interfaces/redis_client.rb +2 -4
- data/examples/interfaces/redis_pubsub.rb +2 -4
- data/examples/interfaces/redis_pubsub_perf.rb +2 -4
- data/examples/io/echo_client.rb +4 -5
- data/examples/io/echo_server.rb +2 -2
- data/examples/io/echo_server_with_timeout.rb +3 -5
- data/examples/io/echo_stdin.rb +3 -4
- data/examples/performance/perf_multi_snooze.rb +2 -2
- data/examples/performance/perf_snooze.rb +2 -2
- data/examples/performance/thread-vs-fiber/polyphony_server.rb +4 -5
- data/ext/ev/ev_module.c +3 -2
- data/lib/polyphony/{resource_pool.rb → core/resource_pool.rb} +0 -0
- data/lib/polyphony/core/supervisor.rb +8 -8
- data/lib/polyphony/extensions/{ssl.rb → openssl.rb} +0 -0
- data/lib/polyphony/http/agent.rb +1 -1
- data/lib/polyphony/http.rb +12 -4
- data/lib/polyphony/net.rb +8 -11
- data/lib/polyphony/{extensions/postgres.rb → postgres.rb} +1 -4
- data/lib/polyphony/{extensions/redis.rb → redis.rb} +3 -6
- data/lib/polyphony/version.rb +1 -1
- data/lib/polyphony/websocket.rb +1 -1
- data/lib/polyphony.rb +57 -21
- data/polyphony.gemspec +5 -4
- data/test/test_coprocess.rb +88 -15
- data/test/test_core.rb +142 -232
- data/test/test_ev.rb +88 -95
- data/test/test_io.rb +35 -41
- metadata +68 -16
- data/examples/core/sleep2.rb +0 -13
- data/examples/streams/lines.rb +0 -27
- data/examples/streams/stdio.rb +0 -18
- data/lib/polyphony/core.rb +0 -45
- data/lib/polyphony/server_task.rb +0 -18
data/test/test_ev.rb
CHANGED
@@ -1,117 +1,110 @@
|
|
1
1
|
require 'minitest/autorun'
|
2
|
-
require '
|
2
|
+
require 'bundler/setup'
|
3
|
+
require 'polyphony'
|
3
4
|
|
4
|
-
|
5
|
-
|
5
|
+
class EVRunTest < Minitest::Test
|
6
|
+
def setup
|
7
|
+
EV.rerun
|
8
|
+
end
|
6
9
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
10
|
+
def test_that_run_loop_returns_immediately_if_no_watchers
|
11
|
+
t0 = Time.now
|
12
|
+
suspend
|
13
|
+
t1 = Time.now
|
14
|
+
assert (t1 - t0) < 0.001
|
15
|
+
end
|
16
|
+
end
|
12
17
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
t1 = Time.now
|
17
|
-
assert (t1 - t0) < 0.001
|
18
|
-
end
|
18
|
+
class EVTimerTest < MiniTest::Test
|
19
|
+
def setup
|
20
|
+
EV.rerun
|
19
21
|
end
|
20
22
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
23
|
+
def test_that_one_shot_timer_works
|
24
|
+
count = 0
|
25
|
+
t = EV::Timer.new(0.01, 0)
|
26
|
+
t.start { count += 1}
|
27
|
+
suspend
|
28
|
+
assert_equal(1, count)
|
29
|
+
end
|
26
30
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
31
|
+
def test_that_repeating_timer_works
|
32
|
+
count = 0
|
33
|
+
t = EV::Timer.new(0.001, 0.001)
|
34
|
+
t.start { count += 1; t.stop if count >= 3}
|
35
|
+
suspend
|
36
|
+
assert_equal(3, count)
|
37
|
+
end
|
38
|
+
end
|
34
39
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
t.start { count += 1; t.stop if count >= 3}
|
39
|
-
suspend
|
40
|
-
assert_equal(3, count)
|
41
|
-
end
|
40
|
+
class EVIOTest < MiniTest::Test
|
41
|
+
def setup
|
42
|
+
EV.rerun
|
42
43
|
end
|
43
|
-
|
44
|
-
class IOTest < MiniTest::Test
|
45
|
-
def setup
|
46
|
-
EV.break
|
47
|
-
EV.restart
|
48
|
-
end
|
49
44
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
end
|
58
|
-
EV::Timer.new(0, 0).start { o << 'hello' }
|
59
|
-
suspend
|
60
|
-
assert_equal('hello', data)
|
45
|
+
def test_that_reading_works
|
46
|
+
i, o = IO.pipe
|
47
|
+
data = +''
|
48
|
+
w = EV::IO.new(i, :r)
|
49
|
+
w.start do
|
50
|
+
i.read_nonblock(8192, data)
|
51
|
+
w.stop unless data.empty?
|
61
52
|
end
|
53
|
+
EV::Timer.new(0, 0).start { o << 'hello' }
|
54
|
+
suspend
|
55
|
+
assert_equal('hello', data)
|
62
56
|
end
|
57
|
+
end
|
63
58
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
59
|
+
class EVSignalTest < MiniTest::Test
|
60
|
+
def setup
|
61
|
+
EV.rerun
|
62
|
+
EV.restart
|
63
|
+
end
|
69
64
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
65
|
+
def test_that_signal_watcher_receives_signal
|
66
|
+
sig = Signal.list['USR1']
|
67
|
+
count = 0
|
68
|
+
w = EV::Signal.new(sig) { count += 1; w.stop }
|
69
|
+
Thread.new { sync_sleep 0.001; Process.kill(:USR1, Process.pid) }
|
70
|
+
suspend
|
71
|
+
assert_equal(1, count)
|
72
|
+
end
|
78
73
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
end
|
74
|
+
def test_that_signal_watcher_receives_signal
|
75
|
+
count = 0
|
76
|
+
w = Polyphony.trap(:usr1, true) { count += 1; w.stop }
|
77
|
+
assert_kind_of(EV::Signal, w)
|
78
|
+
Thread.new { sync_sleep 0.001; Process.kill(:USR1, Process.pid) }
|
79
|
+
suspend
|
80
|
+
assert_equal(1, count)
|
87
81
|
end
|
82
|
+
end
|
88
83
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
end
|
84
|
+
class EVAsyncTest < MiniTest::Test
|
85
|
+
def setup
|
86
|
+
EV.rerun
|
87
|
+
end
|
94
88
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
89
|
+
def test_that_async_watcher_receives_signal_across_threads
|
90
|
+
count = 0
|
91
|
+
a = EV::Async.new { count += 1; a.stop }
|
92
|
+
Thread.new { sync_sleep 0.001; a.signal! }
|
93
|
+
suspend
|
94
|
+
assert_equal(1, count)
|
95
|
+
end
|
102
96
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
end
|
113
|
-
suspend
|
114
|
-
assert_equal(1, count)
|
97
|
+
def test_that_async_watcher_coalesces_signals
|
98
|
+
count = 0
|
99
|
+
a = EV::Async.new do
|
100
|
+
count += 1
|
101
|
+
EV::Timer.new(0.01, 0).start { a.stop }
|
102
|
+
end
|
103
|
+
Thread.new do
|
104
|
+
sync_sleep 0.001
|
105
|
+
3.times { a.signal! }
|
115
106
|
end
|
107
|
+
suspend
|
108
|
+
assert_equal(1, count)
|
116
109
|
end
|
117
110
|
end
|
data/test/test_io.rb
CHANGED
@@ -1,48 +1,42 @@
|
|
1
1
|
require 'minitest/autorun'
|
2
|
-
require '
|
2
|
+
require 'bundler/setup'
|
3
|
+
require 'polyphony'
|
3
4
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
def setup
|
10
|
-
EV.rerun
|
11
|
-
@i, @o = IO.pipe
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_that_io_op_yields_to_other_fibers
|
15
|
-
count = 0
|
16
|
-
msg = nil
|
17
|
-
[
|
18
|
-
spawn {
|
19
|
-
@o.write("hello")
|
20
|
-
@o.close
|
21
|
-
},
|
22
|
-
|
23
|
-
spawn {
|
24
|
-
while count < 5
|
25
|
-
sleep 0.01
|
26
|
-
count += 1
|
27
|
-
end
|
28
|
-
},
|
29
|
-
|
30
|
-
spawn {
|
31
|
-
msg = @i.read
|
32
|
-
}
|
33
|
-
].each(&:await)
|
34
|
-
assert_equal(5, count)
|
35
|
-
assert_equal("hello", msg)
|
36
|
-
end
|
5
|
+
class IOTest < MiniTest::Test
|
6
|
+
def setup
|
7
|
+
EV.rerun
|
8
|
+
@i, @o = IO.pipe
|
9
|
+
end
|
37
10
|
|
38
|
-
|
39
|
-
|
11
|
+
def test_that_io_op_yields_to_other_fibers
|
12
|
+
count = 0
|
13
|
+
msg = nil
|
14
|
+
[
|
15
|
+
spawn {
|
16
|
+
@o.write("hello")
|
17
|
+
@o.close
|
18
|
+
},
|
19
|
+
|
20
|
+
spawn {
|
21
|
+
while count < 5
|
22
|
+
sleep 0.01
|
23
|
+
count += 1
|
24
|
+
end
|
25
|
+
},
|
26
|
+
|
27
|
+
spawn {
|
28
|
+
msg = @i.read
|
29
|
+
}
|
30
|
+
].each(&:await)
|
31
|
+
assert_equal(5, count)
|
32
|
+
assert_equal("hello", msg)
|
33
|
+
end
|
40
34
|
|
41
|
-
|
42
|
-
|
43
|
-
assert_equal('foobarbaz', @i.read)
|
44
|
-
end
|
35
|
+
def test_that_double_chevron_method_returns_io
|
36
|
+
assert_equal(@o, @o << 'foo')
|
45
37
|
|
46
|
-
|
38
|
+
@o << 'bar' << 'baz'
|
39
|
+
@o.close
|
40
|
+
assert_equal('foobarbaz', @i.read)
|
47
41
|
end
|
48
42
|
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.
|
4
|
+
version: '0.16'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sharon Rosner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-05-
|
11
|
+
date: 2019-05-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: modulation
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0.
|
19
|
+
version: '0.24'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '0.
|
26
|
+
version: '0.24'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: http_parser.rb
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,6 +94,62 @@ dependencies:
|
|
94
94
|
- - '='
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: 1.1.4
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: websocket
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 1.2.8
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 1.2.8
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: pg
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - '='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 1.1.3
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - '='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 1.1.3
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: redis
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - '='
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 4.1.0
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - '='
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: 4.1.0
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: hiredis
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - '='
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: 0.6.3
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - '='
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: 0.6.3
|
97
153
|
description:
|
98
154
|
email: ciconia@gmail.com
|
99
155
|
executables: []
|
@@ -125,17 +181,17 @@ files:
|
|
125
181
|
- examples/core/move_on.rb
|
126
182
|
- examples/core/move_on_twice.rb
|
127
183
|
- examples/core/move_on_with_ensure.rb
|
128
|
-
- examples/core/
|
184
|
+
- examples/core/multiple_spawn.rb
|
129
185
|
- examples/core/nested_async.rb
|
130
186
|
- examples/core/nested_cancel.rb
|
131
|
-
- examples/core/
|
187
|
+
- examples/core/nested_multiple_spawn.rb
|
132
188
|
- examples/core/next_tick.rb
|
133
189
|
- examples/core/pulse.rb
|
134
190
|
- examples/core/resource.rb
|
135
191
|
- examples/core/resource_cancel.rb
|
136
192
|
- examples/core/resource_delegate.rb
|
137
193
|
- examples/core/sleep.rb
|
138
|
-
- examples/core/
|
194
|
+
- examples/core/sleep_spawn.rb
|
139
195
|
- examples/core/spawn.rb
|
140
196
|
- examples/core/spawn_cancel.rb
|
141
197
|
- examples/core/spawn_error.rb
|
@@ -168,7 +224,7 @@ files:
|
|
168
224
|
- examples/http/wss_page.html
|
169
225
|
- examples/interfaces/pg_client.rb
|
170
226
|
- examples/interfaces/pg_pool.rb
|
171
|
-
- examples/interfaces/
|
227
|
+
- examples/interfaces/pg_transaction.rb
|
172
228
|
- examples/interfaces/redis_channels.rb
|
173
229
|
- examples/interfaces/redis_client.rb
|
174
230
|
- examples/interfaces/redis_pubsub.rb
|
@@ -181,8 +237,6 @@ files:
|
|
181
237
|
- examples/performance/perf_snooze.rb
|
182
238
|
- examples/performance/thread-vs-fiber/polyphony_server.rb
|
183
239
|
- examples/performance/thread-vs-fiber/threaded_server.rb
|
184
|
-
- examples/streams/lines.rb
|
185
|
-
- examples/streams/stdio.rb
|
186
240
|
- ext/ev/async.c
|
187
241
|
- ext/ev/child.c
|
188
242
|
- ext/ev/ev.h
|
@@ -209,12 +263,12 @@ files:
|
|
209
263
|
- ext/libev/ev_wrap.h
|
210
264
|
- ext/libev/test_libev_win32.c
|
211
265
|
- lib/polyphony.rb
|
212
|
-
- lib/polyphony/core.rb
|
213
266
|
- lib/polyphony/core/cancel_scope.rb
|
214
267
|
- lib/polyphony/core/channel.rb
|
215
268
|
- lib/polyphony/core/coprocess.rb
|
216
269
|
- lib/polyphony/core/exceptions.rb
|
217
270
|
- lib/polyphony/core/fiber_pool.rb
|
271
|
+
- lib/polyphony/core/resource_pool.rb
|
218
272
|
- lib/polyphony/core/supervisor.rb
|
219
273
|
- lib/polyphony/core/sync.rb
|
220
274
|
- lib/polyphony/core/thread.rb
|
@@ -222,10 +276,8 @@ files:
|
|
222
276
|
- lib/polyphony/core/throttler.rb
|
223
277
|
- lib/polyphony/extensions/io.rb
|
224
278
|
- lib/polyphony/extensions/kernel.rb
|
225
|
-
- lib/polyphony/extensions/
|
226
|
-
- lib/polyphony/extensions/redis.rb
|
279
|
+
- lib/polyphony/extensions/openssl.rb
|
227
280
|
- lib/polyphony/extensions/socket.rb
|
228
|
-
- lib/polyphony/extensions/ssl.rb
|
229
281
|
- lib/polyphony/fs.rb
|
230
282
|
- lib/polyphony/http.rb
|
231
283
|
- lib/polyphony/http/agent.rb
|
@@ -237,8 +289,8 @@ files:
|
|
237
289
|
- lib/polyphony/http/server.rb
|
238
290
|
- lib/polyphony/line_reader.rb
|
239
291
|
- lib/polyphony/net.rb
|
240
|
-
- lib/polyphony/
|
241
|
-
- lib/polyphony/
|
292
|
+
- lib/polyphony/postgres.rb
|
293
|
+
- lib/polyphony/redis.rb
|
242
294
|
- lib/polyphony/version.rb
|
243
295
|
- lib/polyphony/websocket.rb
|
244
296
|
- polyphony.gemspec
|
data/examples/core/sleep2.rb
DELETED
data/examples/streams/lines.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'modulation'
|
4
|
-
|
5
|
-
Polyphony = import('../../lib/polyphony')
|
6
|
-
LineReader = import('../../lib/polyphony/line_reader')
|
7
|
-
|
8
|
-
buffer = +''
|
9
|
-
reader = LineReader.new
|
10
|
-
|
11
|
-
Polyphony.interval(0.2) { buffer << "#{Time.now.to_f}\n" }
|
12
|
-
Polyphony.interval(0.3) do
|
13
|
-
|
14
|
-
reader.push(buffer.slice!(0, buffer.bytesize / 10 * 10))
|
15
|
-
end
|
16
|
-
|
17
|
-
Polyphony.async do
|
18
|
-
reader.lines.each do |line|
|
19
|
-
puts "* #{line}"
|
20
|
-
end
|
21
|
-
puts "no more lines"
|
22
|
-
end
|
23
|
-
|
24
|
-
Polyphony.timeout(2) do
|
25
|
-
Polyphony.cancel_all_timers
|
26
|
-
reader.close
|
27
|
-
end
|
data/examples/streams/stdio.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'modulation'
|
4
|
-
|
5
|
-
Polyphony = import('../../lib/polyphony')
|
6
|
-
|
7
|
-
input = Polyphony::IO.lines(Polyphony::IO.stdin)
|
8
|
-
|
9
|
-
Polyphony.async do
|
10
|
-
Polyphony.interval(1) { puts Time.now }
|
11
|
-
|
12
|
-
loop do
|
13
|
-
Polyphony::IO.stdout << "Say something: "
|
14
|
-
l = Polyphony.await(input)
|
15
|
-
break unless l
|
16
|
-
Polyphony::IO.stdout << "You said: #{l}"
|
17
|
-
end
|
18
|
-
end
|
data/lib/polyphony/core.rb
DELETED
@@ -1,45 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
export_default :Core
|
4
|
-
|
5
|
-
require 'fiber'
|
6
|
-
require_relative '../ev_ext'
|
7
|
-
|
8
|
-
import('./extensions/kernel')
|
9
|
-
FiberPool = import('./core/fiber_pool')
|
10
|
-
|
11
|
-
# Core module, containing async and reactor methods
|
12
|
-
module Core
|
13
|
-
def self.trap(sig, ref = false, &callback)
|
14
|
-
sig = Signal.list[sig.to_s.upcase] if sig.is_a?(Symbol)
|
15
|
-
watcher = EV::Signal.new(sig, &callback)
|
16
|
-
EV.unref unless ref
|
17
|
-
watcher
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.fork(&block)
|
21
|
-
EV.break
|
22
|
-
pid = Kernel.fork do
|
23
|
-
FiberPool.reset!
|
24
|
-
EV.post_fork
|
25
|
-
Fiber.current.coprocess = Coprocess.new(Fiber.current)
|
26
|
-
|
27
|
-
block.()
|
28
|
-
|
29
|
-
# We cannot simply depend on the at_exit block (see below) to yield to the
|
30
|
-
# reactor fiber. Doing that will raise a FiberError complaining: "fiber
|
31
|
-
# called across stack rewinding barrier". Apparently this is a bug in
|
32
|
-
# Ruby, so the workaround is to yield just before exiting.
|
33
|
-
suspend
|
34
|
-
end
|
35
|
-
EV.restart
|
36
|
-
pid
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
at_exit do
|
41
|
-
# in most cases, by the main fiber is done there are still pending or other
|
42
|
-
# or asynchronous operations going on. If the reactor loop is not done, we
|
43
|
-
# suspend the root fiber until it is done
|
44
|
-
suspend if $__reactor_fiber__&.alive?
|
45
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
export_default :ServerTask
|
4
|
-
|
5
|
-
Channel = import('./core/channel')
|
6
|
-
Task = import('./core/task')
|
7
|
-
|
8
|
-
class ServerTask
|
9
|
-
def initialize
|
10
|
-
super {
|
11
|
-
loop {
|
12
|
-
message = await @mailbox.receive
|
13
|
-
handle(message)
|
14
|
-
}
|
15
|
-
}
|
16
|
-
@mailbox = Channel.new
|
17
|
-
end
|
18
|
-
end
|