Wedson Almeida Filho | 9dc0436 | 2022-12-28 06:03:40 +0000 | [diff] [blame] | 1 | // SPDX-License-Identifier: GPL-2.0 |
| 2 | |
| 3 | //! Synchronisation primitives. |
| 4 | //! |
| 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. |
| 7 | |
Wedson Almeida Filho | 6ea5aa0 | 2023-04-11 02:45:31 -0300 | [diff] [blame] | 8 | use crate::types::Opaque; |
| 9 | |
Wedson Almeida Filho | 9dc0436 | 2022-12-28 06:03:40 +0000 | [diff] [blame] | 10 | mod arc; |
Wedson Almeida Filho | 19096bc | 2023-03-26 00:57:38 -0300 | [diff] [blame] | 11 | mod condvar; |
Wedson Almeida Filho | 76d4bd5 | 2023-04-11 02:45:32 -0300 | [diff] [blame] | 12 | pub mod lock; |
Wedson Almeida Filho | 7b1f55e | 2023-04-11 02:45:43 -0300 | [diff] [blame] | 13 | mod locked_by; |
Wedson Almeida Filho | 9dc0436 | 2022-12-28 06:03:40 +0000 | [diff] [blame] | 14 | |
Wedson Almeida Filho | 70e42eb | 2022-12-28 06:03:45 +0000 | [diff] [blame] | 15 | pub use arc::{Arc, ArcBorrow, UniqueArc}; |
Alice Ryhl | e283ee2 | 2024-01-29 14:58:37 +0000 | [diff] [blame] | 16 | pub use condvar::{new_condvar, CondVar, CondVarTimeoutResult}; |
| 17 | pub use lock::mutex::{new_mutex, Mutex}; |
| 18 | pub use lock::spinlock::{new_spinlock, SpinLock}; |
Wedson Almeida Filho | 7b1f55e | 2023-04-11 02:45:43 -0300 | [diff] [blame] | 19 | pub use locked_by::LockedBy; |
Wedson Almeida Filho | 6ea5aa0 | 2023-04-11 02:45:31 -0300 | [diff] [blame] | 20 | |
| 21 | /// Represents a lockdep class. It's a wrapper around C's `lock_class_key`. |
| 22 | #[repr(transparent)] |
| 23 | pub struct LockClassKey(Opaque<bindings::lock_class_key>); |
| 24 | |
| 25 | // SAFETY: `bindings::lock_class_key` is designed to be used concurrently from multiple threads and |
| 26 | // provides its own synchronization. |
| 27 | unsafe impl Sync for LockClassKey {} |
| 28 | |
| 29 | impl LockClassKey { |
| 30 | /// Creates a new lock class key. |
| 31 | pub const fn new() -> Self { |
| 32 | Self(Opaque::uninit()) |
| 33 | } |
| 34 | |
Wedson Almeida Filho | 6ea5aa0 | 2023-04-11 02:45:31 -0300 | [diff] [blame] | 35 | pub(crate) fn as_ptr(&self) -> *mut bindings::lock_class_key { |
| 36 | self.0.get() |
| 37 | } |
| 38 | } |
| 39 | |
Miguel Ojeda | 7c81aa8 | 2024-04-01 23:23:01 +0200 | [diff] [blame] | 40 | impl Default for LockClassKey { |
| 41 | fn default() -> Self { |
| 42 | Self::new() |
| 43 | } |
| 44 | } |
| 45 | |
Wedson Almeida Filho | 6ea5aa0 | 2023-04-11 02:45:31 -0300 | [diff] [blame] | 46 | /// Defines a new static lock class and returns a pointer to it. |
| 47 | #[doc(hidden)] |
| 48 | #[macro_export] |
| 49 | macro_rules! static_lock_class { |
| 50 | () => {{ |
| 51 | static CLASS: $crate::sync::LockClassKey = $crate::sync::LockClassKey::new(); |
| 52 | &CLASS |
| 53 | }}; |
| 54 | } |
| 55 | |
| 56 | /// Returns the given string, if one is provided, otherwise generates one based on the source code |
| 57 | /// location. |
| 58 | #[doc(hidden)] |
| 59 | #[macro_export] |
| 60 | macro_rules! optional_name { |
| 61 | () => { |
| 62 | $crate::c_str!(::core::concat!(::core::file!(), ":", ::core::line!())) |
| 63 | }; |
| 64 | ($name:literal) => { |
| 65 | $crate::c_str!($name) |
| 66 | }; |
| 67 | } |