164
164
165
165
closed_exception () = InvalidStateException (" Channel is closed." , :closed )
166
166
167
- isbuffered (c:: Channel ) = c. sz_max== 0 ? false : true
167
+ @nospecialize isbuffered (c:: Channel ) = c. sz_max== 0 ? false : true
168
168
169
- function check_channel_state (c:: Channel )
169
+ @nospecialize function check_channel_state (c:: Channel )
170
170
if ! isopen (c)
171
171
# if the monotonic load succeed, now do an acquire fence
172
172
(@atomic :acquire c. state) === :open && concurrency_violation ()
@@ -183,8 +183,8 @@ Close a channel. An exception (optionally given by `excp`), is thrown by:
183
183
* [`put!`](@ref) on a closed channel.
184
184
* [`take!`](@ref) and [`fetch`](@ref) on an empty, closed channel.
185
185
"""
186
- close (c:: Channel ) = close (c, closed_exception ()) # nospecialize on default arg seems to confuse makedocs
187
- function close (c:: Channel , @nospecialize ( excp:: Exception ) )
186
+ close (@nospecialize ( c:: Channel ) ) = close (c, closed_exception ()) # nospecialize on default arg seems to confuse makedocs
187
+ @nospecialize function close (c:: Channel , excp:: Exception )
188
188
lock (c)
189
189
try
190
190
c. excp = excp
@@ -197,7 +197,7 @@ function close(c::Channel, @nospecialize(excp::Exception))
197
197
end
198
198
nothing
199
199
end
200
- isopen (c:: Channel ) = ((@atomic :monotonic c. state) === :open )
200
+ @nospecialize isopen (c:: Channel ) = ((@atomic :monotonic c. state) === :open )
201
201
202
202
"""
203
203
bind(chnl::Channel, task::Task)
@@ -251,7 +251,7 @@ Stacktrace:
251
251
[...]
252
252
```
253
253
"""
254
- function bind (c:: Channel , task:: Task )
254
+ @nospecialize function bind (c:: Channel , task:: Task )
255
255
T = Task (() -> close_chnl_on_taskdone (task, c))
256
256
_wait2 (task, T)
257
257
return c
@@ -283,7 +283,7 @@ function channeled_tasks(n::Int, funcs...; ctypes=fill(Any,n), csizes=fill(0,n))
283
283
return (chnls, tasks)
284
284
end
285
285
286
- function close_chnl_on_taskdone (t:: Task , c:: Channel )
286
+ @nospecialize function close_chnl_on_taskdone (t:: Task , c:: Channel )
287
287
isopen (c) || return
288
288
lock (c)
289
289
try
@@ -323,7 +323,7 @@ function put!(c::Channel{T}, v) where T
323
323
end
324
324
325
325
# Atomically update channel n_avail, *assuming* we hold the channel lock.
326
- function _increment_n_avail (c, inc)
326
+ @nospecialize function _increment_n_avail (c, inc)
327
327
# We hold the channel lock so it's safe to non-atomically read and
328
328
# increment c.n_avail_items
329
329
newlen = c. n_avail_items + inc
@@ -516,17 +516,17 @@ true
516
516
```
517
517
518
518
"""
519
- isready (c:: Channel ) = n_avail (c) > 0
520
- isempty (c:: Channel ) = n_avail (c) == 0
521
- function n_avail (c:: Channel )
519
+ @nospecialize isready (c:: Channel ) = n_avail (c) > 0
520
+ @nospecialize isempty (c:: Channel ) = n_avail (c) == 0
521
+ @nospecialize function n_avail (c:: Channel )
522
522
# Lock-free equivalent to `length(c.data) + length(c.cond_put.waitq)`
523
523
@atomic :monotonic c. n_avail_items
524
524
end
525
525
526
- lock (c:: Channel ) = lock (c. cond_take)
527
- lock (f, c:: Channel ) = lock (f, c. cond_take)
528
- unlock (c:: Channel ) = unlock (c. cond_take)
529
- trylock (c:: Channel ) = trylock (c. cond_take)
526
+ @nospecialize lock (c:: Channel ) = lock (c. cond_take)
527
+ lock (f, @nospecialize ( c:: Channel ) ) = lock (f, c. cond_take)
528
+ @nospecialize unlock (c:: Channel ) = unlock (c. cond_take)
529
+ @nospecialize trylock (c:: Channel ) = trylock (c. cond_take)
530
530
531
531
"""
532
532
wait(c::Channel)
@@ -552,7 +552,7 @@ julia> istaskdone(task) # task is now unblocked
552
552
true
553
553
```
554
554
"""
555
- function wait (c:: Channel )
555
+ @nospecialize function wait (c:: Channel )
556
556
isready (c) && return
557
557
lock (c)
558
558
try
0 commit comments