mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-05-24 10:39:52 +00:00

Sleep on a condition variable with a timeout. This is used by Rust Binder for process freezing. There, we want to sleep until the freeze operation completes, but we want to be able to abort the process freezing if it doesn't complete within some timeout. Note that it is not enough to avoid jiffies by introducing a variant of `CondVar::wait_timeout` that takes the timeout in msecs because we need to be able to restart the sleep with the remaining sleep duration if it is interrupted, and if the API takes msecs rather than jiffies, then that would require a conversion roundtrip jiffies->msecs->jiffies that is best avoided. Reviewed-by: Martin Rodriguez Reboredo <yakoyoku@gmail.com> Reviewed-by: Tiago Lam <tiagolam@gmail.com> Reviewed-by: Boqun Feng <boqun.feng@gmail.com> Signed-off-by: Alice Ryhl <aliceryhl@google.com> Reviewed-by: Benno Lossin <benno.lossin@proton.me> Link: https://lore.kernel.org/r/20240108-rb-new-condvar-methods-v4-3-88e0c871cc05@google.com [ Added `CondVarTimeoutResult` re-export and fixed typo. ] Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
60 lines
1.6 KiB
Rust
60 lines
1.6 KiB
Rust
// SPDX-License-Identifier: GPL-2.0
|
|
|
|
//! Synchronisation primitives.
|
|
//!
|
|
//! This module contains the kernel APIs related to synchronisation that have been ported or
|
|
//! wrapped for usage by Rust code in the kernel.
|
|
|
|
use crate::types::Opaque;
|
|
|
|
mod arc;
|
|
mod condvar;
|
|
pub mod lock;
|
|
mod locked_by;
|
|
|
|
pub use arc::{Arc, ArcBorrow, UniqueArc};
|
|
pub use condvar::{CondVar, CondVarTimeoutResult};
|
|
pub use lock::{mutex::Mutex, spinlock::SpinLock};
|
|
pub use locked_by::LockedBy;
|
|
|
|
/// Represents a lockdep class. It's a wrapper around C's `lock_class_key`.
|
|
#[repr(transparent)]
|
|
pub struct LockClassKey(Opaque<bindings::lock_class_key>);
|
|
|
|
// SAFETY: `bindings::lock_class_key` is designed to be used concurrently from multiple threads and
|
|
// provides its own synchronization.
|
|
unsafe impl Sync for LockClassKey {}
|
|
|
|
impl LockClassKey {
|
|
/// Creates a new lock class key.
|
|
pub const fn new() -> Self {
|
|
Self(Opaque::uninit())
|
|
}
|
|
|
|
pub(crate) fn as_ptr(&self) -> *mut bindings::lock_class_key {
|
|
self.0.get()
|
|
}
|
|
}
|
|
|
|
/// Defines a new static lock class and returns a pointer to it.
|
|
#[doc(hidden)]
|
|
#[macro_export]
|
|
macro_rules! static_lock_class {
|
|
() => {{
|
|
static CLASS: $crate::sync::LockClassKey = $crate::sync::LockClassKey::new();
|
|
&CLASS
|
|
}};
|
|
}
|
|
|
|
/// Returns the given string, if one is provided, otherwise generates one based on the source code
|
|
/// location.
|
|
#[doc(hidden)]
|
|
#[macro_export]
|
|
macro_rules! optional_name {
|
|
() => {
|
|
$crate::c_str!(::core::concat!(::core::file!(), ":", ::core::line!()))
|
|
};
|
|
($name:literal) => {
|
|
$crate::c_str!($name)
|
|
};
|
|
}
|