rbgo 0.2.7 → 0.2.8
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 +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