XWOS API  4.0
XWOS C/C++ API参考手册
载入中...
搜索中...
未找到
xwos::lock::Spinlock::LkIrqsGrd< TIrqList > 模板类 参考

部分中断上锁模式的自旋锁RAII机制守卫 更多...

#include <Spinlock.hxx>

xwos::lock::Spinlock::LkIrqsGrd< TIrqList > 的协作图:

Public 成员函数

 LkIrqsGrd (Spinlock *spinlock)
 构造自旋锁的RAII机制守卫
 
 LkIrqsGrd (Spinlock &spinlock)
 构造自旋锁的RAII机制守卫
 
 ~LkIrqsGrd ()
 析构自旋锁的RAII机制守卫
 
enum LockStatus getStatus ()
 获取锁状态
 
xwer_t wait (sync::Cond *cond)
 等待条件量
 
xwer_t wait (sync::Cond &cond)
 等待条件量
 
xwer_t wait (sync::Cond *cond, xwtm_t to)
 限时等待条件量
 
xwer_t wait (sync::Cond &cond, xwtm_t to)
 限时等待条件量
 

Protected 成员函数

 LkIrqsGrd ()
 

Protected 属性

SpinlockmSpinlock
 
enum LockStatus mStatus
 
xwirq_t mIrqs [sizeof...(TIrqList)]
 
xwreg_t mIrqFlags [sizeof...(TIrqList)]
 

详细描述

template<xwirq_t ... TIrqList>
class xwos::lock::Spinlock::LkIrqsGrd< TIrqList >

部分中断上锁模式的自旋锁RAII机制守卫

  • 构造函数关闭并保存 TIrqList 列表内的中断,关闭当前CPU调度器的抢占, 上锁自旋锁。
  • 上锁失败会自旋等待,直到上锁成功为止。
  • 析构函数解锁自旋锁,开启当前CPU调度器的抢占, 用保存的中断标志恢复 TIrqList 列表内的中断。
    注解
  • 上下文:线程、TIrqList 列表中的中断

在文件 Spinlock.hxx742 行定义.

构造及析构函数说明

◆ LkIrqsGrd() [1/3]

template<xwirq_t ... TIrqList>
xwos::lock::Spinlock::LkIrqsGrd< TIrqList >::LkIrqsGrd ( Spinlock spinlock)

构造自旋锁的RAII机制守卫

参数
[in]spinlock自旋锁对象指针

在文件 Spinlock.cxx341 行定义.

342 : mSpinlock(spinlock)
344 , mIrqs{TIrqList ...}
345{
346 if (nullptr != mSpinlock) {
347 xwos_splk_lock_irqssv(&mSpinlock->mLock, mIrqs, mIrqFlags, sizeof...(TIrqList));
349 }
350}
xwreg_t mIrqFlags[sizeof...(TIrqList)]
Definition Spinlock.hxx:748
xwirq_t mIrqs[sizeof...(TIrqList)]
Definition Spinlock.hxx:747
struct xwos_splk mLock
Definition Spinlock.hxx:897
static void xwos_splk_lock_irqssv(struct xwos_splk *spl, const xwirq_t irqs[], xwreg_t flags[], xwsz_t num)
XWOS API:上锁自旋锁,保存部分中断的中断标志并关闭
Definition spinlock.h:300
函数调用图:

◆ LkIrqsGrd() [2/3]

template<xwirq_t ... TIrqList>
xwos::lock::Spinlock::LkIrqsGrd< TIrqList >::LkIrqsGrd ( Spinlock spinlock)

构造自旋锁的RAII机制守卫

参数
[in]spinlock自旋锁对象引用

在文件 Spinlock.cxx353 行定义.

354 : mSpinlock(&spinlock)
356 , mIrqs{TIrqList ...}
357{
358 if (nullptr != mSpinlock) {
359 xwos_splk_lock_irqssv(&mSpinlock->mLock, mIrqs, mIrqFlags, sizeof...(TIrqList));
361 }
362}
函数调用图:

◆ ~LkIrqsGrd()

template<xwirq_t ... TIrqList>
xwos::lock::Spinlock::LkIrqsGrd< TIrqList >::~LkIrqsGrd ( )

析构自旋锁的RAII机制守卫

在文件 Spinlock.cxx365 行定义.

366{
367 if (nullptr != mSpinlock) {
371 sizeof...(TIrqList));
372 }
373 }
374}
static void xwos_splk_unlock_irqsrs(struct xwos_splk *spl, const xwirq_t irqs[], xwreg_t flags[], xwsz_t num)
XWOS API:解锁自旋锁,并恢复部分中断的中断标志
Definition spinlock.h:341
函数调用图:

◆ LkIrqsGrd() [3/3]

template<xwirq_t ... TIrqList>
xwos::lock::Spinlock::LkIrqsGrd< TIrqList >::LkIrqsGrd ( )
inlineprotected

在文件 Spinlock.hxx846 行定义.

846: mSpinlock(nullptr), mStatus(SpinlockUnlocked) {}

成员函数说明

◆ getStatus()

template<xwirq_t ... TIrqList>
enum LockStatus xwos::lock::Spinlock::LkIrqsGrd< TIrqList >::getStatus ( )
inline

获取锁状态

在文件 Spinlock.hxx771 行定义.

771{ return mStatus; }

◆ wait() [1/4]

template<xwirq_t ... TIrqList>
xwer_t xwos::lock::Spinlock::LkIrqsGrd< TIrqList >::wait ( sync::Cond cond)
inline

等待条件量

参数
[in]cond条件量对象的引用
返回
错误码
注解
  • 上下文:线程

在文件 Spinlock.hxx805 行定义.

805{ return wait(&cond); }
xwer_t wait(sync::Cond *cond)
等待条件量
Definition Spinlock.cxx:377
函数调用图:
这是这个函数的调用关系图:

◆ wait() [2/4]

template<xwirq_t ... TIrqList>
xwer_t xwos::lock::Spinlock::LkIrqsGrd< TIrqList >::wait ( sync::Cond cond,
xwtm_t  to 
)
inline

限时等待条件量

参数
[in]cond条件量对象的引用
[in]to期望唤醒的时间点
返回
错误码
注解
  • 上下文:线程

在文件 Spinlock.hxx843 行定义.

843{ return wait(&cond, to); }
函数调用图:
这是这个函数的调用关系图:

◆ wait() [3/4]

template<xwirq_t ... TIrqList>
xwer_t xwos::lock::Spinlock::LkIrqsGrd< TIrqList >::wait ( sync::Cond cond)

等待条件量

参数
[in]cond条件量对象的指针
返回
错误码
返回值
XWOK没有错误
-EFAULT无效的指针或空指针
-EINVAL参数无效
-EINTR等待被中断
-ENOTTHDCTX不在线程上下文中
注解
  • 上下文:线程
  • 调用此C++API的线程会阻塞等待条件量,等待的同时会解锁自旋锁。
  • 条件量被单播 sync::Cond::unicast() 或广播 sync::Cond::broadcast() 时,会唤醒正在等待的线程。
  • 线程被唤醒后,会重新上锁自旋锁。
  • 重新上锁成功后将返回 XWOK
  • 线程的等待被中断后,此C++API返回 -EINTR
  • 如果此C++API返回 XWOK 的错误码后,应该 使用 getStatus() 确认是否上锁成功。

在文件 Spinlock.cxx377 行定义.

