SimpleKernel 1.17.0
Loading...
Searching...
No Matches
LockGuard< Mutex > Class Template Reference

RAII 风格的锁守卫模板类 More...

#include <spinlock.hpp>

Collaboration diagram for LockGuard< Mutex >:
Collaboration graph

Public Types

using mutex_type = Mutex
 

Public Member Functions

构造/析构函数
 LockGuard (mutex_type &mutex)
 构造函数,自动获取锁
 
 ~LockGuard ()
 析构函数,自动释放锁
 
 LockGuard ()=delete
 
 LockGuard (const LockGuard &)=delete
 
 LockGuard (LockGuard &&)=delete
 
auto operator= (const LockGuard &) -> LockGuard &=delete
 
auto operator= (LockGuard &&) -> LockGuard &=delete
 

Private Attributes

mutex_typemutex_
 

Detailed Description

template<typename Mutex>
requires requires(Mutex& m) { { m.Lock() } -> std::same_as<Expected<void>>; { m.UnLock() } -> std::same_as<Expected<void>>; }
class LockGuard< Mutex >

RAII 风格的锁守卫模板类

Template Parameters
Mutex锁类型,必须有返回 Expected<void> 的 Lock() 和 UnLock() 方法

Definition at line 131 of file spinlock.hpp.

Member Typedef Documentation

◆ mutex_type

template<typename Mutex >
using LockGuard< Mutex >::mutex_type = Mutex

Definition at line 133 of file spinlock.hpp.

Constructor & Destructor Documentation

◆ LockGuard() [1/4]

template<typename Mutex >
LockGuard< Mutex >::LockGuard ( mutex_type mutex)
inlineexplicit

构造函数,自动获取锁

Parameters
mutex要保护的锁对象

Definition at line 142 of file spinlock.hpp.

142 : mutex_(mutex) {
143 mutex_.Lock().or_else([&](auto&& err) {
144 char core_buf[4] = {};
146 size_t pos = 0;
147 if (core_id == 0) {
148 core_buf[pos++] = '0';
149 } else {
150 char tmp[4] = {};
151 size_t tmp_pos = 0;
152 while (core_id > 0 && tmp_pos < sizeof(tmp)) {
153 tmp[tmp_pos++] = static_cast<char>('0' + (core_id % 10));
154 core_id /= 10;
155 }
156 while (tmp_pos > 0) {
157 core_buf[pos++] = tmp[--tmp_pos];
158 }
159 }
160 core_buf[pos] = '\0';
161 klog::RawPut("PANIC: LockGuard failed to acquire lock '");
163 klog::RawPut("' on core ");
164 klog::RawPut(core_buf);
165 klog::RawPut(": ");
166 klog::RawPut(err.message());
167 klog::RawPut("\n");
168 while (true) {
170 }
171 return Expected<void>{};
172 });
173 }
mutex_type & mutex_
Definition spinlock.hpp:219
const char * name
锁的名称
Definition mutex.hpp:33
auto Lock() -> Expected< void >
获取锁(阻塞)
Definition mutex.cpp:11
std::expected< T, Error > Expected
std::expected 别名模板
Definition expected.hpp:365
auto GetCurrentCoreId() -> size_t
Definition cpu_io.h:26
void Pause()
Definition cpu_io.h:20
__always_inline auto RawPut(const char *msg) -> void
绕过队列直接输出至串口(用于 panic 路径)
size_t core_id
核心 ID
Definition per_cpu.hpp:1
Here is the call graph for this function:

◆ ~LockGuard()

template<typename Mutex >
LockGuard< Mutex >::~LockGuard ( )
inline

析构函数,自动释放锁

Definition at line 178 of file spinlock.hpp.

178 {
179 mutex_.UnLock().or_else([&](auto&& err) {
180 char core_buf[4] = {};
182 size_t pos = 0;
183 if (core_id == 0) {
184 core_buf[pos++] = '0';
185 } else {
186 char tmp[4] = {};
187 size_t tmp_pos = 0;
188 while (core_id > 0 && tmp_pos < sizeof(tmp)) {
189 tmp[tmp_pos++] = static_cast<char>('0' + (core_id % 10));
190 core_id /= 10;
191 }
192 while (tmp_pos > 0) {
193 core_buf[pos++] = tmp[--tmp_pos];
194 }
195 }
196 core_buf[pos] = '\0';
197 klog::RawPut("PANIC: LockGuard failed to release lock '");
199 klog::RawPut("' on core ");
200 klog::RawPut(core_buf);
201 klog::RawPut(": ");
202 klog::RawPut(err.message());
203 klog::RawPut("\n");
204 while (true) {
206 }
207 return Expected<void>{};
208 });
209 }
auto UnLock() -> Expected< void >
释放锁
Definition mutex.cpp:41
Here is the call graph for this function:

◆ LockGuard() [2/4]

template<typename Mutex >
LockGuard< Mutex >::LockGuard ( )
delete

◆ LockGuard() [3/4]

template<typename Mutex >
LockGuard< Mutex >::LockGuard ( const LockGuard< Mutex > &  )
delete

◆ LockGuard() [4/4]

template<typename Mutex >
LockGuard< Mutex >::LockGuard ( LockGuard< Mutex > &&  )
delete

Member Function Documentation

◆ operator=() [1/2]

template<typename Mutex >
auto LockGuard< Mutex >::operator= ( const LockGuard< Mutex > &  ) -> LockGuard &=delete
delete

◆ operator=() [2/2]

template<typename Mutex >
auto LockGuard< Mutex >::operator= ( LockGuard< Mutex > &&  ) -> LockGuard &=delete
delete

Member Data Documentation

◆ mutex_

template<typename Mutex >
mutex_type& LockGuard< Mutex >::mutex_
private

Definition at line 219 of file spinlock.hpp.


The documentation for this class was generated from the following file: