rbgo 0.1.5 → 0.1.6

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: ae31a8f82bcb17f6ef6b4731a7943dcfc54354f3f917c1bba6ad0db28928f239
4
- data.tar.gz: d7204fed9c21e51c2eaea41397f71fe14ed2b477e42dab134185cb265469f8a6
3
+ metadata.gz: 31f4096cd6341d864c580b0fbdf97f1c15a4658ff8e2f121da2b3231ba93e680
4
+ data.tar.gz: 22cb35759bab5c8fb1444ab4bab0e20524224d36ce4b2262bc33034f8ae0fb29
5
5
  SHA512:
6
- metadata.gz: 8cf78287a1fe22e763384d474e7d9703a19f4770d026108bf04ddc1c0a6e105658ab16865200bb92a186979f972152e49db23f828c2d4809b8ef56a6098b613c
7
- data.tar.gz: 7d9fdfd4915c70b8f29b811dac898b9bc3bcbca7ea78dd63e23c5a58c268b901321bc7727c0bc546d36b7f5d56cad85874ed6d31e07fcbe7a5aa740b9f123b89
6
+ metadata.gz: d270027b24ce105909fe8f814f801ae07441afe723bbc0a84913c784e38ae68134f3c7df04872d76d0235de99c01a16e0c2cb3acbfbb733d67d3b86f7be0547b
7
+ data.tar.gz: 5016e05b7f48d951efd297137ec8fbf17581cf70be43fccb9315b41abbc0b60854f45755bccd8f6523733924eb5b6aea2483a743b40f05c5b53692fc1375aacf
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rbgo (0.1.4)
4
+ rbgo (0.1.6)
5
5
  sys-cpu (~> 0.8)
6
6
 
7
7
  GEM
@@ -1,6 +1,4 @@
1
1
  require 'thread'
2
- require 'set'
3
- require 'monitor'
4
2
 
5
3
  module Rbgo
6
4
  module Channel
@@ -16,63 +14,12 @@ module Rbgo
16
14
 
17
15
  private
18
16
 
19
- def register(observer:, mode: :rw)
20
- unless observer.is_a? ConditionVariable
21
- return false
22
- end
23
- mode = mode.to_sym.downcase
24
- if mode == :rw
25
- @readable_observers.synchronize do
26
- @readable_observers.add(observer)
27
- end
28
- @writable_observers.synchronize do
29
- @writable_observers.add(observer)
30
- end
31
- elsif mode == :r
32
- @readable_observers.synchronize do
33
- @readable_observers.add(observer)
34
- end
35
- elsif mode == :w
36
- @writable_observers.synchronize do
37
- @writable_observers.add(observer)
38
- end
39
- else
40
- return false
41
- end
42
- true
43
- end
44
-
45
- def unregister(observer:, mode: :rw)
46
- mode = mode.to_sym.downcase
47
- if mode == :rw
48
- @readable_observers.synchronize do
49
- @readable_observers.delete(observer)
50
- end
51
- @writable_observers.synchronize do
52
- @writable_observers.delete(observer)
53
- end
54
- elsif mode == :r
55
- @readable_observers.synchronize do
56
- @readable_observers.delete(observer)
57
- end
58
- elsif mode == :w
59
- @writable_observers.synchronize do
60
- @writable_observers.delete(observer)
61
- end
62
- else
63
- return false
64
- end
65
- true
66
- end
17
+ attr_accessor :io_r, :io_w
67
18
 
68
- def notify_readable_observers
69
- @readable_observers.each(&:broadcast)
70
- nil
71
- end
72
-
73
- def notify_writable_observers
74
- @writable_observers.each(&:broadcast)
75
- nil
19
+ def notify
20
+ tmp = io_w
21
+ self.io_r, self.io_w = IO.pipe
22
+ tmp.close
76
23
  end
77
24
  end
78
25
 
@@ -95,10 +42,7 @@ module Rbgo
95
42
  self.have_enq_waiting_flag = false
96
43
  self.have_deq_waiting_flag = false
97
44
 
98
- @readable_observers = Set.new
99
- @readable_observers.extend(MonitorMixin)
100
- @writable_observers = Set.new
101
- @writable_observers.extend(MonitorMixin)
45
+ self.io_r, self.io_w = IO.pipe
102
46
  end
103
47
 
104
48
  def push(obj, nonblock = false)
@@ -132,7 +76,7 @@ module Rbgo
132
76
  deq_mutex.synchronize do
