2022-12-28 06:03:40 +00:00
// 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.
2023-04-11 02:45:31 -03:00
use crate ::types ::Opaque ;
2022-12-28 06:03:40 +00:00
mod arc ;
2023-03-26 00:57:38 -03:00
mod condvar ;
2023-04-11 02:45:32 -03:00
pub mod lock ;
2023-04-11 02:45:43 -03:00
mod locked_by ;
2022-12-28 06:03:40 +00:00
2022-12-28 06:03:45 +00:00
pub use arc ::{ Arc , ArcBorrow , UniqueArc } ;
2024-01-29 14:58:37 +00:00
pub use condvar ::{ new_condvar , CondVar , CondVarTimeoutResult } ;
pub use lock ::mutex ::{ new_mutex , Mutex } ;
pub use lock ::spinlock ::{ new_spinlock , SpinLock } ;
2023-04-11 02:45:43 -03:00
pub use locked_by ::LockedBy ;
2023-04-11 02:45:31 -03:00
/// 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 ( )
}
}
2024-04-01 23:23:01 +02:00
impl Default for LockClassKey {
fn default ( ) -> Self {
Self ::new ( )
}
}
2023-04-11 02:45:31 -03:00
/// 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 )
} ;
}