File tree Expand file tree Collapse file tree 3 files changed +52
-24
lines changed Expand file tree Collapse file tree 3 files changed +52
-24
lines changed Original file line number Diff line number Diff line change
1
+ require_relative 'waitable_list'
2
+
1
3
module Concurrent
2
4
class BufferedChannel
3
5
@@ -6,13 +8,13 @@ def initialize(size)
6
8
@condition = Condition . new
7
9
@buffer_condition = Condition . new
8
10
9
- @probe_set = [ ]
11
+ @probe_set = WaitableList . new
10
12
@buffer = [ ]
11
13
@size = size
12
14
end
13
15
14
16
def probe_set_size
15
- @mutex . synchronize { @ probe_set. size }
17
+ @probe_set . size
16
18
end
17
19
18
20
def buffer_queue_size
@@ -34,7 +36,7 @@ def select(probe)
34
36
@mutex . synchronize do
35
37
36
38
if @buffer . empty?
37
- @probe_set << probe
39
+ @probe_set . push ( probe )
38
40
true
39
41
else
40
42
shift_buffer if probe . set_unless_assigned peek_buffer
@@ -44,7 +46,7 @@ def select(probe)
44
46
end
45
47
46
48
def remove_probe ( probe )
47
- @mutex . synchronize { @ probe_set. delete ( probe ) }
49
+ @probe_set . delete ( probe )
48
50
end
49
51
50
52
private
@@ -81,7 +83,7 @@ def set_probe_or_push_into_buffer(value)
81
83
push_into_buffer ( value )
82
84
true
83
85
else
84
- @probe_set . shift . set_unless_assigned ( value )
86
+ @probe_set . first . set_unless_assigned ( value )
85
87
end
86
88
end
87
89
end
Original file line number Diff line number Diff line change
1
+ require_relative 'waitable_list'
2
+
1
3
module Concurrent
2
4
class UnbufferedChannel
3
5
4
6
def initialize
5
- @mutex = Mutex . new
6
- @condition = Condition . new
7
-
8
- @probe_set = [ ]
7
+ @probe_set = WaitableList . new
9
8
end
10
9
11
10
def probe_set_size
12
- @mutex . synchronize { @ probe_set. size }
11
+ @probe_set . size
13
12
end
14
13
15
14
def push ( value )
16
- until first_waiting_probe . set_unless_assigned ( value )
15
+ until @probe_set . first . set_unless_assigned ( value )
17
16
end
18
17
end
19
18
@@ -24,22 +23,11 @@ def pop
24
23
end
25
24
26
25
def select ( probe )
27
- @mutex . synchronize do
28
- @probe_set << probe
29
- @condition . signal
30
- end
26
+ @probe_set . push ( probe )
31
27
end
32
28
33
29
def remove_probe ( probe )
34
- @mutex . synchronize { @probe_set . delete ( probe ) }
35
- end
36
-
37
- private
38
- def first_waiting_probe
39
- @mutex . synchronize do
40
- @condition . wait ( @mutex ) while @probe_set . empty?
41
- @probe_set . shift
42
- end
30
+ @probe_set . delete ( probe )
43
31
end
44
32
45
33
end
Original file line number Diff line number Diff line change
1
+ module Concurrent
2
+ class WaitableList
3
+
4
+ def initialize
5
+ @mutex = Mutex . new
6
+ @condition = Condition . new
7
+
8
+ @list = [ ]
9
+ end
10
+
11
+ def size
12
+ @mutex . synchronize { @list . size }
13
+ end
14
+
15
+ def empty?
16
+ @mutex . synchronize { @list . empty? }
17
+ end
18
+
19
+ def push ( value )
20
+ @mutex . synchronize do
21
+ @list << value
22
+ @condition . signal
23
+ end
24
+ end
25
+
26
+ def delete ( value )
27
+ @mutex . synchronize { @list . delete ( value ) }
28
+ end
29
+
30
+ def first
31
+ @mutex . synchronize do
32
+ @condition . wait ( @mutex ) while @list . empty?
33
+ @list . shift
34
+ end
35
+ end
36
+
37
+ end
38
+ end
You can’t perform that action at this time.
0 commit comments