rbgo 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
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