rbgo 0.2.6 → 0.2.7
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/README.md +7 -6
- data/lib/rbgo/actor.rb +2 -1
- data/lib/rbgo/corun.rb +31 -2
- data/lib/rbgo/io_machine.rb +141 -66
- data/lib/rbgo/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ec171658e61d3d64d313126f3b3ee709565a4676624a513982c73d531c4c2ce8
|
4
|
+
data.tar.gz: 7266385dc226a8643dae466209ec674e59390fee1faabfbba39e85d578d875a6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 42f49f6cade30b7f4ebc6ac57c2ff9386d09256032cec1d87d11ca9f2b5b7f0c4b92e56c1db593066ddebfbb7f6ea208a2de9f64c721332268c0e0b10fddeba2
|
7
|
+
data.tar.gz: 637bdfec998a93e8aadbef3d84d0ffc6faf1744b41f877e8faed3de349b3a77ecc80662822dbc6816302e8b5cbe7109b1a2c0fe58b52938095eb6b90e9de260e
|
data/README.md
CHANGED
@@ -231,12 +231,13 @@ require 'rbgo'
|
|
231
231
|
using Rbgo::CoRunExtensions
|
232
232
|
|
233
233
|
#localhost, port 3000
|
234
|
-
tcp_service = Rbgo::NetworkServiceFactory.open_tcp_service(3000) do|sock,
|
235
|
-
|
236
|
-
|
237
|
-
sock.yield_write("
|
238
|
-
sock.
|
239
|
-
|
234
|
+
tcp_service = Rbgo::NetworkServiceFactory.open_tcp_service(3000) do|sock, _|
|
235
|
+
sock.yield_read_line("\r\n\r\n") # read http request
|
236
|
+
sock.close_read
|
237
|
+
sock.yield_write("HTTP/1.1 200 OK \r\n\r\nHello World!")
|
238
|
+
sock.close_write
|
239
|
+
sock.close
|
240
|
+
end
|
240
241
|
|
241
242
|
|
242
243
|
|
data/lib/rbgo/actor.rb
CHANGED
data/lib/rbgo/corun.rb
CHANGED
@@ -3,6 +3,7 @@ require 'fiber'
|
|
3
3
|
require 'system'
|
4
4
|
require 'singleton'
|
5
5
|
require_relative 'io_machine'
|
6
|
+
require_relative 'once'
|
6
7
|
|
7
8
|
module Rbgo
|
8
9
|
module CoRun
|
@@ -23,6 +24,16 @@ module Rbgo
|
|
23
24
|
end
|
24
25
|
end
|
25
26
|
|
27
|
+
def self.read_line_from(io, sep: $/, limit: nil)
|
28
|
+
if is_in_corun_fiber?
|
29
|
+
return "" if limit == 0
|
30
|
+
receipt = Scheduler.instance.io_machine.do_read_line(io, sep: sep, limit: limit)
|
31
|
+
Fiber.yield [YIELD_IO_OPERATION, receipt]
|
32
|
+
else
|
33
|
+
io.readline(sep, limit)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
26
37
|
def self.write_to(io, str:)
|
27
38
|
if is_in_corun_fiber?
|
28
39
|
receipt = Scheduler.instance.io_machine.do_write(io, str: str)
|
@@ -49,7 +60,8 @@ module Rbgo
|
|
49
60
|
self.blk = blk
|
50
61
|
if new_thread
|
51
62
|
Thread.new do
|
52
|
-
|
63
|
+
Thread.current.report_on_exception = false
|
64
|
+
self.fiber = Fiber.new do |args|
|
53
65
|
blk.call(*args)
|
54
66
|
end
|
55
67
|
|
@@ -102,12 +114,24 @@ module Rbgo
|
|
102
114
|
include Singleton
|
103
115
|
attr_accessor :num_thread, :check_interval, :io_machine
|
104
116
|
|
117
|
+
def io_machine
|
118
|
+
io_machine_init_once.do do
|
119
|
+
@io_machine = IOMachine.new
|
120
|
+
end
|
121
|
+
@io_machine
|
122
|
+
end
|
123
|
+
|
124
|
+
def io_machine=(machine)
|
125
|
+
@io_machine = machine
|
126
|
+
end
|
127
|
+
|
105
128
|
private
|
106
129
|
|
107
130
|
attr_accessor :thread_pool
|
108
131
|
attr_accessor :task_queue
|
109
132
|
attr_accessor :msg_queue
|
110
133
|
attr_accessor :supervisor_thread
|
134
|
+
attr_accessor :io_machine_init_once
|
111
135
|
|
112
136
|
def initialize
|
113
137
|
self.num_thread = System::CPU.count rescue 8
|
@@ -118,7 +142,7 @@ module Rbgo
|
|
118
142
|
|
119
143
|
self.check_interval = 0.1
|
120
144
|
|
121
|
-
self.
|
145
|
+
self.io_machine_init_once = Once.new
|
122
146
|
|
123
147
|
msg_queue << :init
|
124
148
|
create_supervisor_thread
|
@@ -288,9 +312,14 @@ module Rbgo
|
|
288
312
|
CoRun.read_from(self, length: len)
|
289
313
|
end
|
290
314
|
|
315
|
+
def yield_read_line(sep = $/, limit = nil)
|
316
|
+
CoRun.read_line_from(self, sep: sep, limit: limit)
|
317
|
+
end
|
318
|
+
|
291
319
|
def yield_write(str)
|
292
320
|
CoRun.write_to(self, str: str)
|
293
321
|
end
|
322
|
+
|
294
323
|
end
|
295
324
|
end
|
296
325
|
end
|
data/lib/rbgo/io_machine.rb
CHANGED
@@ -52,6 +52,14 @@ module Rbgo
|
|
52
52
|
receipt
|
53
53
|
end
|
54
54
|
|
55
|
+
def do_read_line(io, sep: $/, limit: nil)
|
56
|
+
op = [:register_read_line, io, sep, limit]
|
57
|
+
receipt = IOReceipt.new(op)
|
58
|
+
actor.send_msg(receipt)
|
59
|
+
receipt
|
60
|
+
end
|
61
|
+
|
62
|
+
|
55
63
|
def close
|
56
64
|
actor.close
|
57
65
|
selector.close
|
@@ -78,12 +86,12 @@ module Rbgo
|
|
78
86
|
receipt = msg
|
79
87
|
op = receipt.registered_op
|
80
88
|
|
81
|
-
case
|
82
|
-
when
|
83
|
-
handle_read_msg(receipt, actor)
|
84
|
-
when param_pattern_match([:register_read, IO, nil], op)
|
89
|
+
case op[0]
|
90
|
+
when :register_read
|
85
91
|
handle_read_msg(receipt, actor)
|
86
|
-
when
|
92
|
+
when :register_read_line
|
93
|
+
handle_read_line_msg(receipt, actor)
|
94
|
+
when :register_write
|
87
95
|
handle_write_msg(receipt, actor)
|
88
96
|
end
|
89
97
|
end #end of actor
|
@@ -111,35 +119,34 @@ module Rbgo
|
|
111
119
|
end
|
112
120
|
|
113
121
|
|
114
|
-
def
|
115
|
-
op
|
116
|
-
io
|
117
|
-
|
118
|
-
|
119
|
-
buf_size
|
120
|
-
|
121
|
-
if registered_monitor && (registered_monitor.interests == :r || registered_monitor.interests == :rw)
|
122
|
-
actor.send_msg receipt
|
123
|
-
return
|
124
|
-
end
|
122
|
+
def handle_read_line_msg(receipt, actor)
|
123
|
+
op = receipt.registered_op
|
124
|
+
io = op[1]
|
125
|
+
sep = op[2]
|
126
|
+
limit = op[3]
|
127
|
+
buf_size = 512 * 1024
|
128
|
+
res = ""
|
125
129
|
|
126
|
-
|
127
|
-
|
128
|
-
monitor = registered_monitor
|
129
|
-
else
|
130
|
-
monitor = selector.register(io, :r)
|
131
|
-
monitors[io] = monitor
|
132
|
-
end
|
130
|
+
monitor = register(receipt, interest: :r)
|
131
|
+
return if monitor.nil?
|
133
132
|
|
134
133
|
monitor.value ||= []
|
135
134
|
monitor.value[0] = proc do
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
receipt.res =
|
141
|
-
|
135
|
+
notify_blk = proc do
|
136
|
+
monitors.delete(monitor.io)
|
137
|
+
monitor.close
|
138
|
+
if limit && limit > 0 && res.length == 0
|
139
|
+
receipt.res = nil
|
140
|
+
else
|
141
|
+
receipt.res = res
|
142
142
|
end
|
143
|
+
receipt.notify
|
144
|
+
end
|
145
|
+
|
146
|
+
sep = "\n\n" if (sep && sep.length == 0)
|
147
|
+
|
148
|
+
if limit.nil?
|
149
|
+
buf_size = 1 unless sep.nil?
|
143
150
|
loop do
|
144
151
|
begin
|
145
152
|
buf = io.read_nonblock(buf_size, exception: false)
|
@@ -155,25 +162,98 @@ module Rbgo
|
|
155
162
|
break
|
156
163
|
end
|
157
164
|
res << buf
|
165
|
+
unless sep.nil?
|
166
|
+
if res.end_with?(sep)
|
167
|
+
notify_blk.call
|
168
|
+
break
|
169
|
+
end
|
170
|
+
end
|
158
171
|
end
|
159
|
-
elsif
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
if res.string.length == 0
|
170
|
-
receipt.res = nil
|
172
|
+
elsif limit > 0
|
173
|
+
bytes_read_n = 0
|
174
|
+
loop do
|
175
|
+
need_read_bytes_n = limit - bytes_read_n
|
176
|
+
if need_read_bytes_n <= 0
|
177
|
+
notify_blk.call
|
178
|
+
break
|
179
|
+
end
|
180
|
+
if sep.nil?
|
181
|
+
buf_size = need_read_bytes_n
|
171
182
|
else
|
172
|
-
|
183
|
+
buf_size = 1
|
184
|
+
end
|
185
|
+
begin
|
186
|
+
buf = io.read_nonblock(buf_size, exception: false)
|
187
|
+
rescue Exception => ex
|
188
|
+
notify_blk.call
|
189
|
+
STDERR.puts ex
|
190
|
+
break
|
191
|
+
end
|
192
|
+
if buf == :wait_readable
|
193
|
+
break
|
194
|
+
elsif buf.nil?
|
195
|
+
notify_blk.call
|
196
|
+
break
|
197
|
+
end
|
198
|
+
res << buf
|
199
|
+
bytes_read_n += buf.bytesize
|
200
|
+
unless sep.nil?
|
201
|
+
if res.end_with?(sep)
|
202
|
+
notify_blk.call
|
203
|
+
break
|
204
|
+
end
|
173
205
|
end
|
174
|
-
receipt.notify
|
175
206
|
end
|
207
|
+
else
|
208
|
+
notify_blk.call
|
209
|
+
end
|
210
|
+
end
|
211
|
+
actor.send_msg :do_select
|
212
|
+
end
|
213
|
+
|
176
214
|
|
215
|
+
def handle_read_msg(receipt, actor)
|
216
|
+
op = receipt.registered_op
|
217
|
+
io = op[1]
|
218
|
+
len = op[2]
|
219
|
+
res = ""
|
220
|
+
buf_size = 1024 * 512
|
221
|
+
|
222
|
+
monitor = register(receipt, interest: :r)
|
223
|
+
return if monitor.nil?
|
224
|
+
notify_blk = proc do
|
225
|
+
monitors.delete(monitor.io)
|
226
|
+
monitor.close
|
227
|
+
if len && len > 0 && res.length == 0
|
228
|
+
receipt.res = nil
|
229
|
+
else
|
230
|
+
receipt.res = res
|
231
|
+
end
|
232
|
+
receipt.notify
|
233
|
+
end
|
234
|
+
monitor.value ||= []
|
235
|
+
monitor.value[0] = proc do
|
236
|
+
if len.nil?
|
237
|
+
loop do
|
238
|
+
begin
|
239
|
+
buf = io.read_nonblock(buf_size, exception: false)
|
240
|
+
rescue Exception => ex
|
241
|
+
notify_blk.call
|
242
|
+
STDERR.puts ex
|
243
|
+
break
|
244
|
+
end
|
245
|
+
if buf == :wait_readable
|
246
|
+
break
|
247
|
+
elsif buf.nil?
|
248
|
+
notify_blk.call
|
249
|
+
break
|
250
|
+
end
|
251
|
+
res << buf
|
252
|
+
end
|
253
|
+
elsif len == 0
|
254
|
+
notify_blk.call
|
255
|
+
break
|
256
|
+
else
|
177
257
|
bytes_read_n = 0
|
178
258
|
loop do
|
179
259
|
need_read_bytes_n = len - bytes_read_n
|
@@ -208,19 +288,8 @@ module Rbgo
|
|
208
288
|
io = op[1]
|
209
289
|
str = op[2].to_s
|
210
290
|
|
211
|
-
|
212
|
-
if
|
213
|
-
actor.send_msg receipt
|
214
|
-
return
|
215
|
-
end
|
216
|
-
|
217
|
-
if registered_monitor
|
218
|
-
registered_monitor.add_interest(:w)
|
219
|
-
monitor = registered_monitor
|
220
|
-
else
|
221
|
-
monitor = selector.register(io, :w)
|
222
|
-
monitors[io] = monitor
|
223
|
-
end
|
291
|
+
monitor = register(receipt, interest: :w)
|
292
|
+
return if monitor.nil?
|
224
293
|
|
225
294
|
buf = NIO::ByteBuffer.new(str.bytesize)
|
226
295
|
buf << str
|
@@ -250,17 +319,23 @@ module Rbgo
|
|
250
319
|
end
|
251
320
|
|
252
321
|
|
253
|
-
def
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
match = false
|
260
|
-
break
|
261
|
-
end
|
322
|
+
def register(receipt, interest:)
|
323
|
+
io = receipt.registered_op[1]
|
324
|
+
registered_monitor = monitors[io]
|
325
|
+
if registered_monitor && (registered_monitor.interests == interest || registered_monitor.interests == :rw)
|
326
|
+
actor.send_msg receipt
|
327
|
+
return nil
|
262
328
|
end
|
263
|
-
|
329
|
+
|
330
|
+
if registered_monitor
|
331
|
+
registered_monitor.add_interest(interest)
|
332
|
+
monitor = registered_monitor
|
333
|
+
else
|
334
|
+
monitor = selector.register(io, interest)
|
335
|
+
monitors[io] = monitor
|
336
|
+
end
|
337
|
+
monitor
|
264
338
|
end
|
339
|
+
|
265
340
|
end
|
266
341
|
end
|
data/lib/rbgo/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rbgo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Wang Yin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-08-
|
11
|
+
date: 2019-08-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: system
|