XWOS API  4.0
XWOS C/C++ API参考手册
载入中...
搜索中...
未找到
Spinlock.hxx
浏览该文件的文档.
1
13#ifndef __xwos_cxx_lock_Spinlock_hxx__
14#define __xwos_cxx_lock_Spinlock_hxx__
15
18
19namespace xwos {
20namespace lock {
21
257{
258 public:
265 };
266
276 class LkGrd
277 {
278 protected:
281
282 public:
287 LkGrd(Spinlock * spinlock);
288
293 LkGrd(Spinlock & spinlock);
294
299
305 void unlock();
306
310 enum LockStatus getStatus() { return mStatus; }
311
334
344 xwer_t wait(sync::Cond & cond) { return wait(&cond); }
345
371
382 xwer_t wait(sync::Cond & cond, xwtm_t to) { return wait(&cond, to); }
383
384 protected:
386 : mSpinlock(nullptr)
388 {
389 }
390 };
391
402 class TryLkGrd : public LkGrd
403 {
404 private:
407 public:
412 TryLkGrd(Spinlock * spinlock);
413
418 TryLkGrd(Spinlock & spinlock);
419
424
431 xwer_t getRc() { return mRc; }
432 };
433
445 {
446 protected:
451 public:
456 LkThGrd(Spinlock * spinlock);
457
462 LkThGrd(Spinlock & spinlock);
463
468
474 void unlock();
475
479 enum LockStatus getStatus() { return mStatus; }
480
503
513 xwer_t wait(sync::Cond & cond) { return wait(&cond); }
514
540
551 xwer_t wait(sync::Cond & cond, xwtm_t to) { return wait(&cond, to); }
552
553 protected:
555 : mSpinlock(nullptr)
557 {
558 }
559 };
560
572 class TryLkThGrd : public LkThGrd
573 {
574 private:
577 public:
582 TryLkThGrd(Spinlock * spinlock);
583
588 TryLkThGrd(Spinlock & spinlock);
589
594
601 xwer_t getRc() { return mRc; }
602 };
603
614 {
615 protected:
618
619 public:
624 LkBhGrd(Spinlock * spinlock);
625
630 LkBhGrd(Spinlock & spinlock);
631
636
642 void unlock();
643
647 enum LockStatus getStatus() { return mStatus; }
648
671
681 xwer_t wait(sync::Cond & cond) { return wait(&cond); }
682
708
719 xwer_t wait(sync::Cond & cond, xwtm_t to) { return wait(&cond, to); }
720
721 protected:
723 : mSpinlock(nullptr)
725 {
726 }
727 };
728
740 class TryLkBhGrd : public LkBhGrd
741 {
742 private:
745 public:
750 TryLkBhGrd(Spinlock * spinlock);
751
756 TryLkBhGrd(Spinlock & spinlock);
757
762
769 xwer_t getRc() { return mRc; }
770 };
771
783 template<xwirq_t... TIrqList>
785 {
786 protected:
789 xwirq_t mIrqs[sizeof...(TIrqList)];
790 xwreg_t mIrqFlags[sizeof...(TIrqList)];
791
792 public:
797 LkIrqsGrd(Spinlock * spinlock)
798 : mSpinlock(spinlock)
800 , mIrqs{ TIrqList... }
801 {
802 if (nullptr != mSpinlock) {
804 sizeof...(TIrqList));
806 }
807 }
808
813 LkIrqsGrd(Spinlock & spinlock)
814 : mSpinlock(&spinlock)
816 , mIrqs{ TIrqList... }
817 {
818 if (nullptr != mSpinlock) {
820 sizeof...(TIrqList));
822 }
823 }
824
829 {
830 if (nullptr != mSpinlock) {
834 sizeof...(TIrqList));
835 }
836 }
837 }
838
844 void unlock()
845 {
846 if (nullptr != mSpinlock) {
850 sizeof...(TIrqList));
851 }
852 }
853 }
854
858 enum LockStatus getStatus() { return mStatus; }
859
882 {
883 xwer_t rc;
884 if (nullptr != mSpinlock) {
886 union xwos_ulock lock;
887 xwsq_t lkst;
888 lock.osal.splk = &mSpinlock->mLock;
889 rc = xwos_cond_wait(cond->getXwosObj(), lock, XWOS_LK_SPLK, nullptr,
890 &lkst);
891 if (rc < 0) {
892 if (XWOS_LKST_UNLOCKED == lkst) {
894 }
895 }
896 } else {
897 rc = -ENOLCK;
898 }
899 } else {
900 rc = -EFAULT;
901 }
902 return rc;
903 }
904
914 xwer_t wait(sync::Cond & cond) { return wait(&cond); }
915
941 {
942 xwer_t rc;
943 if (nullptr != mSpinlock) {
945 union xwos_ulock lock;
946 xwsq_t lkst;
947 lock.osal.splk = &mSpinlock->mLock;
948 rc = xwos_cond_wait_to(cond->getXwosObj(), lock, XWOS_LK_SPLK,
949 nullptr, to, &lkst);
950 if (rc < 0) {
951 if (XWOS_LKST_UNLOCKED == lkst) {
953 }
954 }
955 } else {
956 rc = -ENOLCK;
957 }
958 } else {
959 rc = -EFAULT;
960 }
961 return rc;
962 }
963
974 xwer_t wait(sync::Cond & cond, xwtm_t to) { return wait(&cond, to); }
975
976 protected:
978 : mSpinlock(nullptr)
980 {
981 }
982 };
983
997 template<xwirq_t... TIrqList>
998 class TryLkIrqsGrd : public LkIrqsGrd<TIrqList...>
999 {
1000 private:
1003 public:
1009 : LkIrqsGrd<TIrqList...>()
1010 {
1011 LkIrqsGrd<TIrqList...>::mSpinlock = spinlock;
1012 if (nullptr != LkIrqsGrd<TIrqList...>::mSpinlock) {
1016 sizeof...(TIrqList));
1017 if (XWOK != mRc) {
1018 LkIrqsGrd<TIrqList...>::mSpinlock = nullptr;
1019 } else {
1020 LkIrqsGrd<TIrqList...>::mStatus =
1022 }
1023 }
1024 }
1025
1031 : LkIrqsGrd<TIrqList...>()
1032 {
1033 LkIrqsGrd<TIrqList...>::mSpinlock = spinlock;
1034 if (nullptr != LkIrqsGrd<TIrqList...>::mSpinlock) {
1038 sizeof...(TIrqList));
1039 if (XWOK != mRc) {
1040 LkIrqsGrd<TIrqList...>::mSpinlock = nullptr;
1041 } else {
1042 LkIrqsGrd<TIrqList...>::mStatus =
1044 }
1045 }
1046 }
1047
1052
1059 xwer_t getRc() { return mRc; }
1060 };
1061
1062 private:
1065 public:
1068 struct xwos_splk * getXwosObj() { return &mLock; }
1069};
1070
1075} // namespace lock
1076} // namespace xwos
1077
1078#endif /* xwos/cxx/lock/Spinlock.hxx */
xwos::sync::Cond
中断底半部上锁模式下的自旋锁RAII机制守卫
Definition Spinlock.hxx:614
xwer_t wait(sync::Cond &cond)
等待条件量
Definition Spinlock.hxx:681
xwer_t wait(sync::Cond *cond)
等待条件量
~LkBhGrd()
析构自旋锁的RAII机制守卫
enum LockStatus getStatus()
获取锁状态
Definition Spinlock.hxx:647
LkBhGrd(Spinlock *spinlock)
构造自旋锁的RAII机制守卫
void unlock()
解锁自旋锁
xwer_t wait(sync::Cond &cond, xwtm_t to)
限时等待条件量
Definition Spinlock.hxx:719
LkBhGrd(Spinlock &spinlock)
构造自旋锁的RAII机制守卫
xwer_t wait(sync::Cond *cond, xwtm_t to)
限时等待条件量
普通上锁模式下的自旋锁RAII机制守卫
Definition Spinlock.hxx:277
xwer_t wait(sync::Cond &cond, xwtm_t to)
限时等待条件量
Definition Spinlock.hxx:382
xwer_t wait(sync::Cond &cond)
等待条件量
Definition Spinlock.hxx:344
LkGrd(Spinlock *spinlock)
构造自旋锁的RAII机制守卫
xwer_t wait(sync::Cond *cond, xwtm_t to)
限时等待条件量
xwer_t wait(sync::Cond *cond)
等待条件量
~LkGrd()
析构自旋锁的RAII机制守卫
LkGrd(Spinlock &spinlock)
构造自旋锁的RAII机制守卫
void unlock()
解锁自旋锁
enum LockStatus getStatus()
获取锁状态
Definition Spinlock.hxx:310
部分中断上锁模式的自旋锁RAII机制守卫
Definition Spinlock.hxx:785
~LkIrqsGrd()
析构自旋锁的RAII机制守卫
Definition Spinlock.hxx:828
void unlock()
解锁自旋锁
Definition Spinlock.hxx:844
xwer_t wait(sync::Cond *cond, xwtm_t to)
限时等待条件量
Definition Spinlock.hxx:940
xwer_t wait(sync::Cond &cond)
等待条件量
Definition Spinlock.hxx:914
LkIrqsGrd(Spinlock *spinlock)
构造自旋锁的RAII机制守卫
Definition Spinlock.hxx:797
xwer_t wait(sync::Cond *cond)
等待条件量
Definition Spinlock.hxx:881
LkIrqsGrd(Spinlock &spinlock)
构造自旋锁的RAII机制守卫
Definition Spinlock.hxx:813
enum LockStatus getStatus()
获取锁状态
Definition Spinlock.hxx:858
xwreg_t mIrqFlags[sizeof...(TIrqList)]
Definition Spinlock.hxx:790
xwirq_t mIrqs[sizeof...(TIrqList)]
Definition Spinlock.hxx:789
xwer_t wait(sync::Cond &cond, xwtm_t to)
限时等待条件量
Definition Spinlock.hxx:974
CPU中断上锁模式下的自旋锁RAII机制守卫
Definition Spinlock.hxx:445
void unlock()
解锁自旋锁
xwer_t wait(sync::Cond &cond)
等待条件量
Definition Spinlock.hxx:513
~LkThGrd()
析构自旋锁的RAII机制守卫
xwer_t wait(sync::Cond &cond, xwtm_t to)
限时等待条件量
Definition Spinlock.hxx:551
xwer_t wait(sync::Cond *cond)
等待条件量
enum LockStatus getStatus()
获取锁状态
Definition Spinlock.hxx:479
LkThGrd(Spinlock &spinlock)
构造自旋锁的RAII机制守卫
LkThGrd(Spinlock *spinlock)
构造自旋锁的RAII机制守卫
xwer_t wait(sync::Cond *cond, xwtm_t to)
限时等待条件量
中断底半部尝试上锁模式下的自旋锁RAII机制守卫
Definition Spinlock.hxx:741
~TryLkBhGrd()
析构自旋锁的RAII机制守卫
Definition Spinlock.hxx:761
TryLkBhGrd(Spinlock *spinlock)
构造自旋锁的RAII机制守卫
TryLkBhGrd(Spinlock &spinlock)
构造自旋锁的RAII机制守卫
xwer_t getRc()
获取上锁结果错误码
Definition Spinlock.hxx:769
普通尝试上锁模式下的自旋锁RAII机制守卫
Definition Spinlock.hxx:403
TryLkGrd(Spinlock &spinlock)
构造自旋锁的RAII机制守卫
TryLkGrd(Spinlock *spinlock)
构造自旋锁的RAII机制守卫
~TryLkGrd()
析构自旋锁的RAII机制守卫
Definition Spinlock.hxx:423
xwer_t getRc()
获取上锁结果错误码
Definition Spinlock.hxx:431
部分中断尝试上锁模式下的自旋锁RAII机制守卫
Definition Spinlock.hxx:999
~TryLkIrqsGrd()
析构自旋锁的RAII机制守卫
TryLkIrqsGrd(Spinlock &spinlock)
构造自旋锁的RAII机制守卫
xwer_t getRc()
获取上锁结果错误码
TryLkIrqsGrd(Spinlock *spinlock)
构造自旋锁的RAII机制守卫
CPU中断尝试上锁模式下的自旋锁RAII机制守卫
Definition Spinlock.hxx:573
TryLkThGrd(Spinlock &spinlock)
构造自旋锁的RAII机制守卫
xwer_t getRc()
获取上锁结果错误码
Definition Spinlock.hxx:601
~TryLkThGrd()
析构自旋锁的RAII机制守卫
Definition Spinlock.hxx:593
TryLkThGrd(Spinlock *spinlock)
构造自旋锁的RAII机制守卫
struct xwos_splk mLock
struct xwos_splk * getXwosObj()
条件量基类
Definition Cond.hxx:56
struct xwos_cond * getXwosObj()
获取XWOS对象指针
Definition Cond.hxx:179
#define EFAULT
Bad address
Definition errno.h:44
#define ENOLCK
No lock
Definition errno.h:76
#define XWOK
No error
Definition errno.h:182
xws64_t xwtm_t
XWOS系统时间 (有符号)
Definition type.h:742
signed long xwer_t
Definition type.h:554
signed int xwirq_t
Definition type.h:517
unsigned long xwsq_t
Definition type.h:445
xwptr_t xwreg_t
Definition type.h:409
uint32_t xwu32_t
Definition type.h:266
@ XWOS_LKST_UNLOCKED
Definition type.h:661
@ XWOS_LK_SPLK
Definition type.h:642
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
static void xwos_splk_lock(struct xwos_splk *spl)
XWOS API:上锁自旋锁,若自旋锁已开启临界区,就自旋等待
Definition spinlock.h:103
static xwer_t xwos_splk_trylock_irqssv(struct xwos_splk *spl, const xwirq_t irqs[], xwreg_t flags[], xwsz_t num)
XWOS API:尝试上锁自旋锁,保存部分中断的中断标志并关闭
Definition spinlock.h:324
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
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
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
Definition Bmp.hxx:21
C++操作系统抽象层:自旋锁
XWOS API:自旋锁
Definition spinlock.h:73
所有锁的联合
Definition type.h:680
struct xwmp_splk * splk
Definition type.h:683
union xwos_ulock::@8 osal