rbgo 0.1.9 → 0.1.10

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a477d7e32124c9fa81f3235d4364a507d3881c560302eb0dab4e1e5dbb47f884
4
- data.tar.gz: a4db31caf6709828b837f344f9d54ddd34dda482fda41b1049cf0f11ac3896ed
3
+ metadata.gz: ce5380534583083998d908ac2ecb726a941bdc1e697cc8b1a6e6e10477e1bec6
4
+ data.tar.gz: 5eb7fd7557bef0a324a3a9b099e0c53bb2f71110107421d9b017bb42c99c9738
5
5
  SHA512:
6
- metadata.gz: 955cefbecf82855f6af160d17eceba1f606984d49c3769490f5827d94a8696b3987b17b7eec76e7332838aa38b717dd2370ac726b0b430441b4a7801f8042139
7
- data.tar.gz: b2a3f80a70cbf86cca2f65eb828f9867d8109cb18224d58e6bf1d875605cabceb62f1d2dc299e960fd8b7224f39b3ef1b43cd3a42ac4bc250a03508e984af890
6
+ metadata.gz: 194e1bbd2eee668bf3221db0c2b7dc888dbdf54b1ef2274c06ec51b031250e8858a134d37cf9b9c81c31c8d054723f6ffa3483409c5e642778e6391b7fdd823e
7
+ data.tar.gz: 7ba0c5eace41ad7d673d536dd6c80e0af03fcc53cdca945a2d2041f699bbcf13dc4ea075770e1302184566b8af80e51dab2fbf3a44f577918aef01db7f6f27a6
@@ -14,12 +14,22 @@ module Rbgo
14
14
 
15
15
  private
16
16
 
17
- attr_accessor :io_r, :io_w
17
+ attr_accessor :ios
18
+ attr_accessor :register_mutex
19
+
20
+ def register(io)
21
+ register_mutex.synchronize do
22
+ ios << io
23
+ end
24
+ end
18
25
 
19
26
  def notify
20
- tmp = io_w
21
- self.io_r, self.io_w = IO.pipe
22
- tmp.close rescue nil
27
+ register_mutex.synchronize do
28
+ ios.each do |io|
29
+ io.close rescue nil
30
+ end
31
+ ios.clear
32
+ end
23
33
  nil
24
34
  end
25
35
  end
@@ -43,7 +53,8 @@ module Rbgo
43
53
  self.have_enq_waiting_flag = false
44
54
  self.have_deq_waiting_flag = false
45
55
 
46
- self.io_r, self.io_w = IO.pipe
56
+ self.ios = []
57
+ self.register_mutex = Mutex.new
47
58
  end
48
59
 
49
60
  def push(obj, nonblock = false)
@@ -189,8 +200,10 @@ module Rbgo
189
200
 
190
201
  def initialize(max)
191
202
  super(max)
192
- self.io_r, self.io_w = IO.pipe
193
- @mutex = Mutex.new
203
+ @mutex = Mutex.new
204
+
205
+ self.ios = []
206
+ self.register_mutex = Mutex.new
194
207
  end
195
208
 
196
209
  def push(obj, nonblock = false)
@@ -250,24 +263,49 @@ module Rbgo
250
263
  def select_chan(*ops)
251
264
  ops.shuffle!
252
265
 
253
- while true do
254
- ios = []
255
- ops.each do |op|
256
- ios << op.io
266
+ io_hash = {}
267
+ close_io_blk = proc do
268
+ io_hash.each_pair.flat_map do |k, v|
269
+ [k, v[1]]
270
+ end.each do |io|
271
+ io.close rescue nil
257
272
  end
273
+ end
258
274
 
259
- ops.each do |op|
260
- begin
261
- return op.call
262
- rescue ThreadError
275
+ begin
276
+ while true do
277
+
278
+ close_io_blk.call
279
+ io_hash.clear
280
+
281
+ ops.each do |op|
282
+ io_r, io_w = IO.pipe
283
+ op.register(io_w)
284
+ io_hash[io_r] = [op, io_w]
263
285
  end
264
- end
265
286
 
266
- return yield if block_given?
287
+ ops.each do |op|
288
+ begin
289
+ return op.call
290
+ rescue ThreadError
291
+ end
292
+ end
267
293
 
268
- IO.select(ios)
269
- end
294
+ return yield if block_given?
295
+
296
+ read_ios = IO.select(io_hash.keys).first rescue []
270
297
 
298
+ read_ios.each do |io_r|
299
+ op = io_hash[io_r].first
300
+ begin
301
+ return op.call
302
+ rescue ThreadError
303
+ end
304
+ end
305
+ end
306
+ ensure
307
+ close_io_blk.call
308
+ end
271
309
  end
272
310
 
273
311
  # on_read
@@ -285,8 +323,8 @@ module Rbgo
285
323
  blk.call(res, ok)
286
324
  end
287
325
  end
288
- op.define_singleton_method(:io) do
289
- chan.send :io_r
326
+ op.define_singleton_method(:register) do |io_w|
327
+ chan.send :register, io_w
290
328
  end
291
329
  op
292
330
  end
@@ -304,9 +342,8 @@ module Rbgo
304
342
  res = blk.call unless blk.nil?
305
343
  res
306
344
  end
307
-
308
- op.define_singleton_method(:io) do
309
- chan.send :io_r
345
+ op.define_singleton_method(:register) do |io_w|
346
+ chan.send :register, io_w
310
347
  end
311
348
  op
312
349
  end
data/lib/rbgo/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Rbgo
2
- VERSION = "0.1.9"
2
+ VERSION = "0.1.10"
3
3
  end
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.1.9
4
+ version: 0.1.10
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-05 00:00:00.000000000 Z
11
+ date: 2019-08-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: system