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
252{
253 public:
260 };
261
271 class LkGrd
272 {
273 protected:
276
277 public:
282 LkGrd(Spinlock * spinlock);
283
288 LkGrd(Spinlock & spinlock);
289
294
300 void unlock();
301
305 enum LockStatus getStatus() { return mStatus; }
306
329
339 xwer_t wait(sync::Cond & cond) { return wait(&cond); }
340
366
377 xwer_t wait(sync::Cond & cond, xwtm_t to) { return wait(&cond, to); }
378
379 protected:
381 : mSpinlock(nullptr)
383 {
384 }
385 };
386
397 class TryLkGrd : public LkGrd
398 {
399 private:
402 public:
407 TryLkGrd(Spinlock * spinlock);
408
413 TryLkGrd(Spinlock & spinlock);
414
419
426 xwer_t getRc() { return mRc; }
427 };
428
440 {
441 protected:
446 public:
451 LkThGrd(Spinlock * spinlock);
452
457 LkThGrd(Spinlock & spinlock);
458
463
469 void unlock();
470
474 enum LockStatus getStatus() { return mStatus; }
475
498
508 xwer_t wait(sync::Cond & cond) { return wait(&cond); }
509
535
546 xwer_t wait(sync::Cond & cond, xwtm_t to) { return wait(&cond, to); }
547
548 protected:
550 : mSpinlock(nullptr)
552 {
553 }
554 };
555
567 class TryLkThGrd : public LkThGrd
568 {
569 private:
572 public:
577 TryLkThGrd(Spinlock * spinlock);
578
583 TryLkThGrd(Spinlock & spinlock);
584
589
596 xwer_t getRc() { return mRc; }
597 };
598
609 {
610 protected:
613
614 public:
619 LkBhGrd(Spinlock * spinlock);
620
625 LkBhGrd(Spinlock & spinlock);
626
631
637 void unlock();
638
642 enum LockStatus getStatus() { return mStatus; }
643
666
676 xwer_t wait(sync::Cond & cond) { return wait(&cond); }
677
703
714 xwer_t wait(sync::Cond & cond, xwtm_t to) { return wait(&cond, to); }
715
716 protected:
718 : mSpinlock(nullptr)
720 {
721 }
722 };
723
735 class TryLkBhGrd : public LkBhGrd
736 {
737 private:
740 public:
745 TryLkBhGrd(Spinlock * spinlock);
746
751 TryLkBhGrd(Spinlock & spinlock);
752
757
764 xwer_t getRc() { return mRc; }
765 };
766
778 template<xwirq_t... TIrqList>
780 {
781 protected:
784 xwirq_t mIrqs[sizeof...(TIrqList)];
785 xwreg_t mIrqFlags[sizeof...(TIrqList)];
786
787 public:
792 LkIrqsGrd(Spinlock * spinlock)
793 : mSpinlock(spinlock)
795 , mIrqs{ TIrqList... }
796 {
797 if (nullptr != mSpinlock) {
799 sizeof...(TIrqList));
801 }
802 }
803
808 LkIrqsGrd(Spinlock & spinlock)
809 : mSpinlock(&spinlock)
811 , mIrqs{ TIrqList... }
812 {
813 if (nullptr != mSpinlock) {
815 sizeof...(TIrqList));
817 }
818 }
819
824 {
825 if (nullptr != mSpinlock) {
829 sizeof...(TIrqList));
830 }
831 }
832 }
833
839 void unlock()
840 {
841 if (nullptr != mSpinlock) {
845 sizeof...(TIrqList));
846 }
847 }
848 }
849
853 enum LockStatus getStatus() { return mStatus; }
854
877 {
878 xwer_t rc;
879 if (nullptr != mSpinlock) {
881 union xwos_ulock lock;
882 xwsq_t lkst;
883 lock.osal.splk = &mSpinlock->mLock;
884 rc = xwos_cond_wait(cond->getXwosObj(), lock, XWOS_LK_SPLK, nullptr,
885 &lkst);
886 if (rc < 0) {
887 if (XWOS_LKST_UNLOCKED == lkst) {
889 }
890 }
891 } else {
892 rc = -ENOLCK;
893 }
894 } else {
895 rc = -EFAULT;
896 }
897 return rc;
898 }
899
909 xwer_t wait(sync::Cond & cond) { return wait(&cond); }
910
936 {
937 xwer_t rc;
938 if (nullptr != mSpinlock) {
940 union xwos_ulock lock;
941 xwsq_t lkst;
942 lock.osal.splk = &mSpinlock->mLock;
943 rc = xwos_cond_wait_to(cond->getXwosObj(), lock, XWOS_LK_SPLK,
944 nullptr, to, &lkst);
945 if (rc < 0) {
946 if (XWOS_LKST_UNLOCKED == lkst) {
948 }
949 }
950 } else {
951 rc = -ENOLCK;
952 }
953 } else {
954 rc = -EFAULT;
955 }
956 return rc;
957 }
958
969 xwer_t wait(sync::Cond & cond, xwtm_t to) { return wait(&cond, to); }
970
971 protected:
973 : mSpinlock(nullptr)
975 {
976 }
977 };
978
992 template<xwirq_t... TIrqList>
993 class TryLkIrqsGrd : public LkIrqsGrd<TIrqList...>
994 {
995 private:
998 public:
1004 : LkIrqsGrd<TIrqList...>()
1005 {
1006 LkIrqsGrd<TIrqList...>::mSpinlock = spinlock;
1007 if (nullptr != LkIrqsGrd<TIrqList...>::mSpinlock) {
1011 sizeof...(TIrqList));
1012 if (XWOK != mRc) {
1013 LkIrqsGrd<TIrqList...>::mSpinlock = nullptr;
1014 } else {
1015 LkIrqsGrd<TIrqList...>::mStatus =
1017 }
1018 }
1019 }
1020
1026 : LkIrqsGrd<TIrqList...>()
1027 {
1028 LkIrqsGrd<TIrqList...>::mSpinlock = spinlock;
1029 if (nullptr != LkIrqsGrd<TIrqList...>::mSpinlock) {
1033 sizeof...(TIrqList));
1034 if (XWOK != mRc) {
1035 LkIrqsGrd<TIrqList...>::mSpinlock = nullptr;
1036 } else {
1037 LkIrqsGrd<TIrqList...>::mStatus =
1039 }
1040 }
1041 }
1042
1047
1054 xwer_t getRc() { return mRc; }
1055 };
1056
1057 private:
1060 public:
1063 struct xwos_splk * getXwosObj() { return &mLock; }
1064};
1065
1070} // namespace lock
1071} // namespace xwos
1072
1073#endif /* xwos/cxx/lock/Spinlock.hxx */
xwos::sync::Cond
中断底半部上锁模式下的自旋锁RAII机制守卫
Definition Spinlock.hxx:609
xwer_t wait(sync::Cond &cond)
等待条件量
Definition Spinlock.hxx:676
xwer_t wait(sync::Cond *cond)
等待条件量
~LkBhGrd()
析构自旋锁的RAII机制守卫
enum LockStatus getStatus()
获取锁状态
Definition Spinlock.hxx:642
LkBhGrd(Spinlock *spinlock)
构造自旋锁的RAII机制守卫
void unlock()
解锁自旋锁
xwer_t wait(sync::Cond &cond, xwtm_t to)
限时等待条件量
Definition Spinlock.hxx:714
LkBhGrd(Spinlock &spinlock)
构造自旋锁的RAII机制守卫
xwer_t wait(sync::Cond *cond, xwtm_t to)
限时等待条件量
普通上锁模式下的自旋锁RAII机制守卫
Definition Spinlock.hxx:272
xwer_t wait(sync::Cond &cond, xwtm_t to)
限时等待条件量
Definition Spinlock.hxx:377
xwer_t wait(sync::Cond &cond)
等待条件量
Definition Spinlock.hxx:339
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:305
部分中断上锁模式的自旋锁RAII机制守卫
Definition Spinlock.hxx:780
~LkIrqsGrd()
析构自旋锁的RAII机制守卫
Definition Spinlock.hxx:823
void unlock()
解锁自旋锁
Definition Spinlock.hxx:839
xwer_t wait(sync::Cond *cond, xwtm_t to)
限时等待条件量
Definition Spinlock.hxx:935
xwer_t wait(sync::Cond &cond)
等待条件量
Definition Spinlock.hxx:909
LkIrqsGrd(Spinlock *spinlock)
构造自旋锁的RAII机制守卫
Definition Spinlock.hxx:792
xwer_t wait(sync::Cond *cond)
等待条件量
Definition Spinlock.hxx:876
LkIrqsGrd(Spinlock &spinlock)
构造自旋锁的RAII机制守卫
Definition Spinlock.hxx:808
enum LockStatus getStatus()
获取锁状态
Definition Spinlock.hxx:853
xwreg_t mIrqFlags[sizeof...(TIrqList)]
Definition Spinlock.hxx:785
xwirq_t mIrqs[sizeof...(TIrqList)]
Definition Spinlock.hxx:784
xwer_t wait(sync::Cond &cond, xwtm_t to)
限时等待条件量
Definition Spinlock.hxx:969
CPU中断上锁模式下的自旋锁RAII机制守卫
Definition Spinlock.hxx:440
void unlock()
解锁自旋锁
xwer_t wait(sync::Cond &cond)
等待条件量
Definition Spinlock.hxx:508
~LkThGrd()
析构自旋锁的RAII机制守卫
xwer_t wait(sync::Cond &cond, xwtm_t to)
限时等待条件量
Definition Spinlock.hxx:546
xwer_t wait(sync::Cond *cond)
等待条件量
enum LockStatus getStatus()
获取锁状态
Definition Spinlock.hxx:474
LkThGrd(Spinlock &spinlock)
构造自旋锁的RAII机制守卫
LkThGrd(Spinlock *spinlock)
构造自旋锁的RAII机制守卫
xwer_t wait(sync::Cond *cond, xwtm_t to)
限时等待条件量
中断底半部尝试上锁模式下的自旋锁RAII机制守卫
Definition Spinlock.hxx:736
~TryLkBhGrd()
析构自旋锁的RAII机制守卫
Definition Spinlock.hxx:756
TryLkBhGrd(Spinlock *spinlock)
构造自旋锁的RAII机制守卫
TryLkBhGrd(Spinlock &spinlock)
构造自旋锁的RAII机制守卫
xwer_t getRc()
获取上锁结果错误码
Definition Spinlock.hxx:764
普通尝试上锁模式下的自旋锁RAII机制守卫
Definition Spinlock.hxx:398
TryLkGrd(Spinlock &spinlock)
构造自旋锁的RAII机制守卫
TryLkGrd(Spinlock *spinlock)
构造自旋锁的RAII机制守卫
~TryLkGrd()
析构自旋锁的RAII机制守卫
Definition Spinlock.hxx:418
xwer_t getRc()
获取上锁结果错误码
Definition Spinlock.hxx:426
部分中断尝试上锁模式下的自旋锁RAII机制守卫
Definition Spinlock.hxx:994
~TryLkIrqsGrd()
析构自旋锁的RAII机制守卫
TryLkIrqsGrd(Spinlock &spinlock)
构造自旋锁的RAII机制守卫
xwer_t getRc()
获取上锁结果错误码
TryLkIrqsGrd(Spinlock *spinlock)
构造自旋锁的RAII机制守卫
CPU中断尝试上锁模式下的自旋锁RAII机制守卫
Definition Spinlock.hxx:568
TryLkThGrd(Spinlock &spinlock)
构造自旋锁的RAII机制守卫
xwer_t getRc()
获取上锁结果错误码
Definition Spinlock.hxx:596
~TryLkThGrd()
析构自旋锁的RAII机制守卫
Definition Spinlock.hxx:588
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:337
static void xwos_splk_lock(struct xwos_splk *spl)
XWOS API:上锁自旋锁,若自旋锁已开启临界区,就自旋等待
Definition spinlock.h:99
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:320
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:296
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
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
Definition Bmp.hxx:21
C++操作系统抽象层:自旋锁
XWOS API:自旋锁
Definition spinlock.h:69
所有锁的联合
Definition type.h:680
struct xwmp_splk * splk
Definition type.h:683
union xwos_ulock::@8 osal