133
77
  # no op
134
78
  end
135
- notify_readable_observers
79
+ notify
136
80
  end
137
81
  rescue Exception => ex
138
82
  STDERR.puts ex
@@ -175,7 +119,7 @@ module Rbgo
175
119
 
176
120
  while resource_array.empty? && !closed?
177
121
  self.have_deq_waiting_flag = true
178
- notify_writable_observers
122
+ notify
179
123
  enq_cond.wait(deq_mutex)
180
124
  end
181
125
  resource = resource_array.first
@@ -195,8 +139,7 @@ module Rbgo
195
139
  self.close_flag = true
196
140
  enq_cond.broadcast
197
141
  deq_cond.broadcast
198
- notify_readable_observers
199
- notify_writable_observers
142
+ notify
200
143
  self
201
144
  end
202
145
  end
@@ -245,17 +188,13 @@ module Rbgo
245
188
 
246
189
  def initialize(max)
247
190
  super(max)
248
- @readable_observers = Set.new
249
- @readable_observers.extend(MonitorMixin)
250
- @writable_observers = Set.new
251
- @writable_observers.extend(MonitorMixin)
252
-
253
- @mutex = Mutex.new
191
+ self.io_r, self.io_w = IO.pipe
192
+ @mutex = Mutex.new
254
193
  end
255
194
 
256
195
  def push(obj, nonblock = false)
257
196
  super(obj, nonblock)
258
- notify_readable_observers
197
+ notify
259
198
  self
260
199
  rescue ThreadError
261
200
  raise ClosedQueueError.new if closed?
@@ -269,7 +208,7 @@ module Rbgo
269
208
  ok = false if empty? && closed?
270
209
  begin
271
210
  res = super(nonblock)
272
- notify_writable_observers
211
+ notify
273
212
  rescue ThreadError
274
213
  raise unless closed?
275
214
  ok = false
@@ -280,15 +219,14 @@ module Rbgo
280
219
 
281
220
  def clear
282
221
  super
283
- notify_writable_observers
222
+ notify
284
223
  self
285
224
  end
286
225
 
287
226
  def close
288
227
  @mutex.synchronize do
289
228
  super
290
- notify_readable_observers
291
- notify_writable_observers
229
+ notify
292
230
  self
293
231
  end
294
232
  end
@@ -311,10 +249,11 @@ module Rbgo
311
249
  def select_chan(*ops)
312
250
  ops.shuffle!
313
251
 
314
- mutex = Mutex.new
315
- cond = ConditionVariable.new
316
-
317
- loop do
252
+ while true do
253
+ ios = []
254
+ ops.each do |op|
255
+ ios << op.io
256
+ end
318
257
 
319
258
  ops.each do |op|
320
259
  begin
@@ -325,20 +264,7 @@ module Rbgo
325
264
 
326
265
  return yield if block_given?
327
266
 
328
- ops.each do |op|
329
- op.register(cond)
330
- end
331
-
332
- mutex.synchronize do
333
- cond.wait mutex
334
- end
335
-
336
- end
337
-
338
- ensure
339
-
340
- ops.each do |op|
341
- op.unregister(cond)
267
+ IO.select(ios)
342
268
  end
343
269
 
344
270
  end
@@ -358,11 +284,8 @@ module Rbgo
358
284
  blk.call(res, ok)
359
285
  end
360
286
  end
361
- op.define_singleton_method(:register) do |cond|
362
- chan.send :register, observer: cond, mode: :r
363
- end
364
- op.define_singleton_method(:unregister) do |cond|
365
- chan.send :unregister, observer: cond, mode: :r
287
+ op.define_singleton_method(:io) do
288
+ chan.send :io_r
366
289
  end
367
290
  op
368
291
  end
@@ -381,11 +304,8 @@ module Rbgo
381
304
  res
382
305
  end
383
306
 
384
- op.define_singleton_method(:register) do |cond|
385
- chan.send :register, observer: cond, mode: :w
386
- end
387
- op.define_singleton_method(:unregister) do |cond|
388
- chan.send :unregister, observer: cond, mode: :w
307
+ op.define_singleton_method(:io) do
308
+ chan.send :io_r
389
309
  end
390
310
  op
391
311
  end
data/lib/rbgo/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Rbgo
2
- VERSION = "0.1.5"
2
+ VERSION = "0.1.6"
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.5
4
+ version: 0.1.6
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-03 00:00:00.000000000 Z
11
+ date: 2019-08-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sys-cpu