1 // SPDX-License-Identifier: GPL-2.0
3 //! Synchronisation primitives.
5 //! This module contains the kernel APIs related to synchronisation that have been ported or
6 //! wrapped for usage by Rust code in the kernel.
8 use crate::types::Opaque;
16 pub use arc::{Arc, ArcBorrow, UniqueArc};
17 pub use condvar::{new_condvar, CondVar, CondVarTimeoutResult};
18 pub use lock::global::{global_lock, GlobalGuard, GlobalLock, GlobalLockBackend, GlobalLockedBy};
19 pub use lock::mutex::{new_mutex, Mutex};
20 pub use lock::spinlock::{new_spinlock, SpinLock};
21 pub use locked_by::LockedBy;
23 /// Represents a lockdep class. It's a wrapper around C's `lock_class_key`.
25 pub struct LockClassKey(Opaque<bindings::lock_class_key>);
27 // SAFETY: `bindings::lock_class_key` is designed to be used concurrently from multiple threads and
28 // provides its own synchronization.
29 unsafe impl Sync for LockClassKey {}
32 /// Creates a new lock class key.
33 pub const fn new() -> Self {
34 Self(Opaque::uninit())
37 pub(crate) fn as_ptr(&self) -> *mut bindings::lock_class_key {
42 impl Default for LockClassKey {
43 fn default() -> Self {
48 /// Defines a new static lock class and returns a pointer to it.
51 macro_rules! static_lock_class {
53 static CLASS: $crate::sync::LockClassKey = $crate::sync::LockClassKey::new();
58 /// Returns the given string, if one is provided, otherwise generates one based on the source code
62 macro_rules! optional_name {
64 $crate::c_str!(::core::concat!(::core::file!(), ":", ::core::line!()))