1#![cfg_attr(not(test), no_std)]
2#![doc = include_str!("../README.md")]
3
4#[cfg(any(test, doctest))]
5extern crate std;
6
7mod base;
8#[cfg(feature = "lock_api")]
9mod raw;
10mod rwlock;
11use ax_kernel_guard::{NoOp, NoPreempt, NoPreemptIrqSave};
12#[cfg(feature = "lockdep")]
13pub mod lockdep;
14
15#[cfg(feature = "lock_api")]
16pub use self::raw::{BaseRawSpinLock, RawSpinNoIrq};
17pub use self::{
18 base::{BaseSpinLock, BaseSpinLockGuard},
19 rwlock::{BaseSpinRwLock, BaseSpinRwLockReadGuard, BaseSpinRwLockWriteGuard},
20};
21
22pub fn set_lockdep_trace_enabled(enabled: bool) {
24 #[cfg(feature = "lockdep")]
25 {
26 ax_lockdep::set_trace_enabled(enabled);
27 }
28
29 #[cfg(not(feature = "lockdep"))]
30 {
31 let _ = enabled;
32 }
33}
34
35pub fn dump_lockdep_trace() {
37 #[cfg(feature = "lockdep")]
38 {
39 ax_lockdep::dump_trace_buffer();
40 }
41}
42
43pub type SpinNoPreempt<T> = BaseSpinLock<NoPreempt, T>;
49
50pub type SpinNoPreemptGuard<'a, T> = BaseSpinLockGuard<'a, NoPreempt, T>;
52
53pub type SpinRwLock<T> = BaseSpinRwLock<NoOp, T>;
58
59pub type SpinRwLockReadGuard<'a, T> = BaseSpinRwLockReadGuard<'a, NoOp, T>;
61
62pub type SpinRwLockWriteGuard<'a, T> = BaseSpinRwLockWriteGuard<'a, NoOp, T>;
64
65pub type SpinNoIrq<T> = BaseSpinLock<NoPreemptIrqSave, T>;
70
71pub type SpinNoIrqGuard<'a, T> = BaseSpinLockGuard<'a, NoPreemptIrqSave, T>;
73
74pub type SpinNoIrqRwLock<T> = BaseSpinRwLock<NoPreemptIrqSave, T>;
76
77pub type SpinNoIrqRwLockReadGuard<'a, T> = BaseSpinRwLockReadGuard<'a, NoPreemptIrqSave, T>;
79
80pub type SpinNoIrqRwLockWriteGuard<'a, T> = BaseSpinRwLockWriteGuard<'a, NoPreemptIrqSave, T>;
82
83pub type SpinRaw<T> = BaseSpinLock<NoOp, T>;
88
89pub type SpinRawGuard<'a, T> = BaseSpinLockGuard<'a, NoOp, T>;
91
92pub type SpinRawRwLock<T> = BaseSpinRwLock<NoOp, T>;
94
95pub type SpinRawRwLockReadGuard<'a, T> = BaseSpinRwLockReadGuard<'a, NoOp, T>;
97
98pub type SpinRawRwLockWriteGuard<'a, T> = BaseSpinRwLockWriteGuard<'a, NoOp, T>;
100
101#[cfg(all(axtest, feature = "axtest"))]
102pub mod axtest;