diff --git a/tokio/src/sync/mpsc/chan.rs b/tokio/src/sync/mpsc/chan.rs index 15171cb72b4..bb732f499a5 100644 --- a/tokio/src/sync/mpsc/chan.rs +++ b/tokio/src/sync/mpsc/chan.rs @@ -439,24 +439,7 @@ impl Semaphore for (crate::sync::semaphore_ll::Semaphore, usize) { } fn is_closed(&self) -> bool { - // TODO find more efficient way - struct NoopWaker; - impl crate::util::Wake for NoopWaker { - fn wake(self: std::sync::Arc) {} - fn wake_by_ref(_arc_self: &std::sync::Arc) {} - } - let waker = std::sync::Arc::new(NoopWaker); - let waker = crate::util::waker_ref(&waker); - let mut noop_cx = std::task::Context::from_waker(&*waker); - let mut permit = Permit::new(); - match permit.poll_acquire(&mut noop_cx, 1, &self.0) { - Poll::Ready(Err(_)) => true, - Poll::Ready(Ok(())) => { - permit.release(1, &self.0); - false - } - Poll::Pending => false, - } + self.0.is_closed() } fn is_idle(&self) -> bool { diff --git a/tokio/src/sync/semaphore_ll.rs b/tokio/src/sync/semaphore_ll.rs index 25d25ac88ab..f7cecb9690f 100644 --- a/tokio/src/sync/semaphore_ll.rs +++ b/tokio/src/sync/semaphore_ll.rs @@ -177,6 +177,12 @@ impl Semaphore { curr.available_permits() } + /// Checks if semaphore was closed (i.e. if `close` method was called) + pub(crate) fn is_closed(&self) -> bool { + let curr = SemState(self.state.load(Acquire)); + curr.is_closed() + } + /// Tries to acquire the requested number of permits, registering the waiter /// if not enough permits are available. fn poll_acquire(