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 +4 -4
- data/Gemfile.lock +1 -1
- data/lib/rbgo/select_chan.rb +25 -105
- data/lib/rbgo/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 31f4096cd6341d864c580b0fbdf97f1c15a4658ff8e2f121da2b3231ba93e680
|
4
|
+
data.tar.gz: 22cb35759bab5c8fb1444ab4bab0e20524224d36ce4b2262bc33034f8ae0fb29
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d270027b24ce105909fe8f814f801ae07441afe723bbc0a84913c784e38ae68134f3c7df04872d76d0235de99c01a16e0c2cb3acbfbb733d67d3b86f7be0547b
|
7
|
+
data.tar.gz: 5016e05b7f48d951efd297137ec8fbf17581cf70be43fccb9315b41abbc0b60854f45755bccd8f6523733924eb5b6aea2483a743b40f05c5b53692fc1375aacf
|
data/Gemfile.lock
CHANGED
data/lib/rbgo/select_chan.rb
CHANGED
@@ -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
|
-
|
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
|
69
|
-
|
70
|
-
|
71
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
249
|
-
@
|
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
|
-
|
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
|
-
|
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
|
-
|
222
|
+
notify
|
284
223
|
self
|
285
224
|
end
|
286
225
|
|
287
226
|
def close
|
288
227
|
@mutex.synchronize do
|
289
228
|
super
|
290
|
-
|
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
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
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
|
-
|
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(:
|
362
|
-
chan.send :
|
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(:
|
385
|
-
chan.send :
|
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
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.
|
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-
|
11
|
+
date: 2019-08-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sys-cpu
|