mirror of
https://github.com/tokio-rs/tokio.git
synced 2025-10-01 12:20:39 +00:00
ci: enable clippy lints (#1335)
This commit is contained in:
parent
f311ac3d4f
commit
fe021e6c00
@ -11,6 +11,12 @@ jobs:
|
|||||||
rust: $(nightly)
|
rust: $(nightly)
|
||||||
name: rustfmt
|
name: rustfmt
|
||||||
|
|
||||||
|
# Apply clippy lints to all crates
|
||||||
|
- template: ci/azure-clippy.yml
|
||||||
|
parameters:
|
||||||
|
rust: $(nightly)
|
||||||
|
name: clippy
|
||||||
|
|
||||||
# Test top level crate
|
# Test top level crate
|
||||||
- template: ci/azure-test-stable.yml
|
- template: ci/azure-test-stable.yml
|
||||||
parameters:
|
parameters:
|
||||||
|
16
ci/azure-clippy.yml
Normal file
16
ci/azure-clippy.yml
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
jobs:
|
||||||
|
- job: ${{ parameters.name }}
|
||||||
|
displayName: Clippy
|
||||||
|
pool:
|
||||||
|
vmImage: ubuntu-16.04
|
||||||
|
steps:
|
||||||
|
- template: azure-install-rust.yml
|
||||||
|
parameters:
|
||||||
|
rust_version: ${{ parameters.rust }}
|
||||||
|
- script: |
|
||||||
|
rustup component add clippy
|
||||||
|
cargo clippy --version
|
||||||
|
displayName: Install clippy
|
||||||
|
- script: |
|
||||||
|
cargo clippy --all --all-features -- -D warnings -A clippy::mutex-atomic
|
||||||
|
displayName: cargo clippy --all
|
@ -4,7 +4,7 @@ use bytes::{BufMut, Bytes, BytesMut};
|
|||||||
use std::io;
|
use std::io;
|
||||||
|
|
||||||
/// A simple `Codec` implementation that just ships bytes around.
|
/// A simple `Codec` implementation that just ships bytes around.
|
||||||
#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
|
#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Default)]
|
||||||
pub struct BytesCodec(());
|
pub struct BytesCodec(());
|
||||||
|
|
||||||
impl BytesCodec {
|
impl BytesCodec {
|
||||||
@ -19,7 +19,7 @@ impl Decoder for BytesCodec {
|
|||||||
type Error = io::Error;
|
type Error = io::Error;
|
||||||
|
|
||||||
fn decode(&mut self, buf: &mut BytesMut) -> Result<Option<BytesMut>, io::Error> {
|
fn decode(&mut self, buf: &mut BytesMut) -> Result<Option<BytesMut>, io::Error> {
|
||||||
if buf.len() > 0 {
|
if !buf.is_empty() {
|
||||||
let len = buf.len();
|
let len = buf.len();
|
||||||
Ok(Some(buf.split_to(len)))
|
Ok(Some(buf.split_to(len)))
|
||||||
} else {
|
} else {
|
||||||
|
@ -153,7 +153,7 @@ pub fn framed_read2_with_buffer<T>(inner: T, mut buf: BytesMut) -> FramedRead2<T
|
|||||||
FramedRead2 {
|
FramedRead2 {
|
||||||
inner,
|
inner,
|
||||||
eof: false,
|
eof: false,
|
||||||
is_readable: buf.len() > 0,
|
is_readable: !buf.is_empty(),
|
||||||
buffer: buf,
|
buffer: buf,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -190,6 +190,12 @@ impl Encoder for LinesCodec {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Default for LinesCodec {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// An error occured while encoding or decoding a line.
|
/// An error occured while encoding or decoding a line.
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum LinesCodecError {
|
pub enum LinesCodecError {
|
||||||
|
@ -348,7 +348,7 @@ impl<P: Park> CurrentThread<P> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Bind `CurrentThread` instance with an execution context.
|
/// Bind `CurrentThread` instance with an execution context.
|
||||||
fn enter<'a>(&'a mut self) -> Entered<'a, P> {
|
fn enter(&mut self) -> Entered<'_, P> {
|
||||||
Entered { executor: self }
|
Entered { executor: self }
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -429,6 +429,12 @@ impl<P: Park> fmt::Debug for CurrentThread<P> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<P: Park + Default> Default for CurrentThread<P> {
|
||||||
|
fn default() -> Self {
|
||||||
|
CurrentThread::new_with_park(P::default())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ===== impl Entered =====
|
// ===== impl Entered =====
|
||||||
|
|
||||||
impl<'a, P: Park> Entered<'a, P> {
|
impl<'a, P: Park> Entered<'a, P> {
|
||||||
@ -483,7 +489,7 @@ impl<'a, P: Park> Entered<'a, P> {
|
|||||||
|
|
||||||
self.tick();
|
self.tick();
|
||||||
|
|
||||||
if let Err(_) = self.executor.park.park() {
|
if self.executor.park.park().is_err() {
|
||||||
panic!("block_on park failed");
|
panic!("block_on park failed");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -550,7 +556,7 @@ impl<'a, P: Park> Entered<'a, P> {
|
|||||||
|
|
||||||
match time {
|
match time {
|
||||||
Some((until, rem)) => {
|
Some((until, rem)) => {
|
||||||
if let Err(_) = self.executor.park.park_timeout(rem) {
|
if self.executor.park.park_timeout(rem).is_err() {
|
||||||
return Err(RunTimeoutError::new(false));
|
return Err(RunTimeoutError::new(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -563,7 +569,7 @@ impl<'a, P: Park> Entered<'a, P> {
|
|||||||
time = Some((until, until - now));
|
time = Some((until, until - now));
|
||||||
}
|
}
|
||||||
None => {
|
None => {
|
||||||
if let Err(_) = self.executor.park.park() {
|
if self.executor.park.park().is_err() {
|
||||||
return Err(RunTimeoutError::new(false));
|
return Err(RunTimeoutError::new(false));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -790,6 +796,8 @@ impl CurrentRunner {
|
|||||||
|
|
||||||
unsafe fn hide_lt<'a>(p: *mut (dyn SpawnLocal + 'a)) -> *mut (dyn SpawnLocal + 'static) {
|
unsafe fn hide_lt<'a>(p: *mut (dyn SpawnLocal + 'a)) -> *mut (dyn SpawnLocal + 'static) {
|
||||||
use std::mem;
|
use std::mem;
|
||||||
|
// false positive: https://github.com/rust-lang/rust-clippy/issues/2906
|
||||||
|
#[allow(clippy::transmute_ptr_to_ptr)]
|
||||||
mem::transmute(p)
|
mem::transmute(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -443,11 +443,9 @@ impl<U> Inner<U> {
|
|||||||
let tail = *self.tail_readiness.get();
|
let tail = *self.tail_readiness.get();
|
||||||
let next = (*tail).next_readiness.load(Acquire);
|
let next = (*tail).next_readiness.load(Acquire);
|
||||||
|
|
||||||
if tail == self.stub() {
|
if tail == self.stub() && next.is_null() {
|
||||||
if next.is_null() {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
@ -566,7 +564,7 @@ impl<U> List<U> {
|
|||||||
|
|
||||||
self.len += 1;
|
self.len += 1;
|
||||||
|
|
||||||
return ptr;
|
ptr
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Pop an element from the front of the list
|
/// Pop an element from the front of the list
|
||||||
@ -618,7 +616,7 @@ impl<U> List<U> {
|
|||||||
|
|
||||||
self.len -= 1;
|
self.len -= 1;
|
||||||
|
|
||||||
return node;
|
node
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -773,7 +771,7 @@ impl<U> Drop for Node<U> {
|
|||||||
fn arc2ptr<T>(ptr: Arc<T>) -> *const T {
|
fn arc2ptr<T>(ptr: Arc<T>) -> *const T {
|
||||||
let addr = &*ptr as *const T;
|
let addr = &*ptr as *const T;
|
||||||
mem::forget(ptr);
|
mem::forget(ptr);
|
||||||
return addr;
|
addr
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn ptr2arc<T>(ptr: *const T) -> Arc<T> {
|
unsafe fn ptr2arc<T>(ptr: *const T) -> Arc<T> {
|
||||||
|
@ -180,6 +180,8 @@ where
|
|||||||
|
|
||||||
unsafe fn hide_lt<'a>(p: *mut (dyn Executor + 'a)) -> *mut (dyn Executor + 'static) {
|
unsafe fn hide_lt<'a>(p: *mut (dyn Executor + 'a)) -> *mut (dyn Executor + 'static) {
|
||||||
use std::mem;
|
use std::mem;
|
||||||
|
// false positive: https://github.com/rust-lang/rust-clippy/issues/2906
|
||||||
|
#[allow(clippy::transmute_ptr_to_ptr)]
|
||||||
mem::transmute(p)
|
mem::transmute(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -218,6 +218,12 @@ impl Park for ParkThread {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Default for ParkThread {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ===== impl UnparkThread =====
|
// ===== impl UnparkThread =====
|
||||||
|
|
||||||
impl Unpark for UnparkThread {
|
impl Unpark for UnparkThread {
|
||||||
|
@ -102,3 +102,9 @@ impl From<StdOpenOptions> for OpenOptions {
|
|||||||
OpenOptions(options)
|
OpenOptions(options)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Default for OpenOptions {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -62,8 +62,8 @@ pub trait AsyncRead {
|
|||||||
/// [`io::Read`]: https://doc.rust-lang.org/std/io/trait.Read.html
|
/// [`io::Read`]: https://doc.rust-lang.org/std/io/trait.Read.html
|
||||||
/// [`poll_read_buf`]: #method.poll_read_buf
|
/// [`poll_read_buf`]: #method.poll_read_buf
|
||||||
unsafe fn prepare_uninitialized_buffer(&self, buf: &mut [u8]) -> bool {
|
unsafe fn prepare_uninitialized_buffer(&self, buf: &mut [u8]) -> bool {
|
||||||
for i in 0..buf.len() {
|
for x in buf {
|
||||||
buf[i] = 0;
|
*x = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
true
|
true
|
||||||
|
@ -66,16 +66,13 @@ pub fn main(args: TokenStream, item: TokenStream) -> TokenStream {
|
|||||||
let mut runtime = RuntimeType::Multi;
|
let mut runtime = RuntimeType::Multi;
|
||||||
|
|
||||||
for arg in args {
|
for arg in args {
|
||||||
match arg {
|
if let syn::NestedMeta::Meta(syn::Meta::Word(ident)) = arg {
|
||||||
syn::NestedMeta::Meta(syn::Meta::Word(ident)) => {
|
|
||||||
match ident.to_string().to_lowercase().as_str() {
|
match ident.to_string().to_lowercase().as_str() {
|
||||||
"multi_thread" => runtime = RuntimeType::Multi,
|
"multi_thread" => runtime = RuntimeType::Multi,
|
||||||
"single_thread" => runtime = RuntimeType::Single,
|
"single_thread" => runtime = RuntimeType::Single,
|
||||||
name => panic!("Unknown attribute {} is specified", name),
|
name => panic!("Unknown attribute {} is specified", name),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => (),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let result = match runtime {
|
let result = match runtime {
|
||||||
|
@ -322,7 +322,7 @@ impl Reactor {
|
|||||||
"loop process - {} events, {}.{:03}s",
|
"loop process - {} events, {}.{:03}s",
|
||||||
events,
|
events,
|
||||||
dur.as_secs(),
|
dur.as_secs(),
|
||||||
dur.subsec_nanos() / 1_000_000
|
dur.subsec_millis()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -352,7 +352,7 @@ impl Reactor {
|
|||||||
|
|
||||||
io.readiness.fetch_or(ready.as_usize(), Relaxed);
|
io.readiness.fetch_or(ready.as_usize(), Relaxed);
|
||||||
|
|
||||||
if ready.is_writable() || platform::is_hup(&ready) {
|
if ready.is_writable() || platform::is_hup(ready) {
|
||||||
wr = io.writer.take_waker();
|
wr = io.writer.take_waker();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -570,8 +570,8 @@ impl Drop for Inner {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Direction {
|
impl Direction {
|
||||||
fn mask(&self) -> mio::Ready {
|
fn mask(self) -> mio::Ready {
|
||||||
match *self {
|
match self {
|
||||||
Direction::Read => {
|
Direction::Read => {
|
||||||
// Everything except writable is signaled through read.
|
// Everything except writable is signaled through read.
|
||||||
mio::Ready::all() - mio::Ready::writable()
|
mio::Ready::all() - mio::Ready::writable()
|
||||||
@ -590,8 +590,8 @@ mod platform {
|
|||||||
UnixReady::hup().into()
|
UnixReady::hup().into()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_hup(ready: &Ready) -> bool {
|
pub fn is_hup(ready: Ready) -> bool {
|
||||||
UnixReady::from(*ready).is_hup()
|
UnixReady::from(ready).is_hup()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -603,7 +603,7 @@ mod platform {
|
|||||||
Ready::empty()
|
Ready::empty()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_hup(_: &Ready) -> bool {
|
pub fn is_hup(_: Ready) -> bool {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -257,7 +257,7 @@ where
|
|||||||
// Cannot clear write readiness
|
// Cannot clear write readiness
|
||||||
assert!(!ready.is_writable(), "cannot clear write readiness");
|
assert!(!ready.is_writable(), "cannot clear write readiness");
|
||||||
assert!(
|
assert!(
|
||||||
!crate::platform::is_hup(&ready),
|
!crate::platform::is_hup(ready),
|
||||||
"cannot clear HUP readiness"
|
"cannot clear HUP readiness"
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -114,7 +114,7 @@ impl Registration {
|
|||||||
where
|
where
|
||||||
T: Evented,
|
T: Evented,
|
||||||
{
|
{
|
||||||
self.register2(io, || HandlePriv::try_current())
|
self.register2(io, HandlePriv::try_current)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Deregister the I/O resource from the reactor it is associated with.
|
/// Deregister the I/O resource from the reactor it is associated with.
|
||||||
@ -416,6 +416,12 @@ impl Registration {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Default for Registration {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
unsafe impl Send for Registration {}
|
unsafe impl Send for Registration {}
|
||||||
unsafe impl Sync for Registration {}
|
unsafe impl Sync for Registration {}
|
||||||
|
|
||||||
|
@ -76,9 +76,9 @@ impl<S: Storage> Registry<S> {
|
|||||||
/// Mark `event_id` as having been delivered, without broadcasting it to
|
/// Mark `event_id` as having been delivered, without broadcasting it to
|
||||||
/// any listeners.
|
/// any listeners.
|
||||||
fn record_event(&self, event_id: EventId) {
|
fn record_event(&self, event_id: EventId) {
|
||||||
self.storage
|
if let Some(event_info) = self.storage.event_info(event_id) {
|
||||||
.event_info(event_id)
|
event_info.pending.store(true, Ordering::SeqCst)
|
||||||
.map(|event_info| event_info.pending.store(true, Ordering::SeqCst));
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Broadcast all previously recorded events to their respective listeners.
|
/// Broadcast all previously recorded events to their respective listeners.
|
||||||
|
@ -132,6 +132,7 @@ impl<T> Receiver<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// TODO: Dox
|
/// TODO: Dox
|
||||||
|
#[allow(clippy::needless_lifetimes)] // false positive: https://github.com/rust-lang/rust-clippy/issues/3988
|
||||||
pub async fn recv(&mut self) -> Option<T> {
|
pub async fn recv(&mut self) -> Option<T> {
|
||||||
use async_util::future::poll_fn;
|
use async_util::future::poll_fn;
|
||||||
|
|
||||||
@ -204,6 +205,7 @@ impl<T> Sender<T> {
|
|||||||
/// ```
|
/// ```
|
||||||
/// unimplemented!();
|
/// unimplemented!();
|
||||||
/// ```
|
/// ```
|
||||||
|
#[allow(clippy::needless_lifetimes)] // false positive: https://github.com/rust-lang/rust-clippy/issues/3988
|
||||||
pub async fn send(&mut self, value: T) -> Result<(), SendError> {
|
pub async fn send(&mut self, value: T) -> Result<(), SendError> {
|
||||||
use async_util::future::poll_fn;
|
use async_util::future::poll_fn;
|
||||||
|
|
||||||
|
@ -93,6 +93,7 @@ impl<T> UnboundedReceiver<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// TODO: Dox
|
/// TODO: Dox
|
||||||
|
#[allow(clippy::needless_lifetimes)] // false positive: https://github.com/rust-lang/rust-clippy/issues/3988
|
||||||
pub async fn recv(&mut self) -> Option<T> {
|
pub async fn recv(&mut self) -> Option<T> {
|
||||||
use async_util::future::poll_fn;
|
use async_util::future::poll_fn;
|
||||||
|
|
||||||
|
@ -220,6 +220,7 @@ impl<T> Sender<T> {
|
|||||||
/// ```
|
/// ```
|
||||||
/// unimplemented!();
|
/// unimplemented!();
|
||||||
/// ```
|
/// ```
|
||||||
|
#[allow(clippy::needless_lifetimes)] // false positive: https://github.com/rust-lang/rust-clippy/issues/3988
|
||||||
pub async fn closed(&mut self) {
|
pub async fn closed(&mut self) {
|
||||||
use async_util::future::poll_fn;
|
use async_util::future::poll_fn;
|
||||||
|
|
||||||
@ -384,10 +385,10 @@ impl<T> Inner<T> {
|
|||||||
None => Ready(Err(RecvError(()))),
|
None => Ready(Err(RecvError(()))),
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return Pending;
|
Pending
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return Pending;
|
Pending
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -498,7 +499,7 @@ impl State {
|
|||||||
State(0)
|
State(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_complete(&self) -> bool {
|
fn is_complete(self) -> bool {
|
||||||
self.0 & VALUE_SENT == VALUE_SENT
|
self.0 & VALUE_SENT == VALUE_SENT
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -510,7 +511,7 @@ impl State {
|
|||||||
State(val)
|
State(val)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_rx_task_set(&self) -> bool {
|
fn is_rx_task_set(self) -> bool {
|
||||||
self.0 & RX_TASK_SET == RX_TASK_SET
|
self.0 & RX_TASK_SET == RX_TASK_SET
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -524,7 +525,7 @@ impl State {
|
|||||||
State(val & !RX_TASK_SET)
|
State(val & !RX_TASK_SET)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_closed(&self) -> bool {
|
fn is_closed(self) -> bool {
|
||||||
self.0 & CLOSED == CLOSED
|
self.0 & CLOSED == CLOSED
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -545,7 +546,7 @@ impl State {
|
|||||||
State(val & !TX_TASK_SET)
|
State(val & !TX_TASK_SET)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_tx_task_set(&self) -> bool {
|
fn is_tx_task_set(self) -> bool {
|
||||||
self.0 & TX_TASK_SET == TX_TASK_SET
|
self.0 & TX_TASK_SET == TX_TASK_SET
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -597,9 +597,9 @@ impl Permit {
|
|||||||
}
|
}
|
||||||
|
|
||||||
match semaphore.poll_permit(Some((cx, self)))? {
|
match semaphore.poll_permit(Some((cx, self)))? {
|
||||||
Ready(v) => {
|
Ready(()) => {
|
||||||
self.state = PermitState::Acquired;
|
self.state = PermitState::Acquired;
|
||||||
Ready(Ok(v))
|
Ready(Ok(()))
|
||||||
}
|
}
|
||||||
Pending => {
|
Pending => {
|
||||||
self.state = PermitState::Waiting;
|
self.state = PermitState::Waiting;
|
||||||
@ -671,6 +671,12 @@ impl Permit {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Default for Permit {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ===== impl AcquireError ====
|
// ===== impl AcquireError ====
|
||||||
|
|
||||||
impl AcquireError {
|
impl AcquireError {
|
||||||
@ -874,8 +880,9 @@ impl WaiterNode {
|
|||||||
NodeState::store(&self.state, Idle, Relaxed);
|
NodeState::store(&self.state, Idle, Relaxed);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn into_non_null(arc: Arc<WaiterNode>) -> NonNull<WaiterNode> {
|
#[allow(clippy::wrong_self_convention)] // https://github.com/rust-lang/rust-clippy/issues/4293
|
||||||
let ptr = Arc::into_raw(arc);
|
fn into_non_null(self: Arc<WaiterNode>) -> NonNull<WaiterNode> {
|
||||||
|
let ptr = Arc::into_raw(self);
|
||||||
unsafe { NonNull::new_unchecked(ptr as *mut _) }
|
unsafe { NonNull::new_unchecked(ptr as *mut _) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -921,7 +928,7 @@ impl SemState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the amount of remaining capacity
|
/// Returns the amount of remaining capacity
|
||||||
fn available_permits(&self) -> usize {
|
fn available_permits(self) -> usize {
|
||||||
if !self.has_available_permits() {
|
if !self.has_available_permits() {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -930,11 +937,11 @@ impl SemState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Returns true if the state has permits that can be claimed by a waiter.
|
/// Returns true if the state has permits that can be claimed by a waiter.
|
||||||
fn has_available_permits(&self) -> bool {
|
fn has_available_permits(self) -> bool {
|
||||||
self.0 & NUM_FLAG == NUM_FLAG
|
self.0 & NUM_FLAG == NUM_FLAG
|
||||||
}
|
}
|
||||||
|
|
||||||
fn has_waiter(&self, stub: &WaiterNode) -> bool {
|
fn has_waiter(self, stub: &WaiterNode) -> bool {
|
||||||
!self.has_available_permits() && !self.is_stub(stub)
|
!self.has_available_permits() && !self.is_stub(stub)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -978,12 +985,12 @@ impl SemState {
|
|||||||
self.0 += permits << NUM_SHIFT;
|
self.0 += permits << NUM_SHIFT;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_waiter(&self) -> bool {
|
fn is_waiter(self) -> bool {
|
||||||
self.0 & NUM_FLAG == 0
|
self.0 & NUM_FLAG == 0
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the waiter, if one is set.
|
/// Returns the waiter, if one is set.
|
||||||
fn waiter(&self) -> Option<NonNull<WaiterNode>> {
|
fn waiter(self) -> Option<NonNull<WaiterNode>> {
|
||||||
if self.is_waiter() {
|
if self.is_waiter() {
|
||||||
let waiter = NonNull::new(self.as_ptr()).expect("null pointer stored");
|
let waiter = NonNull::new(self.as_ptr()).expect("null pointer stored");
|
||||||
|
|
||||||
@ -994,7 +1001,7 @@ impl SemState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Assumes `self` represents a pointer
|
/// Assumes `self` represents a pointer
|
||||||
fn as_ptr(&self) -> *mut WaiterNode {
|
fn as_ptr(self) -> *mut WaiterNode {
|
||||||
(self.0 & !CLOSED_FLAG) as *mut WaiterNode
|
(self.0 & !CLOSED_FLAG) as *mut WaiterNode
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1009,7 +1016,7 @@ impl SemState {
|
|||||||
self.0 = waiter;
|
self.0 = waiter;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_stub(&self, stub: &WaiterNode) -> bool {
|
fn is_stub(self, stub: &WaiterNode) -> bool {
|
||||||
self.as_ptr() as usize == stub as *const _ as usize
|
self.as_ptr() as usize == stub as *const _ as usize
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1021,7 +1028,7 @@ impl SemState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Swap the values
|
/// Swap the values
|
||||||
fn swap(&self, cell: &AtomicUsize, ordering: Ordering) -> SemState {
|
fn swap(self, cell: &AtomicUsize, ordering: Ordering) -> SemState {
|
||||||
let prev = SemState(cell.swap(self.to_usize(), ordering));
|
let prev = SemState(cell.swap(self.to_usize(), ordering));
|
||||||
debug_assert_eq!(prev.is_closed(), self.is_closed());
|
debug_assert_eq!(prev.is_closed(), self.is_closed());
|
||||||
prev
|
prev
|
||||||
@ -1029,7 +1036,7 @@ impl SemState {
|
|||||||
|
|
||||||
/// Compare and exchange the current value into the provided cell
|
/// Compare and exchange the current value into the provided cell
|
||||||
fn compare_exchange(
|
fn compare_exchange(
|
||||||
&self,
|
self,
|
||||||
cell: &AtomicUsize,
|
cell: &AtomicUsize,
|
||||||
prev: SemState,
|
prev: SemState,
|
||||||
success: Ordering,
|
success: Ordering,
|
||||||
@ -1054,12 +1061,12 @@ impl SemState {
|
|||||||
SemState(value)
|
SemState(value)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_closed(&self) -> bool {
|
fn is_closed(self) -> bool {
|
||||||
self.0 & CLOSED_FLAG == CLOSED_FLAG
|
self.0 & CLOSED_FLAG == CLOSED_FLAG
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Converts the state into a `usize` representation.
|
/// Converts the state into a `usize` representation.
|
||||||
fn to_usize(&self) -> usize {
|
fn to_usize(self) -> usize {
|
||||||
self.0
|
self.0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1108,7 +1115,7 @@ impl NodeState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn compare_exchange(
|
fn compare_exchange(
|
||||||
&self,
|
self,
|
||||||
cell: &AtomicUsize,
|
cell: &AtomicUsize,
|
||||||
prev: NodeState,
|
prev: NodeState,
|
||||||
success: Ordering,
|
success: Ordering,
|
||||||
@ -1120,16 +1127,16 @@ impl NodeState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Returns `true` if `self` represents a queued state.
|
/// Returns `true` if `self` represents a queued state.
|
||||||
fn is_queued(&self) -> bool {
|
fn is_queued(self) -> bool {
|
||||||
use self::NodeState::*;
|
use self::NodeState::*;
|
||||||
|
|
||||||
match *self {
|
match self {
|
||||||
Queued | QueuedWaiting => true,
|
Queued | QueuedWaiting => true,
|
||||||
_ => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn to_usize(&self) -> usize {
|
fn to_usize(self) -> usize {
|
||||||
*self as usize
|
self as usize
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -270,6 +270,7 @@ impl<T: Clone> Receiver<T> {
|
|||||||
/// Attempts to clone the latest value sent via the channel.
|
/// Attempts to clone the latest value sent via the channel.
|
||||||
///
|
///
|
||||||
/// This is equivalent to calling `Clone` on the value returned by `poll_ref`.
|
/// This is equivalent to calling `Clone` on the value returned by `poll_ref`.
|
||||||
|
#[allow(clippy::map_clone)] // false positive: https://github.com/rust-lang/rust-clippy/issues/3274
|
||||||
pub fn poll_next(&mut self, cx: &mut Context<'_>) -> Poll<Option<T>> {
|
pub fn poll_next(&mut self, cx: &mut Context<'_>) -> Poll<Option<T>> {
|
||||||
let item = ready!(self.poll_ref(cx));
|
let item = ready!(self.poll_ref(cx));
|
||||||
Ready(item.map(|v_ref| v_ref.clone()))
|
Ready(item.map(|v_ref| v_ref.clone()))
|
||||||
@ -280,6 +281,7 @@ impl<T: Clone> Receiver<T> {
|
|||||||
impl<T: Clone> futures_core::Stream for Receiver<T> {
|
impl<T: Clone> futures_core::Stream for Receiver<T> {
|
||||||
type Item = T;
|
type Item = T;
|
||||||
|
|
||||||
|
#[allow(clippy::map_clone)] // false positive: https://github.com/rust-lang/rust-clippy/issues/3274
|
||||||
fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<T>> {
|
fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<T>> {
|
||||||
let item = ready!(self.poll_ref(cx));
|
let item = ready!(self.poll_ref(cx));
|
||||||
Ready(item.map(|v_ref| v_ref.clone()))
|
Ready(item.map(|v_ref| v_ref.clone()))
|
||||||
@ -376,7 +378,7 @@ impl<T> futures_sink::Sink<T> for Sender<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn start_send(self: Pin<&mut Self>, item: T) -> Result<(), Self::Error> {
|
fn start_send(self: Pin<&mut Self>, item: T) -> Result<(), Self::Error> {
|
||||||
let _ = self.as_ref().get_ref().broadcast(item)?;
|
self.as_ref().get_ref().broadcast(item)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -124,6 +124,7 @@ impl TcpListener {
|
|||||||
/// ```
|
/// ```
|
||||||
/// unimplemented!();
|
/// unimplemented!();
|
||||||
/// ```
|
/// ```
|
||||||
|
#[allow(clippy::needless_lifetimes)] // false positive: https://github.com/rust-lang/rust-clippy/issues/3988
|
||||||
pub async fn accept(&mut self) -> io::Result<(TcpStream, SocketAddr)> {
|
pub async fn accept(&mut self) -> io::Result<(TcpStream, SocketAddr)> {
|
||||||
use async_util::future::poll_fn;
|
use async_util::future::poll_fn;
|
||||||
poll_fn(|cx| self.poll_accept(cx)).await
|
poll_fn(|cx| self.poll_accept(cx)).await
|
||||||
|
@ -53,9 +53,9 @@ pub struct TcpStreamReadHalfMut<'a>(&'a TcpStream);
|
|||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct TcpStreamWriteHalfMut<'a>(&'a TcpStream);
|
pub struct TcpStreamWriteHalfMut<'a>(&'a TcpStream);
|
||||||
|
|
||||||
pub(crate) fn split_mut<'a>(
|
pub(crate) fn split_mut(
|
||||||
stream: &'a mut TcpStream,
|
stream: &mut TcpStream,
|
||||||
) -> (TcpStreamReadHalfMut<'a>, TcpStreamWriteHalfMut<'a>) {
|
) -> (TcpStreamReadHalfMut<'_>, TcpStreamWriteHalfMut<'_>) {
|
||||||
(
|
(
|
||||||
TcpStreamReadHalfMut(&*stream),
|
TcpStreamReadHalfMut(&*stream),
|
||||||
TcpStreamWriteHalfMut(&*stream),
|
TcpStreamWriteHalfMut(&*stream),
|
||||||
|
@ -732,7 +732,7 @@ impl TcpStream {
|
|||||||
///
|
///
|
||||||
/// See the module level documenation of [`split`](super::split) for more
|
/// See the module level documenation of [`split`](super::split) for more
|
||||||
/// details.
|
/// details.
|
||||||
pub fn split_mut<'a>(&'a mut self) -> (TcpStreamReadHalfMut<'a>, TcpStreamWriteHalfMut<'a>) {
|
pub fn split_mut(&mut self) -> (TcpStreamReadHalfMut<'_>, TcpStreamWriteHalfMut<'_>) {
|
||||||
split_mut(self)
|
split_mut(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -138,6 +138,12 @@ impl MockClock {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Default for MockClock {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Handle {
|
impl Handle {
|
||||||
pub(self) fn new(timer: Timer<MockPark>, time: MockTime) -> Self {
|
pub(self) fn new(timer: Timer<MockPark>, time: MockTime) -> Self {
|
||||||
Handle { timer, time }
|
Handle { timer, time }
|
||||||
|
@ -187,12 +187,9 @@ impl Inner {
|
|||||||
return Err(io::ErrorKind::BrokenPipe.into());
|
return Err(io::ErrorKind::BrokenPipe.into());
|
||||||
}
|
}
|
||||||
|
|
||||||
match self.action() {
|
if let Some(&mut Action::Wait(..)) = self.action() {
|
||||||
Some(&mut Action::Wait(..)) => {
|
|
||||||
return Err(io::ErrorKind::WouldBlock.into());
|
return Err(io::ErrorKind::WouldBlock.into());
|
||||||
}
|
}
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
|
|
||||||
for i in 0..self.actions.len() {
|
for i in 0..self.actions.len() {
|
||||||
match self.actions[i] {
|
match self.actions[i] {
|
||||||
|
@ -98,6 +98,12 @@ impl MockTask {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Default for MockTask {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl ThreadWaker {
|
impl ThreadWaker {
|
||||||
fn new() -> Self {
|
fn new() -> Self {
|
||||||
ThreadWaker {
|
ThreadWaker {
|
||||||
|
@ -420,3 +420,9 @@ impl fmt::Debug for Builder {
|
|||||||
.finish()
|
.finish()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Default for Builder {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -14,9 +14,12 @@ pub(crate) struct Config {
|
|||||||
pub around_worker: Option<Callback>,
|
pub around_worker: Option<Callback>,
|
||||||
pub after_start: Option<Arc<dyn Fn() + Send + Sync>>,
|
pub after_start: Option<Arc<dyn Fn() + Send + Sync>>,
|
||||||
pub before_stop: Option<Arc<dyn Fn() + Send + Sync>>,
|
pub before_stop: Option<Arc<dyn Fn() + Send + Sync>>,
|
||||||
pub panic_handler: Option<Arc<dyn Fn(Box<dyn Any + Send>) + Send + Sync>>,
|
pub panic_handler: Option<PanicHandler>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Define type alias to avoid clippy::type_complexity.
|
||||||
|
type PanicHandler = Arc<dyn Fn(Box<dyn Any + Send>) + Send + Sync>;
|
||||||
|
|
||||||
/// Max number of workers that can be part of a pool. This is the most that can
|
/// Max number of workers that can be part of a pool. This is the most that can
|
||||||
/// fit in the scheduler state. Note, that this is the max number of **active**
|
/// fit in the scheduler state. Note, that this is the max number of **active**
|
||||||
/// threads. There can be more standby threads.
|
/// threads. There can be more standby threads.
|
||||||
|
@ -72,6 +72,12 @@ impl Park for DefaultPark {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Default for DefaultPark {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ===== impl DefaultUnpark =====
|
// ===== impl DefaultUnpark =====
|
||||||
|
|
||||||
impl Unpark for DefaultUnpark {
|
impl Unpark for DefaultUnpark {
|
||||||
|
@ -235,12 +235,12 @@ impl Backup {
|
|||||||
|
|
||||||
impl State {
|
impl State {
|
||||||
/// Returns a new, default, thread `State`
|
/// Returns a new, default, thread `State`
|
||||||
pub fn new() -> State {
|
pub(crate) fn new() -> State {
|
||||||
State(0)
|
State(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns true if the thread entry is pushed in the sleeper stack
|
/// Returns true if the thread entry is pushed in the sleeper stack
|
||||||
pub fn is_pushed(&self) -> bool {
|
pub(crate) fn is_pushed(self) -> bool {
|
||||||
self.0 & PUSHED == PUSHED
|
self.0 & PUSHED == PUSHED
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -248,19 +248,19 @@ impl State {
|
|||||||
self.0 &= !PUSHED;
|
self.0 &= !PUSHED;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_running(&self) -> bool {
|
pub(crate) fn is_running(self) -> bool {
|
||||||
self.0 & RUNNING == RUNNING
|
self.0 & RUNNING == RUNNING
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_running(&mut self) {
|
pub(crate) fn set_running(&mut self) {
|
||||||
self.0 |= RUNNING;
|
self.0 |= RUNNING;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn unset_running(&mut self) {
|
pub(crate) fn unset_running(&mut self) {
|
||||||
self.0 &= !RUNNING;
|
self.0 &= !RUNNING;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_terminated(&self) -> bool {
|
pub(crate) fn is_terminated(self) -> bool {
|
||||||
self.0 & TERMINATED == TERMINATED
|
self.0 & TERMINATED == TERMINATED
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,10 +93,7 @@ impl BackupStack {
|
|||||||
/// * `Err(_)` is returned if the pool has been shutdown.
|
/// * `Err(_)` is returned if the pool has been shutdown.
|
||||||
pub fn pop(&self, entries: &[Backup], terminate: bool) -> Result<Option<BackupId>, ()> {
|
pub fn pop(&self, entries: &[Backup], terminate: bool) -> Result<Option<BackupId>, ()> {
|
||||||
// Figure out the empty value
|
// Figure out the empty value
|
||||||
let terminal = match terminate {
|
let terminal = if terminate { TERMINATED } else { EMPTY };
|
||||||
true => TERMINATED,
|
|
||||||
false => EMPTY,
|
|
||||||
};
|
|
||||||
|
|
||||||
let mut state: State = self.state.load(Acquire).into();
|
let mut state: State = self.state.load(Acquire).into();
|
||||||
|
|
||||||
@ -164,7 +161,7 @@ impl State {
|
|||||||
State(EMPTY.0)
|
State(EMPTY.0)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn head(&self) -> BackupId {
|
fn head(self) -> BackupId {
|
||||||
BackupId(self.0 & STACK_MASK)
|
BackupId(self.0 & STACK_MASK)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,19 +33,19 @@ pub(crate) const MAX_FUTURES: usize = usize::MAX >> NUM_FUTURES_OFFSET;
|
|||||||
|
|
||||||
impl State {
|
impl State {
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn new() -> State {
|
pub(crate) fn new() -> State {
|
||||||
State(0)
|
State(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the number of futures still pending completion.
|
/// Returns the number of futures still pending completion.
|
||||||
pub fn num_futures(&self) -> usize {
|
pub(crate) fn num_futures(self) -> usize {
|
||||||
self.0 >> NUM_FUTURES_OFFSET
|
self.0 >> NUM_FUTURES_OFFSET
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Increment the number of futures pending completion.
|
/// Increment the number of futures pending completion.
|
||||||
///
|
///
|
||||||
/// Returns false on failure.
|
/// Returns false on failure.
|
||||||
pub fn inc_num_futures(&mut self) {
|
pub(crate) fn inc_num_futures(&mut self) {
|
||||||
debug_assert!(self.num_futures() < MAX_FUTURES);
|
debug_assert!(self.num_futures() < MAX_FUTURES);
|
||||||
debug_assert!(self.lifecycle() < Lifecycle::ShutdownNow);
|
debug_assert!(self.lifecycle() < Lifecycle::ShutdownNow);
|
||||||
|
|
||||||
@ -53,7 +53,7 @@ impl State {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Decrement the number of futures pending completion.
|
/// Decrement the number of futures pending completion.
|
||||||
pub fn dec_num_futures(&mut self) {
|
pub(crate) fn dec_num_futures(&mut self) {
|
||||||
let num_futures = self.num_futures();
|
let num_futures = self.num_futures();
|
||||||
|
|
||||||
if num_futures == 0 {
|
if num_futures == 0 {
|
||||||
@ -69,19 +69,19 @@ impl State {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Set the number of futures pending completion to zero
|
/// Set the number of futures pending completion to zero
|
||||||
pub fn clear_num_futures(&mut self) {
|
pub(crate) fn clear_num_futures(&mut self) {
|
||||||
self.0 = self.0 & LIFECYCLE_MASK;
|
self.0 &= LIFECYCLE_MASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn lifecycle(&self) -> Lifecycle {
|
pub(crate) fn lifecycle(self) -> Lifecycle {
|
||||||
(self.0 & LIFECYCLE_MASK).into()
|
(self.0 & LIFECYCLE_MASK).into()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_lifecycle(&mut self, val: Lifecycle) {
|
pub(crate) fn set_lifecycle(&mut self, val: Lifecycle) {
|
||||||
self.0 = (self.0 & NUM_FUTURES_MASK) | (val as usize);
|
self.0 = (self.0 & NUM_FUTURES_MASK) | (val as usize);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_terminated(&self) -> bool {
|
pub(crate) fn is_terminated(self) -> bool {
|
||||||
self.lifecycle() == Lifecycle::ShutdownNow && self.num_futures() == 0
|
self.lifecycle() == Lifecycle::ShutdownNow && self.num_futures() == 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -393,7 +393,7 @@ impl State {
|
|||||||
State((capacity << NUM_SHIFT) | NUM_FLAG)
|
State((capacity << NUM_SHIFT) | NUM_FLAG)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn remaining_capacity(&self) -> usize {
|
fn remaining_capacity(self) -> usize {
|
||||||
if !self.has_remaining_capacity() {
|
if !self.has_remaining_capacity() {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -401,15 +401,15 @@ impl State {
|
|||||||
self.0 >> 1
|
self.0 >> 1
|
||||||
}
|
}
|
||||||
|
|
||||||
fn has_remaining_capacity(&self) -> bool {
|
fn has_remaining_capacity(self) -> bool {
|
||||||
self.0 & NUM_FLAG == NUM_FLAG
|
self.0 & NUM_FLAG == NUM_FLAG
|
||||||
}
|
}
|
||||||
|
|
||||||
fn has_task(&self, stub: &Task) -> bool {
|
fn has_task(self, stub: &Task) -> bool {
|
||||||
!(self.has_remaining_capacity() || self.is_stub(stub))
|
!(self.has_remaining_capacity() || self.is_stub(stub))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_stub(&self, stub: &Task) -> bool {
|
fn is_stub(self, stub: &Task) -> bool {
|
||||||
self.0 == stub as *const _ as usize
|
self.0 == stub as *const _ as usize
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -452,11 +452,11 @@ impl State {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_ptr(&self) -> bool {
|
fn is_ptr(self) -> bool {
|
||||||
self.0 & NUM_FLAG == 0
|
self.0 & NUM_FLAG == 0
|
||||||
}
|
}
|
||||||
|
|
||||||
fn ptr(&self) -> Option<*const Task> {
|
fn ptr(self) -> Option<*const Task> {
|
||||||
if self.is_ptr() {
|
if self.is_ptr() {
|
||||||
Some(self.0 as *const Task)
|
Some(self.0 as *const Task)
|
||||||
} else {
|
} else {
|
||||||
|
@ -18,26 +18,26 @@ const ALLOCATED: usize = 0b10;
|
|||||||
|
|
||||||
impl BlockingState {
|
impl BlockingState {
|
||||||
/// Create a new, default, `BlockingState`.
|
/// Create a new, default, `BlockingState`.
|
||||||
pub fn new() -> BlockingState {
|
pub(crate) fn new() -> BlockingState {
|
||||||
BlockingState(0)
|
BlockingState(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns `true` if the state represents the associated task being queued
|
/// Returns `true` if the state represents the associated task being queued
|
||||||
/// in the pending blocking capacity channel
|
/// in the pending blocking capacity channel
|
||||||
pub fn is_queued(&self) -> bool {
|
pub(crate) fn is_queued(&self) -> bool {
|
||||||
self.0 & QUEUED == QUEUED
|
self.0 & QUEUED == QUEUED
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Toggle the queued flag
|
/// Toggle the queued flag
|
||||||
///
|
///
|
||||||
/// Returns the state before the flag has been toggled.
|
/// Returns the state before the flag has been toggled.
|
||||||
pub fn toggle_queued(state: &AtomicUsize, ordering: Ordering) -> BlockingState {
|
pub(crate) fn toggle_queued(state: &AtomicUsize, ordering: Ordering) -> BlockingState {
|
||||||
state.fetch_xor(QUEUED, ordering).into()
|
state.fetch_xor(QUEUED, ordering).into()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns `true` if the state represents the associated task having been
|
/// Returns `true` if the state represents the associated task having been
|
||||||
/// allocated capacity to block.
|
/// allocated capacity to block.
|
||||||
pub fn is_allocated(&self) -> bool {
|
pub(crate) fn is_allocated(&self) -> bool {
|
||||||
self.0 & ALLOCATED == ALLOCATED
|
self.0 & ALLOCATED == ALLOCATED
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -46,7 +46,7 @@ impl BlockingState {
|
|||||||
///
|
///
|
||||||
/// If this returns `true`, then the task has the ability to block for the
|
/// If this returns `true`, then the task has the ability to block for the
|
||||||
/// duration of the `poll`.
|
/// duration of the `poll`.
|
||||||
pub fn consume_allocation(state: &AtomicUsize, ordering: Ordering) -> CanBlock {
|
pub(crate) fn consume_allocation(state: &AtomicUsize, ordering: Ordering) -> CanBlock {
|
||||||
let state: Self = state.fetch_and(!ALLOCATED, ordering).into();
|
let state: Self = state.fetch_and(!ALLOCATED, ordering).into();
|
||||||
|
|
||||||
if state.is_allocated() {
|
if state.is_allocated() {
|
||||||
@ -58,7 +58,7 @@ impl BlockingState {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn notify_blocking(state: &AtomicUsize, ordering: Ordering) {
|
pub(crate) fn notify_blocking(state: &AtomicUsize, ordering: Ordering) {
|
||||||
let prev: Self = state.fetch_xor(ALLOCATED | QUEUED, ordering).into();
|
let prev: Self = state.fetch_xor(ALLOCATED | QUEUED, ordering).into();
|
||||||
|
|
||||||
debug_assert!(prev.is_queued());
|
debug_assert!(prev.is_queued());
|
||||||
|
@ -134,12 +134,12 @@ impl Task {
|
|||||||
|
|
||||||
let mut g = Guard(fut, true);
|
let mut g = Guard(fut, true);
|
||||||
|
|
||||||
let mut waker = arc_waker::waker(Arc::new(Waker {
|
let waker = arc_waker::waker(Arc::new(Waker {
|
||||||
task: me.clone(),
|
task: me.clone(),
|
||||||
pool: pool.clone(),
|
pool: pool.clone(),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
let mut cx = Context::from_waker(&mut waker);
|
let mut cx = Context::from_waker(&waker);
|
||||||
|
|
||||||
let ret = g.0.as_mut().unwrap().as_mut().poll(&mut cx);
|
let ret = g.0.as_mut().unwrap().as_mut().poll(&mut cx);
|
||||||
|
|
||||||
@ -239,7 +239,7 @@ impl Task {
|
|||||||
pub fn schedule(me: &Arc<Self>, pool: &Arc<Pool>) {
|
pub fn schedule(me: &Arc<Self>, pool: &Arc<Pool>) {
|
||||||
if me.schedule2() {
|
if me.schedule2() {
|
||||||
let task = me.clone();
|
let task = me.clone();
|
||||||
let _ = pool.submit(task, &pool);
|
pool.submit(task, &pool);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,11 +27,11 @@ impl State {
|
|||||||
///
|
///
|
||||||
/// Tasks start in the scheduled state as they are immediately scheduled on
|
/// Tasks start in the scheduled state as they are immediately scheduled on
|
||||||
/// creation.
|
/// creation.
|
||||||
pub fn new() -> State {
|
pub(crate) fn new() -> State {
|
||||||
State::Scheduled
|
State::Scheduled
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn stub() -> State {
|
pub(crate) fn stub() -> State {
|
||||||
State::Idle
|
State::Idle
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -198,6 +198,12 @@ impl Drop for ThreadPool {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Default for ThreadPool {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* TODO: Bring back
|
* TODO: Bring back
|
||||||
|
|
||||||
|
@ -622,7 +622,7 @@ impl Worker {
|
|||||||
|
|
||||||
// We obtained permission to push the worker into the
|
// We obtained permission to push the worker into the
|
||||||
// sleeper queue.
|
// sleeper queue.
|
||||||
if let Err(_) = self.pool.push_sleeper(self.id.0) {
|
if self.pool.push_sleeper(self.id.0).is_err() {
|
||||||
trace!(" sleeping -- push to stack failed; idx={}", self.id.0);
|
trace!(" sleeping -- push to stack failed; idx={}", self.id.0);
|
||||||
// The push failed due to the pool being terminated.
|
// The push failed due to the pool being terminated.
|
||||||
//
|
//
|
||||||
|
@ -120,10 +120,7 @@ impl Stack {
|
|||||||
terminate: bool,
|
terminate: bool,
|
||||||
) -> Option<(usize, worker::State)> {
|
) -> Option<(usize, worker::State)> {
|
||||||
// Figure out the empty value
|
// Figure out the empty value
|
||||||
let terminal = match terminate {
|
let terminal = if terminate { TERMINATED } else { EMPTY };
|
||||||
true => TERMINATED,
|
|
||||||
false => EMPTY,
|
|
||||||
};
|
|
||||||
|
|
||||||
// If terminating, the max lifecycle *must* be `Signaled`, which is the
|
// If terminating, the max lifecycle *must* be `Signaled`, which is the
|
||||||
// highest lifecycle. By passing the greatest possible lifecycle value,
|
// highest lifecycle. By passing the greatest possible lifecycle value,
|
||||||
@ -215,7 +212,7 @@ impl State {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn head(&self) -> usize {
|
fn head(self) -> usize {
|
||||||
self.0 & STACK_MASK
|
self.0 & STACK_MASK
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@ pub(crate) enum Lifecycle {
|
|||||||
|
|
||||||
impl State {
|
impl State {
|
||||||
/// Returns true if the worker entry is pushed in the sleeper stack
|
/// Returns true if the worker entry is pushed in the sleeper stack
|
||||||
pub fn is_pushed(&self) -> bool {
|
pub fn is_pushed(self) -> bool {
|
||||||
self.0 & PUSHED_MASK == PUSHED_MASK
|
self.0 & PUSHED_MASK == PUSHED_MASK
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -43,7 +43,7 @@ impl State {
|
|||||||
self.0 |= PUSHED_MASK
|
self.0 |= PUSHED_MASK
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_notified(&self) -> bool {
|
pub fn is_notified(self) -> bool {
|
||||||
use self::Lifecycle::*;
|
use self::Lifecycle::*;
|
||||||
|
|
||||||
match self.lifecycle() {
|
match self.lifecycle() {
|
||||||
@ -52,7 +52,7 @@ impl State {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn lifecycle(&self) -> Lifecycle {
|
pub fn lifecycle(self) -> Lifecycle {
|
||||||
Lifecycle::from(self.0 & LIFECYCLE_MASK)
|
Lifecycle::from(self.0 & LIFECYCLE_MASK)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,7 +60,7 @@ impl State {
|
|||||||
self.0 = (self.0 & !LIFECYCLE_MASK) | (val as usize)
|
self.0 = (self.0 & !LIFECYCLE_MASK) | (val as usize)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_signaled(&self) -> bool {
|
pub fn is_signaled(self) -> bool {
|
||||||
self.lifecycle() == Lifecycle::Signaled
|
self.lifecycle() == Lifecycle::Signaled
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,136 +0,0 @@
|
|||||||
use crate::clock::Now;
|
|
||||||
use crate::timer;
|
|
||||||
use std::cell::Cell;
|
|
||||||
use std::fmt;
|
|
||||||
use std::sync::Arc;
|
|
||||||
use std::time::Instant;
|
|
||||||
|
|
||||||
/// A handle to a source of time.
|
|
||||||
///
|
|
||||||
/// `Clock` instances return [`Instant`] values corresponding to "now". The source
|
|
||||||
/// of these values is configurable. The default source is [`Instant::now`].
|
|
||||||
///
|
|
||||||
/// [`Instant`]: https://doc.rust-lang.org/std/time/struct.Instant.html
|
|
||||||
/// [`Instant::now`]: https://doc.rust-lang.org/std/time/struct.Instant.html#method.now
|
|
||||||
#[derive(Default, Clone)]
|
|
||||||
pub struct Clock {
|
|
||||||
now: Option<Arc<dyn Now>>,
|
|
||||||
}
|
|
||||||
|
|
||||||
thread_local! {
|
|
||||||
/// Thread-local tracking the current clock
|
|
||||||
static CLOCK: Cell<Option<*const Clock>> = Cell::new(None)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns an `Instant` corresponding to "now".
|
|
||||||
///
|
|
||||||
/// This function delegates to the source of time configured for the current
|
|
||||||
/// execution context. By default, this is `Instant::now()`.
|
|
||||||
///
|
|
||||||
/// Note that, because the source of time is configurable, it is possible to
|
|
||||||
/// observe non-monotonic behavior when calling `now` from different
|
|
||||||
/// executors.
|
|
||||||
///
|
|
||||||
/// See [module](index.html) level documentation for more details.
|
|
||||||
///
|
|
||||||
/// # Examples
|
|
||||||
///
|
|
||||||
/// ```
|
|
||||||
/// # use tokio_timer::clock;
|
|
||||||
/// let now = clock::now();
|
|
||||||
/// ```
|
|
||||||
pub fn now() -> Instant {
|
|
||||||
CLOCK.with(|current| match current.get() {
|
|
||||||
Some(ptr) => unsafe { (*ptr).now() },
|
|
||||||
None => Instant::now(),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Clock {
|
|
||||||
/// Return a new `Clock` instance that uses the current execution context's
|
|
||||||
/// source of time.
|
|
||||||
pub fn new() -> Clock {
|
|
||||||
CLOCK.with(|current| match current.get() {
|
|
||||||
Some(ptr) => unsafe { (*ptr).clone() },
|
|
||||||
None => Clock::system(),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Return a new `Clock` instance that uses `now` as the source of time.
|
|
||||||
pub fn new_with_now<T: Now>(now: T) -> Clock {
|
|
||||||
Clock {
|
|
||||||
now: Some(Arc::new(now)),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Return a new `Clock` instance that uses [`Instant::now`] as the source
|
|
||||||
/// of time.
|
|
||||||
///
|
|
||||||
/// [`Instant::now`]: https://doc.rust-lang.org/std/time/struct.Instant.html#method.now
|
|
||||||
pub fn system() -> Clock {
|
|
||||||
Clock { now: None }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns an instant corresponding to "now" by using the instance's source
|
|
||||||
/// of time.
|
|
||||||
pub fn now(&self) -> Instant {
|
|
||||||
match self.now {
|
|
||||||
Some(ref now) => now.now(),
|
|
||||||
None => Instant::now(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[allow(deprecated)]
|
|
||||||
impl timer::Now for Clock {
|
|
||||||
fn now(&mut self) -> Instant {
|
|
||||||
Clock::now(self)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl fmt::Debug for Clock {
|
|
||||||
fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
||||||
fmt.debug_struct("Clock")
|
|
||||||
.field("now", {
|
|
||||||
if self.now.is_some() {
|
|
||||||
&"Some(Arc<Now>)"
|
|
||||||
} else {
|
|
||||||
&"None"
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.finish()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Set the default clock for the duration of the closure.
|
|
||||||
///
|
|
||||||
/// # Panics
|
|
||||||
///
|
|
||||||
/// This function panics if there already is a default clock set.
|
|
||||||
pub fn with_default<F, R>(clock: &Clock, f: F) -> R
|
|
||||||
where
|
|
||||||
F: FnOnce() -> R,
|
|
||||||
{
|
|
||||||
CLOCK.with(|cell| {
|
|
||||||
assert!(
|
|
||||||
cell.get().is_none(),
|
|
||||||
"default clock already set for execution context"
|
|
||||||
);
|
|
||||||
|
|
||||||
// Ensure that the clock is removed from the thread-local context
|
|
||||||
// when leaving the scope. This handles cases that involve panicking.
|
|
||||||
struct Reset<'a>(&'a Cell<Option<*const Clock>>);
|
|
||||||
|
|
||||||
impl<'a> Drop for Reset<'a> {
|
|
||||||
fn drop(&mut self) {
|
|
||||||
self.0.set(None);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let _reset = Reset(cell);
|
|
||||||
|
|
||||||
cell.set(Some(clock as *const Clock));
|
|
||||||
|
|
||||||
f()
|
|
||||||
})
|
|
||||||
}
|
|
@ -16,8 +16,142 @@
|
|||||||
//! [`Instant::now`]: https://doc.rust-lang.org/std/time/struct.Instant.html#method.now
|
//! [`Instant::now`]: https://doc.rust-lang.org/std/time/struct.Instant.html#method.now
|
||||||
//! [`with_default`]: fn.with_default.html
|
//! [`with_default`]: fn.with_default.html
|
||||||
|
|
||||||
mod clock;
|
|
||||||
mod now;
|
mod now;
|
||||||
|
|
||||||
pub use self::clock::{now, with_default, Clock};
|
|
||||||
pub use self::now::Now;
|
pub use self::now::Now;
|
||||||
|
|
||||||
|
use crate::timer;
|
||||||
|
use std::cell::Cell;
|
||||||
|
use std::fmt;
|
||||||
|
use std::sync::Arc;
|
||||||
|
use std::time::Instant;
|
||||||
|
|
||||||
|
/// A handle to a source of time.
|
||||||
|
///
|
||||||
|
/// `Clock` instances return [`Instant`] values corresponding to "now". The source
|
||||||
|
/// of these values is configurable. The default source is [`Instant::now`].
|
||||||
|
///
|
||||||
|
/// [`Instant`]: https://doc.rust-lang.org/std/time/struct.Instant.html
|
||||||
|
/// [`Instant::now`]: https://doc.rust-lang.org/std/time/struct.Instant.html#method.now
|
||||||
|
#[derive(Default, Clone)]
|
||||||
|
pub struct Clock {
|
||||||
|
now: Option<Arc<dyn Now>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
thread_local! {
|
||||||
|
/// Thread-local tracking the current clock
|
||||||
|
static CLOCK: Cell<Option<*const Clock>> = Cell::new(None)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns an `Instant` corresponding to "now".
|
||||||
|
///
|
||||||
|
/// This function delegates to the source of time configured for the current
|
||||||
|
/// execution context. By default, this is `Instant::now()`.
|
||||||
|
///
|
||||||
|
/// Note that, because the source of time is configurable, it is possible to
|
||||||
|
/// observe non-monotonic behavior when calling `now` from different
|
||||||
|
/// executors.
|
||||||
|
///
|
||||||
|
/// See [module](index.html) level documentation for more details.
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// # use tokio_timer::clock;
|
||||||
|
/// let now = clock::now();
|
||||||
|
/// ```
|
||||||
|
pub fn now() -> Instant {
|
||||||
|
CLOCK.with(|current| match current.get() {
|
||||||
|
Some(ptr) => unsafe { (*ptr).now() },
|
||||||
|
None => Instant::now(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Clock {
|
||||||
|
/// Return a new `Clock` instance that uses the current execution context's
|
||||||
|
/// source of time.
|
||||||
|
pub fn new() -> Clock {
|
||||||
|
CLOCK.with(|current| match current.get() {
|
||||||
|
Some(ptr) => unsafe { (*ptr).clone() },
|
||||||
|
None => Clock::system(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Return a new `Clock` instance that uses `now` as the source of time.
|
||||||
|
pub fn new_with_now<T: Now>(now: T) -> Clock {
|
||||||
|
Clock {
|
||||||
|
now: Some(Arc::new(now)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Return a new `Clock` instance that uses [`Instant::now`] as the source
|
||||||
|
/// of time.
|
||||||
|
///
|
||||||
|
/// [`Instant::now`]: https://doc.rust-lang.org/std/time/struct.Instant.html#method.now
|
||||||
|
pub fn system() -> Clock {
|
||||||
|
Clock { now: None }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns an instant corresponding to "now" by using the instance's source
|
||||||
|
/// of time.
|
||||||
|
pub fn now(&self) -> Instant {
|
||||||
|
match self.now {
|
||||||
|
Some(ref now) => now.now(),
|
||||||
|
None => Instant::now(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(deprecated)]
|
||||||
|
impl timer::Now for Clock {
|
||||||
|
fn now(&mut self) -> Instant {
|
||||||
|
Clock::now(self)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl fmt::Debug for Clock {
|
||||||
|
fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
fmt.debug_struct("Clock")
|
||||||
|
.field("now", {
|
||||||
|
if self.now.is_some() {
|
||||||
|
&"Some(Arc<Now>)"
|
||||||
|
} else {
|
||||||
|
&"None"
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Set the default clock for the duration of the closure.
|
||||||
|
///
|
||||||
|
/// # Panics
|
||||||
|
///
|
||||||
|
/// This function panics if there already is a default clock set.
|
||||||
|
pub fn with_default<F, R>(clock: &Clock, f: F) -> R
|
||||||
|
where
|
||||||
|
F: FnOnce() -> R,
|
||||||
|
{
|
||||||
|
CLOCK.with(|cell| {
|
||||||
|
assert!(
|
||||||
|
cell.get().is_none(),
|
||||||
|
"default clock already set for execution context"
|
||||||
|
);
|
||||||
|
|
||||||
|
// Ensure that the clock is removed from the thread-local context
|
||||||
|
// when leaving the scope. This handles cases that involve panicking.
|
||||||
|
struct Reset<'a>(&'a Cell<Option<*const Clock>>);
|
||||||
|
|
||||||
|
impl<'a> Drop for Reset<'a> {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
self.0.set(None);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let _reset = Reset(cell);
|
||||||
|
|
||||||
|
cell.set(Some(clock as *const Clock));
|
||||||
|
|
||||||
|
f()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
@ -370,6 +370,8 @@ impl<T> DelayQueue<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// TODO: Dox... also is the fn signature correct?
|
/// TODO: Dox... also is the fn signature correct?
|
||||||
|
#[allow(clippy::needless_lifetimes)] // false positive: https://github.com/rust-lang/rust-clippy/issues/3988
|
||||||
|
#[allow(clippy::should_implement_trait)] // false positive : https://github.com/rust-lang/rust-clippy/issues/4290
|
||||||
pub async fn next(&mut self) -> Option<Result<Expired<T>, Error>> {
|
pub async fn next(&mut self) -> Option<Result<Expired<T>, Error>> {
|
||||||
use async_util::future::poll_fn;
|
use async_util::future::poll_fn;
|
||||||
|
|
||||||
|
@ -72,6 +72,8 @@ impl Interval {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// TODO: dox
|
/// TODO: dox
|
||||||
|
#[allow(clippy::needless_lifetimes)] // false positive: https://github.com/rust-lang/rust-clippy/issues/3988
|
||||||
|
#[allow(clippy::should_implement_trait)] // false positive : https://github.com/rust-lang/rust-clippy/issues/4290
|
||||||
pub async fn next(&mut self) -> Option<Instant> {
|
pub async fn next(&mut self) -> Option<Instant> {
|
||||||
use async_util::future::poll_fn;
|
use async_util::future::poll_fn;
|
||||||
|
|
||||||
|
@ -81,11 +81,11 @@ fn ms(duration: Duration, round: Round) -> u64 {
|
|||||||
// Round up.
|
// Round up.
|
||||||
let millis = match round {
|
let millis = match round {
|
||||||
Round::Up => (duration.subsec_nanos() + NANOS_PER_MILLI - 1) / NANOS_PER_MILLI,
|
Round::Up => (duration.subsec_nanos() + NANOS_PER_MILLI - 1) / NANOS_PER_MILLI,
|
||||||
Round::Down => duration.subsec_nanos() / NANOS_PER_MILLI,
|
Round::Down => duration.subsec_millis(),
|
||||||
};
|
};
|
||||||
|
|
||||||
duration
|
duration
|
||||||
.as_secs()
|
.as_secs()
|
||||||
.saturating_mul(MILLIS_PER_SEC)
|
.saturating_mul(MILLIS_PER_SEC)
|
||||||
.saturating_add(millis as u64)
|
.saturating_add(u64::from(millis))
|
||||||
}
|
}
|
||||||
|
@ -115,7 +115,7 @@ impl Iterator for AtomicStackEntries {
|
|||||||
|
|
||||||
impl Drop for AtomicStackEntries {
|
impl Drop for AtomicStackEntries {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
while let Some(entry) = self.next() {
|
for entry in self {
|
||||||
// Flag the entry as errored
|
// Flag the entry as errored
|
||||||
entry.error();
|
entry.error();
|
||||||
}
|
}
|
||||||
|
@ -125,8 +125,9 @@ impl Entry {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Only called by `Registration`
|
/// Only called by `Registration`
|
||||||
pub fn time_mut(&self) -> &mut Time {
|
#[allow(clippy::mut_from_ref)] // https://github.com/rust-lang/rust-clippy/issues/4281
|
||||||
unsafe { &mut *self.time.get() }
|
pub unsafe fn time_mut(&self) -> &mut Time {
|
||||||
|
&mut *self.time.get()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns `true` if the `Entry` is currently associated with a timer
|
/// Returns `true` if the `Entry` is currently associated with a timer
|
||||||
|
@ -38,7 +38,9 @@ impl Registration {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn reset(&mut self, deadline: Instant) {
|
pub fn reset(&mut self, deadline: Instant) {
|
||||||
|
unsafe {
|
||||||
self.entry.time_mut().deadline = deadline;
|
self.entry.time_mut().deadline = deadline;
|
||||||
|
}
|
||||||
Entry::reset(&mut self.entry);
|
Entry::reset(&mut self.entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -46,7 +48,9 @@ impl Registration {
|
|||||||
#[cfg(feature = "async-traits")]
|
#[cfg(feature = "async-traits")]
|
||||||
pub fn reset_timeout(&mut self) {
|
pub fn reset_timeout(&mut self) {
|
||||||
let deadline = crate::clock::now() + self.entry.time_ref().duration;
|
let deadline = crate::clock::now() + self.entry.time_ref().duration;
|
||||||
|
unsafe {
|
||||||
self.entry.time_mut().deadline = deadline;
|
self.entry.time_mut().deadline = deadline;
|
||||||
|
}
|
||||||
Entry::reset(&mut self.entry);
|
Entry::reset(&mut self.entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -149,8 +149,7 @@ impl<S> TlsStream<S> {
|
|||||||
{
|
{
|
||||||
self.0.get_mut().context = ctx as *mut _ as *mut ();
|
self.0.get_mut().context = ctx as *mut _ as *mut ();
|
||||||
let g = Guard(self);
|
let g = Guard(self);
|
||||||
let r = f(&mut (g.0).0);
|
f(&mut (g.0).0)
|
||||||
r
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -193,8 +192,8 @@ where
|
|||||||
fn poll_shutdown(mut self: Pin<&mut Self>, ctx: &mut Context<'_>) -> Poll<io::Result<()>> {
|
fn poll_shutdown(mut self: Pin<&mut Self>, ctx: &mut Context<'_>) -> Poll<io::Result<()>> {
|
||||||
match self.with_context(ctx, |s| s.shutdown()) {
|
match self.with_context(ctx, |s| s.shutdown()) {
|
||||||
Ok(()) => Poll::Ready(Ok(())),
|
Ok(()) => Poll::Ready(Ok(())),
|
||||||
Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => return Poll::Pending,
|
Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => Poll::Pending,
|
||||||
Err(e) => return Poll::Ready(Err(e)),
|
Err(e) => Poll::Ready(Err(e)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -289,6 +288,7 @@ impl TlsAcceptor {
|
|||||||
/// This is typically used after a new socket has been accepted from a
|
/// This is typically used after a new socket has been accepted from a
|
||||||
/// `TcpListener`. That socket is then passed to this function to perform
|
/// `TcpListener`. That socket is then passed to this function to perform
|
||||||
/// the server half of accepting a client connection.
|
/// the server half of accepting a client connection.
|
||||||
|
#[allow(clippy::needless_lifetimes)] // false positive: https://github.com/rust-lang/rust-clippy/issues/3988
|
||||||
pub async fn accept<S>(&self, stream: S) -> Result<TlsStream<S>, Error>
|
pub async fn accept<S>(&self, stream: S) -> Result<TlsStream<S>, Error>
|
||||||
where
|
where
|
||||||
S: AsyncRead + AsyncWrite + Unpin,
|
S: AsyncRead + AsyncWrite + Unpin,
|
||||||
|
@ -407,8 +407,8 @@ impl UdpSocket {
|
|||||||
/// address of the local interface with which the system should join the
|
/// address of the local interface with which the system should join the
|
||||||
/// multicast group. If it's equal to `INADDR_ANY` then an appropriate
|
/// multicast group. If it's equal to `INADDR_ANY` then an appropriate
|
||||||
/// interface is chosen by the system.
|
/// interface is chosen by the system.
|
||||||
pub fn join_multicast_v4(&self, multiaddr: &Ipv4Addr, interface: &Ipv4Addr) -> io::Result<()> {
|
pub fn join_multicast_v4(&self, multiaddr: Ipv4Addr, interface: Ipv4Addr) -> io::Result<()> {
|
||||||
self.io.get_ref().join_multicast_v4(multiaddr, interface)
|
self.io.get_ref().join_multicast_v4(&multiaddr, &interface)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Executes an operation of the `IPV6_ADD_MEMBERSHIP` type.
|
/// Executes an operation of the `IPV6_ADD_MEMBERSHIP` type.
|
||||||
@ -425,8 +425,8 @@ impl UdpSocket {
|
|||||||
/// For more information about this option, see [`join_multicast_v4`].
|
/// For more information about this option, see [`join_multicast_v4`].
|
||||||
///
|
///
|
||||||
/// [`join_multicast_v4`]: #method.join_multicast_v4
|
/// [`join_multicast_v4`]: #method.join_multicast_v4
|
||||||
pub fn leave_multicast_v4(&self, multiaddr: &Ipv4Addr, interface: &Ipv4Addr) -> io::Result<()> {
|
pub fn leave_multicast_v4(&self, multiaddr: Ipv4Addr, interface: Ipv4Addr) -> io::Result<()> {
|
||||||
self.io.get_ref().leave_multicast_v4(multiaddr, interface)
|
self.io.get_ref().leave_multicast_v4(&multiaddr, &interface)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Executes an operation of the `IPV6_DROP_MEMBERSHIP` type.
|
/// Executes an operation of the `IPV6_DROP_MEMBERSHIP` type.
|
||||||
|
@ -494,7 +494,7 @@ impl LengthDelimitedCodec {
|
|||||||
// payload
|
// payload
|
||||||
src.reserve(n);
|
src.reserve(n);
|
||||||
|
|
||||||
return Ok(Some(n));
|
Ok(Some(n))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn decode_data(&self, n: usize, src: &mut BytesMut) -> io::Result<Option<BytesMut>> {
|
fn decode_data(&self, n: usize, src: &mut BytesMut) -> io::Result<Option<BytesMut>> {
|
||||||
@ -584,6 +584,12 @@ impl Encoder for LengthDelimitedCodec {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Default for LengthDelimitedCodec {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ===== impl Builder =====
|
// ===== impl Builder =====
|
||||||
|
|
||||||
impl Builder {
|
impl Builder {
|
||||||
@ -930,6 +936,12 @@ impl Builder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Default for Builder {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ===== impl FrameTooBig =====
|
// ===== impl FrameTooBig =====
|
||||||
|
|
||||||
impl fmt::Debug for FrameTooBig {
|
impl fmt::Debug for FrameTooBig {
|
||||||
|
@ -82,3 +82,9 @@ impl Builder {
|
|||||||
Ok(runtime)
|
Ok(runtime)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Default for Builder {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -374,3 +374,9 @@ impl Builder {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Default for Builder {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user