30 const char*
name{
"unnamed"};
41 while (
locked_.test_and_set(std::memory_order_acquire)) {
43 if (
core_id_.load(std::memory_order_acquire) ==
74 core_id_.store(std::numeric_limits<size_t>::max(),
75 std::memory_order_release);
76 locked_.clear(std::memory_order_release);
106 std::atomic<size_t>
core_id_{std::numeric_limits<size_t>::max()};
116 return locked_.test(std::memory_order_acquire) &&
117 (
core_id_.load(std::memory_order_acquire) ==
126template <
typename Mutex>
127 requires requires(
Mutex& m) {
128 { m.Lock() } -> std::same_as<Expected<void>>;
129 { m.UnLock() } -> std::same_as<Expected<void>>;
144 char core_buf[4] = {};
148 core_buf[pos++] =
'0';
152 while (
core_id > 0 && tmp_pos <
sizeof(tmp)) {
153 tmp[tmp_pos++] =
static_cast<char>(
'0' + (
core_id % 10));
156 while (tmp_pos > 0) {
157 core_buf[pos++] = tmp[--tmp_pos];
160 core_buf[pos] =
'\0';
161 klog::RawPut(
"PANIC: LockGuard failed to acquire lock '");
180 char core_buf[4] = {};
184 core_buf[pos++] =
'0';
188 while (
core_id > 0 && tmp_pos <
sizeof(tmp)) {
189 tmp[tmp_pos++] =
static_cast<char>(
'0' + (
core_id % 10));
192 while (tmp_pos > 0) {
193 core_buf[pos++] = tmp[--tmp_pos];
196 core_buf[pos] =
'\0';
197 klog::RawPut(
"PANIC: LockGuard failed to release lock '");
LockGuard(const LockGuard &)=delete
auto operator=(const LockGuard &) -> LockGuard &=delete
LockGuard(mutex_type &mutex)
构造函数,自动获取锁
auto operator=(LockGuard &&) -> LockGuard &=delete
LockGuard(LockGuard &&)=delete
auto Lock() -> Expected< void >
获取锁(阻塞)
auto UnLock() -> Expected< void >
释放锁
std::atomic_flag locked_
是否 Lock
__always_inline auto Lock() -> Expected< void >
获得锁
auto operator=(const SpinLock &) -> SpinLock &=delete
__always_inline auto IsLockedByCurrentCore() -> bool
检查当前 core 是否获得此锁
SpinLock(SpinLock &&)=default
SpinLock(const SpinLock &)=delete
SpinLock(const char *_name)
构造函数
auto operator=(SpinLock &&) -> SpinLock &=default
std::atomic< size_t > core_id_
获得此锁的 core_id
bool saved_intr_enable_
保存的中断状态
__always_inline auto UnLock() -> Expected< void >
释放锁
std::expected< T, Error > Expected
std::expected 别名模板
auto GetCurrentCoreId() -> size_t
bool GetInterruptStatus()
__always_inline auto RawPut(const char *msg) -> void
绕过队列直接输出至串口(用于 panic 路径)