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

独占写部分中断上锁模式的顺序锁RAII机制守卫 更多...

#include <Seqlock.hxx>

xwos::lock::Seqlock::WrLkIrqsGrd< TIrqList > 的协作图:

Public 成员函数

 WrLkIrqsGrd (Seqlock *seqlock)
 构造顺序锁的RAII机制守卫
 
 WrLkIrqsGrd (Seqlock &seqlock)
 构造顺序锁的RAII机制守卫
 
 ~WrLkIrqsGrd ()
 析构顺序锁的RAII机制守卫
 
void unlock ()
 解锁顺序锁
 
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 成员函数

 WrLkIrqsGrd ()
 

Protected 属性

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

详细描述

template<xwirq_t... TIrqList>
class xwos::lock::Seqlock::WrLkIrqsGrd< TIrqList >

独占写部分中断上锁模式的顺序锁RAII机制守卫

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

在文件 Seqlock.hxx1807 行定义.

构造及析构函数说明

◆ WrLkIrqsGrd() [1/3]

template<xwirq_t... TIrqList>
xwos::lock::Seqlock::WrLkIrqsGrd< TIrqList >::WrLkIrqsGrd ( Seqlock seqlock)
inline

构造顺序锁的RAII机制守卫

参数
[in]seqlock顺序锁对象指针

在文件 Seqlock.hxx1820 行定义.

1821 : mSeqlock(seqlock)
1823 , mIrqs{ TIrqList... }
1824 {
1825 if (nullptr != mSeqlock) {
1827 sizeof...(TIrqList));
1829 }
1830 }
xwirq_t mIrqs[sizeof...(TIrqList)]
Definition Seqlock.hxx:1812
xwreg_t mIrqFlags[sizeof...(TIrqList)]
Definition Seqlock.hxx:1813
struct xwos_sqlk mLock
Definition Seqlock.hxx:2081
static void xwos_sqlk_wr_lock_irqssv(struct xwos_sqlk *sql, const xwirq_t irqs[], xwreg_t flags[], xwsz_t num)
XWOS API:开启写临界区,保存部分中断的中断标志并关闭
Definition seqlock.h:689
函数调用图:

◆ WrLkIrqsGrd() [2/3]

template<xwirq_t... TIrqList>
xwos::lock::Seqlock::WrLkIrqsGrd< TIrqList >::WrLkIrqsGrd ( Seqlock seqlock)
inline

构造顺序锁的RAII机制守卫

参数
[in]seqlock顺序锁对象引用

在文件 Seqlock.hxx1836 行定义.

1837 : mSeqlock(&seqlock)
1839 , mIrqs{ TIrqList... }
1840 {
1841 if (nullptr != mSeqlock) {
1843 sizeof...(TIrqList));
1845 }
1846 }
函数调用图:

◆ ~WrLkIrqsGrd()

template<xwirq_t... TIrqList>
xwos::lock::Seqlock::WrLkIrqsGrd< TIrqList >::~WrLkIrqsGrd ( )
inline

析构顺序锁的RAII机制守卫

在文件 Seqlock.hxx1851 行定义.

1852 {
1853 if (nullptr != mSeqlock) {
1857 sizeof...(TIrqList));
1858 }
1859 }
1860 }
static void xwos_sqlk_wr_unlock_irqsrs(struct xwos_sqlk *sql, const xwirq_t irqs[], xwreg_t flags[], xwsz_t num)
XWOS API:关闭写临界区,恢复部分中断的中断标志
Definition seqlock.h:729
函数调用图:

◆ WrLkIrqsGrd() [3/3]

template<xwirq_t... TIrqList>
xwos::lock::Seqlock::WrLkIrqsGrd< TIrqList >::WrLkIrqsGrd ( )
inlineprotected

在文件 Seqlock.hxx2002 行定义.

2003 : mSeqlock(nullptr)
2005 {
2006 }

成员函数说明

◆ unlock()

template<xwirq_t... TIrqList>
void xwos::lock::Seqlock::WrLkIrqsGrd< TIrqList >::unlock ( )
inline

解锁顺序锁

  • 主动解锁后,析构函数将不再解锁。

在文件 Seqlock.hxx1867 行定义.

1868 {
1869 if (nullptr != mSeqlock) {
1873 sizeof...(TIrqList));
1874 }
1875 }
1876 }
函数调用图:

◆ getStatus()

template<xwirq_t... TIrqList>
enum LockStatus xwos::lock::Seqlock::WrLkIrqsGrd< TIrqList >::getStatus ( )
inline

获取锁状态

在文件 Seqlock.hxx1881 行定义.

1881{ return mStatus; }

◆ wait() [1/4]

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

等待条件量

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

在文件 Seqlock.hxx1905 行定义.

1906 {
1907 xwer_t rc;
1908 if (nullptr != mSeqlock) {
1910 union xwos_ulock lock;
1911 xwsq_t lkst;
1912 lock.osal.sqlk = &mSeqlock->mLock;
1913 rc = xwos_cond_wait(cond->getXwosObj(), lock, XWOS_LK_SQLK_WR,
1914 nullptr, &lkst);
1915 if (rc < 0) {
1916 if (XWOS_LKST_UNLOCKED == lkst) {
1918 }
1919 }
1920 } else {
1921 rc = -ENOLCK;
1922 }
1923 } else {
1924 rc = -EFAULT;
1925 }
1926 return rc;
1927 }
#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_SQLK_WR
Definition type.h:643
static void xwos_sqlk_wr_lock(struct xwos_sqlk *sql)
XWOS API:开启写临界区
Definition seqlock.h:488
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:428
所有锁的联合
Definition type.h:680
union xwos_ulock::@8 osal
struct xwmp_sqlk * sqlk
Definition type.h:684
函数调用图:

◆ wait() [2/4]

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

等待条件量

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

在文件 Seqlock.hxx1938 行定义.

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

◆ wait() [3/4]

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

限时等待条件量

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

在文件 Seqlock.hxx1965 行定义.

1966 {
1967 xwer_t rc;
1968 if (nullptr != mSeqlock) {
1970 union xwos_ulock lock;
1971 xwsq_t lkst;
1972 lock.osal.sqlk = &mSeqlock->mLock;
1973 rc = xwos_cond_wait_to(cond->getXwosObj(), lock, XWOS_LK_SQLK_WR,
1974 nullptr, to, &lkst);
1975 if (rc < 0) {
1976 if (XWOS_LKST_UNLOCKED == lkst) {
1978 }
1979 }
1980 } else {
1981 rc = -ENOLCK;
1982 }
1983 } else {
1984 rc = -EFAULT;
1985 }
1986 return rc;
1987 }
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:488
函数调用图:

◆ wait() [4/4]

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

限时等待条件量

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

在文件 Seqlock.hxx1999 行定义.

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

结构体成员变量说明

◆ mSeqlock

template<xwirq_t... TIrqList>
Seqlock* xwos::lock::Seqlock::WrLkIrqsGrd< TIrqList >::mSeqlock
protected

在文件 Seqlock.hxx1810 行定义.

◆ mStatus

template<xwirq_t... TIrqList>
enum LockStatus xwos::lock::Seqlock::WrLkIrqsGrd< TIrqList >::mStatus
protected

在文件 Seqlock.hxx1811 行定义.

◆ mIrqs

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

在文件 Seqlock.hxx1812 行定义.

◆ mIrqFlags

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

在文件 Seqlock.hxx1813 行定义.


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