rbgo 0.2.7 → 0.2.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +0 -3
- data/lib/rbgo/actor.rb +1 -2
- data/lib/rbgo/corun.rb +14 -0
- data/lib/rbgo/io_machine.rb +47 -0
- data/lib/rbgo/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 88f583cbc3309a81e56fa7388a94b12e221be18ee671e40075dc1d2a531a1387
|
4
|
+
data.tar.gz: 66adc91902e07196656a01fbba5bd5c4f3e451f670b3da62ea1f2b9079b8f225
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dc11f265924a159752c9664a53668a7e8e5495693c1b71807017410699587ff1e165256dd574a3a7129924aae440c8227dc9cc0127d7596c726f312839e42577
|
7
|
+
data.tar.gz: 6f255f61b6c4e5ab6284a94f67df012b356fd1ccbb25f1110b61dba9954a07bde780b8778be8c9574f1c48f82074391fd559b30816d4dffe9de763fa8c28a163
|
data/README.md
CHANGED
data/lib/rbgo/actor.rb
CHANGED
data/lib/rbgo/corun.rb
CHANGED
@@ -34,6 +34,16 @@ module Rbgo
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
+
def self.read_partial_from(io, maxlen:)
|
38
|
+
if is_in_corun_fiber?
|
39
|
+
return "" if maxlen == 0
|
40
|
+
receipt = Scheduler.instance.io_machine.do_read_partial(io, maxlen: maxlen)
|
41
|
+
Fiber.yield [YIELD_IO_OPERATION, receipt]
|
42
|
+
else
|
43
|
+
io.readpartial(maxlen)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
37
47
|
def self.write_to(io, str:)
|
38
48
|
if is_in_corun_fiber?
|
39
49
|
receipt = Scheduler.instance.io_machine.do_write(io, str: str)
|
@@ -316,6 +326,10 @@ module Rbgo
|
|
316
326
|
CoRun.read_line_from(self, sep: sep, limit: limit)
|
317
327
|
end
|
318
328
|
|
329
|
+
def yield_read_partial(maxlen)
|
330
|
+
CoRun.read_partial_from(self, maxlen: maxlen)
|
331
|
+
end
|
332
|
+
|
319
333
|
def yield_write(str)
|
320
334
|
CoRun.write_to(self, str: str)
|
321
335
|
end
|
data/lib/rbgo/io_machine.rb
CHANGED
@@ -59,6 +59,13 @@ module Rbgo
|
|
59
59
|
receipt
|
60
60
|
end
|
61
61
|
|
62
|
+
def do_read_partial(io, maxlen:)
|
63
|
+
op = [:register_read_partial, io, maxlen]
|
64
|
+
receipt = IOReceipt.new(op)
|
65
|
+
actor.send_msg(receipt)
|
66
|
+
receipt
|
67
|
+
end
|
68
|
+
|
62
69
|
|
63
70
|
def close
|
64
71
|
actor.close
|
@@ -91,6 +98,8 @@ module Rbgo
|
|
91
98
|
handle_read_msg(receipt, actor)
|
92
99
|
when :register_read_line
|
93
100
|
handle_read_line_msg(receipt, actor)
|
101
|
+
when :register_read_partial
|
102
|
+
handle_read_partial_msg(receipt, actor)
|
94
103
|
when :register_write
|
95
104
|
handle_write_msg(receipt, actor)
|
96
105
|
end
|
@@ -119,6 +128,44 @@ module Rbgo
|
|
119
128
|
end
|
120
129
|
|
121
130
|
|
131
|
+
def handle_read_partial_msg(receipt, actor)
|
132
|
+
op = receipt.registered_op
|
133
|
+
io = op[1]
|
134
|
+
maxlen = op[2]
|
135
|
+
res = ""
|
136
|
+
|
137
|
+
monitor = register(receipt, interest: :r)
|
138
|
+
return if monitor.nil?
|
139
|
+
|
140
|
+
monitor.value ||= []
|
141
|
+
monitor.value[0] = proc do
|
142
|
+
notify_blk = proc do
|
143
|
+
monitors.delete(monitor.io)
|
144
|
+
monitor.close
|
145
|
+
receipt.res = res
|
146
|
+
receipt.notify
|
147
|
+
end
|
148
|
+
catch :exit do
|
149
|
+
begin
|
150
|
+
buf = io.read_nonblock(maxlen, exception: false)
|
151
|
+
rescue Exception => ex
|
152
|
+
notify_blk.call
|
153
|
+
STDERR.puts ex
|
154
|
+
throw :exit
|
155
|
+
end
|
156
|
+
if buf == :wait_readable
|
157
|
+
throw :exit
|
158
|
+
elsif buf.nil?
|
159
|
+
notify_blk.call
|
160
|
+
throw :exit
|
161
|
+
end
|
162
|
+
res << buf
|
163
|
+
notify_blk.call
|
164
|
+
end
|
165
|
+
end
|
166
|
+
actor.send_msg :do_select
|
167
|
+
end
|
168
|
+
|
122
169
|
def handle_read_line_msg(receipt, actor)
|
123
170
|
op = receipt.registered_op
|
124
171
|
io = op[1]
|
data/lib/rbgo/version.rb
CHANGED