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 +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
|