avoid calling thread::current
in channel destructor
This commit is contained in:
parent
cd30f2751e
commit
a22426916d
@ -1,12 +1,13 @@
|
|||||||
//! Thread-local channel context.
|
//! Thread-local channel context.
|
||||||
|
|
||||||
use super::select::Selected;
|
use super::select::Selected;
|
||||||
|
use super::waker::current_thread_id;
|
||||||
|
|
||||||
use crate::cell::Cell;
|
use crate::cell::Cell;
|
||||||
use crate::ptr;
|
use crate::ptr;
|
||||||
use crate::sync::atomic::{AtomicPtr, AtomicUsize, Ordering};
|
use crate::sync::atomic::{AtomicPtr, AtomicUsize, Ordering};
|
||||||
use crate::sync::Arc;
|
use crate::sync::Arc;
|
||||||
use crate::thread::{self, Thread, ThreadId};
|
use crate::thread::{self, Thread};
|
||||||
use crate::time::Instant;
|
use crate::time::Instant;
|
||||||
|
|
||||||
/// Thread-local context.
|
/// Thread-local context.
|
||||||
@ -28,7 +29,7 @@ struct Inner {
|
|||||||
thread: Thread,
|
thread: Thread,
|
||||||
|
|
||||||
/// Thread id.
|
/// Thread id.
|
||||||
thread_id: ThreadId,
|
thread_id: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Context {
|
impl Context {
|
||||||
@ -70,7 +71,7 @@ impl Context {
|
|||||||
select: AtomicUsize::new(Selected::Waiting.into()),
|
select: AtomicUsize::new(Selected::Waiting.into()),
|
||||||
packet: AtomicPtr::new(ptr::null_mut()),
|
packet: AtomicPtr::new(ptr::null_mut()),
|
||||||
thread: thread::current(),
|
thread: thread::current(),
|
||||||
thread_id: thread::current().id(),
|
thread_id: current_thread_id(),
|
||||||
}),
|
}),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -148,7 +149,7 @@ impl Context {
|
|||||||
|
|
||||||
/// Returns the id of the thread this context belongs to.
|
/// Returns the id of the thread this context belongs to.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn thread_id(&self) -> ThreadId {
|
pub fn thread_id(&self) -> usize {
|
||||||
self.inner.thread_id
|
self.inner.thread_id
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,6 @@ use super::select::{Operation, Selected};
|
|||||||
use crate::ptr;
|
use crate::ptr;
|
||||||
use crate::sync::atomic::{AtomicBool, Ordering};
|
use crate::sync::atomic::{AtomicBool, Ordering};
|
||||||
use crate::sync::Mutex;
|
use crate::sync::Mutex;
|
||||||
use crate::thread::{self, ThreadId};
|
|
||||||
|
|
||||||
/// Represents a thread blocked on a specific channel operation.
|
/// Represents a thread blocked on a specific channel operation.
|
||||||
pub(crate) struct Entry {
|
pub(crate) struct Entry {
|
||||||
@ -195,13 +194,11 @@ impl Drop for SyncWaker {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the id of the current thread.
|
/// Returns a unique id for the current thread.
|
||||||
#[inline]
|
#[inline]
|
||||||
fn current_thread_id() -> ThreadId {
|
pub fn current_thread_id() -> usize {
|
||||||
thread_local! {
|
// `u8` is not drop so this variable will be available during thread destruction,
|
||||||
/// Cached thread-local id.
|
// whereas `thread::current()` would not be
|
||||||
static THREAD_ID: ThreadId = thread::current().id();
|
thread_local! { static DUMMY: u8 = 0 }
|
||||||
}
|
DUMMY.with(|x| (x as *const u8).addr())
|
||||||
|
|
||||||
THREAD_ID.try_with(|id| *id).unwrap_or_else(|_| thread::current().id())
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user