crossbeam-channel/src/flavors/never.rs
Line | Count | Source |
1 | | //! Channel that never delivers messages. |
2 | | //! |
3 | | //! Messages cannot be sent into this kind of channel. |
4 | | |
5 | | use std::marker::PhantomData; |
6 | | use std::time::Instant; |
7 | | |
8 | | use crate::context::Context; |
9 | | use crate::err::{RecvTimeoutError, TryRecvError}; |
10 | | use crate::select::{Operation, SelectHandle, Token}; |
11 | | use crate::utils; |
12 | | |
13 | | /// This flavor doesn't need a token. |
14 | | pub(crate) type NeverToken = (); |
15 | | |
16 | | /// Channel that never delivers messages. |
17 | | pub(crate) struct Channel<T> { |
18 | | _marker: PhantomData<T>, |
19 | | } |
20 | | |
21 | | impl<T> Channel<T> { |
22 | | /// Creates a channel that never delivers messages. |
23 | | #[inline] |
24 | 4.09M | pub(crate) fn new() -> Self { |
25 | 4.09M | Channel { |
26 | 4.09M | _marker: PhantomData, |
27 | 4.09M | } |
28 | 4.09M | } <crossbeam_channel::flavors::never::Channel<()>>::new Line | Count | Source | 24 | 39.8k | pub(crate) fn new() -> Self { | 25 | 39.8k | Channel { | 26 | 39.8k | _marker: PhantomData, | 27 | 39.8k | } | 28 | 39.8k | } |
<crossbeam_channel::flavors::never::Channel<()>>::new Line | Count | Source | 24 | 10.0k | pub(crate) fn new() -> Self { | 25 | 10.0k | Channel { | 26 | 10.0k | _marker: PhantomData, | 27 | 10.0k | } | 28 | 10.0k | } |
<crossbeam_channel::flavors::never::Channel<()>>::new Line | Count | Source | 24 | 3.99k | pub(crate) fn new() -> Self { | 25 | 3.99k | Channel { | 26 | 3.99k | _marker: PhantomData, | 27 | 3.99k | } | 28 | 3.99k | } |
<crossbeam_channel::flavors::never::Channel<()>>::new Line | Count | Source | 24 | 19.9k | pub(crate) fn new() -> Self { | 25 | 19.9k | Channel { | 26 | 19.9k | _marker: PhantomData, | 27 | 19.9k | } | 28 | 19.9k | } |
<crossbeam_channel::flavors::never::Channel<i32>>::new Line | Count | Source | 24 | 4 | pub(crate) fn new() -> Self { | 25 | 4 | Channel { | 26 | 4 | _marker: PhantomData, | 27 | 4 | } | 28 | 4 | } |
<crossbeam_channel::flavors::never::Channel<std::time::Instant>>::new Line | Count | Source | 24 | 1 | pub(crate) fn new() -> Self { | 25 | 1 | Channel { | 26 | 1 | _marker: PhantomData, | 27 | 1 | } | 28 | 1 | } |
<crossbeam_channel::flavors::never::Channel<()>>::new Line | Count | Source | 24 | 3.58k | pub(crate) fn new() -> Self { | 25 | 3.58k | Channel { | 26 | 3.58k | _marker: PhantomData, | 27 | 3.58k | } | 28 | 3.58k | } |
<crossbeam_channel::flavors::never::Channel<usize>>::new Line | Count | Source | 24 | 3 | pub(crate) fn new() -> Self { | 25 | 3 | Channel { | 26 | 3 | _marker: PhantomData, | 27 | 3 | } | 28 | 3 | } |
<crossbeam_channel::flavors::never::Channel<()>>::new Line | Count | Source | 24 | 1 | pub(crate) fn new() -> Self { | 25 | 1 | Channel { | 26 | 1 | _marker: PhantomData, | 27 | 1 | } | 28 | 1 | } |
<crossbeam_channel::flavors::never::Channel<()>>::new Line | Count | Source | 24 | 19.9k | pub(crate) fn new() -> Self { | 25 | 19.9k | Channel { | 26 | 19.9k | _marker: PhantomData, | 27 | 19.9k | } | 28 | 19.9k | } |
<crossbeam_channel::flavors::never::Channel<()>>::new Line | Count | Source | 24 | 245k | pub(crate) fn new() -> Self { | 25 | 245k | Channel { | 26 | 245k | _marker: PhantomData, | 27 | 245k | } | 28 | 245k | } |
<crossbeam_channel::flavors::never::Channel<i32>>::new Line | Count | Source | 24 | 2 | pub(crate) fn new() -> Self { | 25 | 2 | Channel { | 26 | 2 | _marker: PhantomData, | 27 | 2 | } | 28 | 2 | } |
<crossbeam_channel::flavors::never::Channel<()>>::new Line | Count | Source | 24 | 3.74M | pub(crate) fn new() -> Self { | 25 | 3.74M | Channel { | 26 | 3.74M | _marker: PhantomData, | 27 | 3.74M | } | 28 | 3.74M | } |
|
29 | | |
30 | | /// Attempts to receive a message without blocking. |
31 | | #[inline] |
32 | 4 | pub(crate) fn try_recv(&self) -> Result<T, TryRecvError> { |
33 | 4 | Err(TryRecvError::Empty) |
34 | 4 | } |
35 | | |
36 | | /// Receives a message from the channel. |
37 | | #[inline] |
38 | 3 | pub(crate) fn recv(&self, deadline: Option<Instant>) -> Result<T, RecvTimeoutError> { |
39 | 3 | utils::sleep_until(deadline); |
40 | 3 | Err(RecvTimeoutError::Timeout) |
41 | 3 | } <crossbeam_channel::flavors::never::Channel<std::time::Instant>>::recv Line | Count | Source | 38 | 1 | pub(crate) fn recv(&self, deadline: Option<Instant>) -> Result<T, RecvTimeoutError> { | 39 | 1 | utils::sleep_until(deadline); | 40 | 1 | Err(RecvTimeoutError::Timeout) | 41 | 1 | } |
<crossbeam_channel::flavors::never::Channel<i32>>::recv Line | Count | Source | 38 | 2 | pub(crate) fn recv(&self, deadline: Option<Instant>) -> Result<T, RecvTimeoutError> { | 39 | 2 | utils::sleep_until(deadline); | 40 | 2 | Err(RecvTimeoutError::Timeout) | 41 | 2 | } |
|
42 | | |
43 | | /// Reads a message from the channel. |
44 | | #[inline] |
45 | | pub(crate) unsafe fn read(&self, _token: &mut Token) -> Result<T, ()> { |
46 | | Err(()) |
47 | | } |
48 | | |
49 | | /// Returns `true` if the channel is empty. |
50 | | #[inline] |
51 | 1 | pub(crate) fn is_empty(&self) -> bool { |
52 | 1 | true |
53 | 1 | } |
54 | | |
55 | | /// Returns `true` if the channel is full. |
56 | | #[inline] |
57 | 1 | pub(crate) fn is_full(&self) -> bool { |
58 | 1 | true |
59 | 1 | } |
60 | | |
61 | | /// Returns the number of messages in the channel. |
62 | | #[inline] |
63 | 1 | pub(crate) fn len(&self) -> usize { |
64 | 1 | 0 |
65 | 1 | } |
66 | | |
67 | | /// Returns the capacity of the channel. |
68 | | #[inline] |
69 | 1 | pub(crate) fn capacity(&self) -> Option<usize> { |
70 | 1 | Some(0) |
71 | 1 | } |
72 | | } |
73 | | |
74 | | impl<T> SelectHandle for Channel<T> { |
75 | | #[inline] |
76 | | fn try_select(&self, _token: &mut Token) -> bool { |
77 | | false |
78 | | } |
79 | | |
80 | | #[inline] |
81 | | fn deadline(&self) -> Option<Instant> { |
82 | | None |
83 | | } |
84 | | |
85 | | #[inline] |
86 | | fn register(&self, _oper: Operation, _cx: &Context) -> bool { |
87 | | self.is_ready() |
88 | | } |
89 | | |
90 | | #[inline] |
91 | | fn unregister(&self, _oper: Operation) {} |
92 | | |
93 | | #[inline] |
94 | | fn accept(&self, token: &mut Token, _cx: &Context) -> bool { |
95 | | self.try_select(token) |
96 | | } |
97 | | |
98 | | #[inline] |
99 | | fn is_ready(&self) -> bool { |
100 | | false |
101 | | } |
102 | | |
103 | | #[inline] |
104 | | fn watch(&self, _oper: Operation, _cx: &Context) -> bool { |
105 | | self.is_ready() |
106 | | } |
107 | | |
108 | | #[inline] |
109 | | fn unwatch(&self, _oper: Operation) {} |
110 | | } |