File tree Expand file tree Collapse file tree 2 files changed +34
-0
lines changed Expand file tree Collapse file tree 2 files changed +34
-0
lines changed Original file line number Diff line number Diff line change @@ -137,6 +137,29 @@ describe Channel::Unbuffered do
137
137
spawn { ch.send 123 }
138
138
ch.receive?.should eq(123 )
139
139
end
140
+
141
+ it " wakes up the sender fiber when channel is closed" do
142
+ ch = Channel ::Unbuffered (Nil ).new
143
+ sender_closed = false
144
+ spawn do
145
+ ch.send nil
146
+ ch.send nil
147
+ rescue Channel ::ClosedError
148
+ sender_closed = true
149
+ end
150
+ receiver_closed = false
151
+ spawn do
152
+ Fiber .yield
153
+ ch.receive
154
+ rescue Channel ::ClosedError
155
+ receiver_closed = true
156
+ end
157
+ Fiber .yield
158
+ ch.close
159
+ Fiber .yield
160
+ sender_closed.should be_true
161
+ receiver_closed.should be_true
162
+ end
140
163
end
141
164
142
165
describe Channel ::Buffered do
Original file line number Diff line number Diff line change @@ -30,6 +30,8 @@ abstract class Channel(T)
30
30
31
31
def close
32
32
@closed = true
33
+ Scheduler .enqueue @senders
34
+ @senders .clear
33
35
Scheduler .enqueue @receivers
34
36
@receivers .clear
35
37
nil
@@ -259,6 +261,7 @@ class Channel::Unbuffered(T) < Channel(T)
259
261
@value .tap do
260
262
@has_value = false
261
263
Scheduler .enqueue @sender .not_nil!
264
+ @sender = nil
262
265
end
263
266
end
264
267
@@ -269,4 +272,12 @@ class Channel::Unbuffered(T) < Channel(T)
269
272
def full ?
270
273
@has_value || @receivers .empty?
271
274
end
275
+
276
+ def close
277
+ super
278
+ if sender = @sender
279
+ Scheduler .enqueue sender
280
+ @sender = nil
281
+ end
282
+ end
272
283
end
You can’t perform that action at this time.
0 commit comments