mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-27 22:24:11 +08:00
e283ee2392
Currently, all macros are reexported with #[macro_export] only, which means that to access `new_work!` from the workqueue, you need to import it from the path `kernel::new_work` instead of importing it from the workqueue module like all other items in the workqueue. By adding reexports of the macros, it becomes possible to import the macros from the correct modules. It's still possible to import the macros from the root, but I don't think we can do anything about that. There is no functional change. This is merely a code cleanliness improvement. Signed-off-by: Alice Ryhl <aliceryhl@google.com> Reviewed-by: Trevor Gross <tmgross@umich.edu> Reviewed-by: Martin Rodriguez Reboredo <yakoyoku@gmail.com> Tested-by: Boqun Feng <boqun.feng@gmail.com> Link: https://lore.kernel.org/r/20240129145837.1419880-1-aliceryhl@google.com [ Removed new `use kernel::prelude::*`s, reworded title. ] Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
62 lines
1.6 KiB
Rust
62 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::{new_condvar, CondVar, CondVarTimeoutResult};
|
|
pub use lock::mutex::{new_mutex, Mutex};
|
|
pub use lock::spinlock::{new_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)
|
|
};
|
|
}
|