378{
379 xwer_t rc;
380 if (nullptr != mSpinlock) {
382 union xwos_ulock lock;
383 xwsq_t lkst;
384 lock.osal.splk = &mSpinlock->mLock;
385 rc = xwos_cond_wait(cond->getXwosObj(), lock, XWOS_LK_SPLK, nullptr, &lkst);
386 if (rc < 0) {
387 if (XWOS_LKST_UNLOCKED == lkst) {
389 }
390 }
391 } else {
392 rc = -ENOLCK;
393 }
394 } else {
395 rc = -EFAULT;
396 }
397 return rc;
398}
#define EFAULT
Bad address
Definition errno.h:44
#define ENOLCK
No lock
Definition errno.h:76
signed long xwer_t
Definition type.h:554
unsigned long xwsq_t
Definition type.h:445
@ XWOS_LKST_UNLOCKED
Definition type.h:661
@ XWOS_LK_SPLK
Definition type.h:642
static void xwos_splk_lock(struct xwos_splk *spl)
XWOS API:上锁自旋锁,若自旋锁已开启临界区,就自旋等待
Definition spinlock.h:103
static xwer_t xwos_cond_wait(struct xwos_cond *cond, union xwos_ulock lock, xwsq_t lktype, void *lkdata, xwsq_t *lkst)
XWOS API:等待条件量
Definition cond.h:432
所有锁的联合
Definition type.h:680
struct xwmp_splk * splk
Definition type.h:683
union xwos_ulock::@8 osal
函数调用图:

◆ wait() [4/4]

template<xwirq_t ... TIrqList>
xwer_t xwos::lock::Spinlock::LkIrqsGrd< TIrqList >::wait ( sync::Cond cond,
xwtm_t  to 
)

限时等待条件量

参数
[in]cond条件量对象的指针
[in]to期望唤醒的时间点
返回
错误码
返回值
XWOK没有错误
-EFAULT无效的指针或空指针
-EINVAL参数无效
-ETIMEDOUT超时
-EINTR等待被中断
-ENOTTHDCTX不在线程上下文中
注解
  • 上下文:线程
  • 调用此C++API的线程会限时阻塞等待条件量,等待的同时会解锁自旋锁。
  • 条件量被单播 sync::Cond::unicast() 或广播 sync::Cond::broadcast() 时,会唤醒正在等待的线程。
  • 线程被唤醒后,会重新上锁自旋锁 。
  • 重新上锁成功后将返回 XWOK
  • 线程的等待被中断后,此C++API返回 -EINTR
  • 线程的等待超时后,此C++API返回 -ETIMEDOUT
  • 如果此C++API返回 XWOK 的错误码,应该 使用 getStatus() 确认是否上锁成功。

在文件 Spinlock.cxx401 行定义.

402{
403 xwer_t rc;
404 if (nullptr != mSpinlock) {
406 union xwos_ulock lock;
407 xwsq_t lkst;
408 lock.osal.splk = &mSpinlock->mLock;
409 rc = xwos_cond_wait_to(cond->getXwosObj(), lock, XWOS_LK_SPLK, nullptr,
410 to, &lkst);
411 if (rc < 0) {
412 if (XWOS_LKST_UNLOCKED == lkst) {
414 }
415 }
416 } else {
417 rc = -ENOLCK;
418 }
419 } else {
420 rc = -EFAULT;
421 }
422 return rc;
423}
static xwer_t xwos_cond_wait_to(struct xwos_cond *cond, union xwos_ulock lock, xwsq_t lktype, void *lkdata, xwtm_t to, xwsq_t *lkst)
XWOS API:限时等待条件量
Definition cond.h:492
函数调用图:

结构体成员变量说明

◆ mIrqFlags

template<xwirq_t ... TIrqList>
xwreg_t xwos::lock::Spinlock::LkIrqsGrd< TIrqList >::mIrqFlags[sizeof...(TIrqList)]
protected

在文件 Spinlock.hxx748 行定义.

◆ mIrqs

template<xwirq_t ... TIrqList>
xwirq_t xwos::lock::Spinlock::LkIrqsGrd< TIrqList >::mIrqs[sizeof...(TIrqList)]
protected

在文件 Spinlock.hxx747 行定义.

◆ mSpinlock

template<xwirq_t ... TIrqList>
Spinlock* xwos::lock::Spinlock::LkIrqsGrd< TIrqList >::mSpinlock
protected

在文件 Spinlock.hxx745 行定义.

◆ mStatus

template<xwirq_t ... TIrqList>
enum LockStatus xwos::lock::Spinlock::LkIrqsGrd< TIrqList >::mStatus
protected

在文件 Spinlock.hxx746 行定义.


该类的文档由以下文件生成: