mirror of
https://github.com/tokio-rs/tokio.git
synced 2026-08-22 00:00:11 +02:00
sync: add const fn OnceCell::from_value (#5903)
Signed-off-by: Jiahao XU <[email protected]>
This commit is contained in:
@@ -206,6 +206,20 @@ impl Semaphore {
|
||||
}
|
||||
}
|
||||
|
||||
/// Creates a new closed semaphore with 0 permits.
|
||||
#[cfg(not(all(loom, test)))]
|
||||
pub(crate) const fn const_new_closed() -> Self {
|
||||
Self {
|
||||
permits: AtomicUsize::new(Self::CLOSED),
|
||||
waiters: Mutex::const_new(Waitlist {
|
||||
queue: LinkedList::new(),
|
||||
closed: true,
|
||||
}),
|
||||
#[cfg(all(tokio_unstable, feature = "tracing"))]
|
||||
resource_span: tracing::Span::none(),
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns the current number of available permits.
|
||||
pub(crate) fn available_permits(&self) -> usize {
|
||||
self.permits.load(Acquire) >> Self::PERMIT_SHIFT
|
||||
|
||||
@@ -149,6 +149,36 @@ impl<T> OnceCell<T> {
|
||||
}
|
||||
}
|
||||
|
||||
/// Creates a new `OnceCell` that contains the provided value.
|
||||
///
|
||||
/// # Example
|
||||
///
|
||||
/// ```
|
||||
/// use tokio::sync::OnceCell;
|
||||
///
|
||||
/// static ONCE: OnceCell<u32> = OnceCell::const_new_with(1);
|
||||
///
|
||||
/// async fn get_global_integer() -> &'static u32 {
|
||||
/// ONCE.get_or_init(|| async {
|
||||
/// 1 + 1
|
||||
/// }).await
|
||||
/// }
|
||||
///
|
||||
/// #[tokio::main]
|
||||
/// async fn main() {
|
||||
/// let result = get_global_integer().await;
|
||||
/// assert_eq!(*result, 1);
|
||||
/// }
|
||||
/// ```
|
||||
#[cfg(not(all(loom, test)))]
|
||||
pub const fn const_new_with(value: T) -> Self {
|
||||
OnceCell {
|
||||
value_set: AtomicBool::new(true),
|
||||
value: UnsafeCell::new(MaybeUninit::new(value)),
|
||||
semaphore: Semaphore::const_new_closed(),
|
||||
}
|
||||
}
|
||||
|
||||
/// Creates a new empty `OnceCell` instance.
|
||||
///
|
||||
/// Equivalent to `OnceCell::new`, except that it can be used in static
|
||||
|
||||
@@ -219,6 +219,16 @@ impl Semaphore {
|
||||
}
|
||||
}
|
||||
|
||||
/// Creates a new closed semaphore with 0 permits.
|
||||
#[cfg(not(all(loom, test)))]
|
||||
pub(crate) const fn const_new_closed() -> Self {
|
||||
Self {
|
||||
ll_sem: ll::Semaphore::const_new_closed(),
|
||||
#[cfg(all(tokio_unstable, feature = "tracing"))]
|
||||
resource_span: tracing::Span::none(),
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns the current number of available permits.
|
||||
pub fn available_permits(&self) -> usize {
|
||||
self.ll_sem.available_permits()
|
||||
|
||||
Reference in New Issue
Block a user