summaryrefslogtreecommitdiffstats
path: root/tokio-sync
diff options
context:
space:
mode:
authorJon Gjengset <jon@thesquareplanet.com>2019-01-23 18:06:24 -0500
committerCarl Lerche <me@carllerche.com>2019-01-23 15:06:24 -0800
commit0ec8986b0bc60cc96e88ab72e4675d975fbc8f1c (patch)
tree212ce890402643b04c06d3735d5155182791337f /tokio-sync
parentc6f8bdb249083ef5ca3c5f13466015a1cb600bce (diff)
Make reason for try_send errors clearer (#864)
Diffstat (limited to 'tokio-sync')
-rw-r--r--tokio-sync/src/mpsc/bounded.rs18
-rw-r--r--tokio-sync/src/mpsc/unbounded.rs2
-rw-r--r--tokio-sync/tests/mpsc.rs15
3 files changed, 33 insertions, 2 deletions
diff --git a/tokio-sync/src/mpsc/bounded.rs b/tokio-sync/src/mpsc/bounded.rs
index ad5d6eea..f2954448 100644
--- a/tokio-sync/src/mpsc/bounded.rs
+++ b/tokio-sync/src/mpsc/bounded.rs
@@ -239,6 +239,24 @@ impl<T> TrySendError<T> {
pub fn into_inner(self) -> T {
self.value
}
+
+ /// Did the send fail because the channel has been closed?
+ pub fn is_closed(&self) -> bool {
+ if let ErrorKind::Closed = self.kind {
+ true
+ } else {
+ false
+ }
+ }
+
+ /// Did the send fail because the channel was at capacity?
+ pub fn is_full(&self) -> bool {
+ if let ErrorKind::NoCapacity = self.kind {
+ true
+ } else {
+ false
+ }
+ }
}
impl<T: fmt::Debug> fmt::Display for TrySendError<T> {
diff --git a/tokio-sync/src/mpsc/unbounded.rs b/tokio-sync/src/mpsc/unbounded.rs
index 1473c1b9..181ad517 100644
--- a/tokio-sync/src/mpsc/unbounded.rs
+++ b/tokio-sync/src/mpsc/unbounded.rs
@@ -48,7 +48,7 @@ impl<T> fmt::Debug for UnboundedReceiver<T> {
#[derive(Debug)]
pub struct UnboundedSendError(());
-/// Error returned by `UnboundedSender::try_send`.
+/// Returned by `UnboundedSender::try_send` when the channel has been closed.
#[derive(Debug)]
pub struct UnboundedTrySendError<T>(T);
diff --git a/tokio-sync/tests/mpsc.rs b/tokio-sync/tests/mpsc.rs
index ce3fafc1..5b184d4e 100644
--- a/tokio-sync/tests/mpsc.rs
+++ b/tokio-sync/tests/mpsc.rs
@@ -255,7 +255,7 @@ fn try_send_fail() {
tx.try_send("hello").unwrap();
// This should fail
- assert!(tx.try_send("fail").is_err());
+ assert!(tx.try_send("fail").unwrap_err().is_full());
assert_eq!(rx.next().unwrap().unwrap(), "hello");
@@ -301,6 +301,19 @@ fn dropping_rx_closes_channel() {
}
#[test]
+fn dropping_rx_closes_channel_for_try() {
+ let (mut tx, rx) = mpsc::channel(100);
+
+ let msg = Arc::new(());
+ tx.try_send(msg.clone()).unwrap();
+
+ drop(rx);
+ assert!(tx.try_send(msg.clone()).unwrap_err().is_closed());
+
+ assert_eq!(1, Arc::strong_count(&msg));
+}
+
+#[test]
fn unconsumed_messagers_are_dropped() {
let msg = Arc::new(());