91#ifndef __LOS_ATOMIC_H__
92#define __LOS_ATOMIC_H__
125 return *(
volatile INT32 *)v;
149 *(
volatile INT32 *)v = setVal;
179 __asm__ __volatile__(
"ldrex %1, [%2]\n"
182 :
"=&r"(status),
"=&r"(val)
183 :
"r"(v),
"r"(addVal)
185 }
while (__builtin_expect(status != 0, 0));
223 __asm__ __volatile__(
"ldrex %1, [%2]\n"
226 :
"=&r"(status),
"=&r"(val)
227 :
"r"(v),
"r"(subVal)
229 }
while (__builtin_expect(status != 0, 0));
259 __asm__ __volatile__(
"ldrex %0, [%3]\n"
262 :
"=&r"(val),
"=&r"(status),
"+m"(*v)
265 }
while (__builtin_expect(status != 0, 0));
293 __asm__ __volatile__(
"ldrex %0, [%3]\n"
296 :
"=&r"(val),
"=&r"(status),
"+m"(*v)
299 }
while (__builtin_expect(status != 0, 0));
329 __asm__ __volatile__(
"ldrex %0, [%3]\n"
332 :
"=&r"(val),
"=&r"(status),
"+m"(*v)
335 }
while (__builtin_expect(status != 0, 0));
363 __asm__ __volatile__(
"ldrex %0, [%3]\n"
366 :
"=&r"(val),
"=&r"(status),
"+m"(*v)
369 }
while (__builtin_expect(status != 0, 0));
397 __asm__ __volatile__(
"ldrexd %0, %H0, [%1]"
431 __asm__ __volatile__(
"ldrexd %1, %H1, [%2]\n"
432 "strexd %0, %3, %H3, [%2]"
433 :
"=&r"(status),
"=&r"(tmp)
434 :
"r"(v),
"r"(setVal)
436 }
while (__builtin_expect(status != 0, 0));
466 __asm__ __volatile__(
"ldrexd %1, %H1, [%2]\n"
467 "adds %Q1, %Q1, %Q3\n"
468 "adc %R1, %R1, %R3\n"
469 "strexd %0, %1, %H1, [%2]"
470 :
"=&r"(status),
"=&r"(val)
471 :
"r"(v),
"r"(addVal)
473 }
while (__builtin_expect(status != 0, 0));
505 __asm__ __volatile__(
"ldrexd %1, %H1, [%2]\n"
506 "subs %Q1, %Q1, %Q3\n"
507 "sbc %R1, %R1, %R3\n"
508 "strexd %0, %1, %H1, [%2]"
509 :
"=&r"(status),
"=&r"(val)
510 :
"r"(v),
"r"(subVal)
512 }
while (__builtin_expect(status != 0, 0));
542 __asm__ __volatile__(
"ldrexd %0, %H0, [%3]\n"
543 "adds %Q0, %Q0, #1\n"
545 "strexd %1, %0, %H0, [%3]"
546 :
"=&r"(val),
"=&r"(status),
"+m"(*v)
549 }
while (__builtin_expect(status != 0, 0));
577 __asm__ __volatile__(
"ldrexd %0, %H0, [%3]\n"
578 "adds %Q0, %Q0, #1\n"
580 "strexd %1, %0, %H0, [%3]"
581 :
"=&r"(val),
"=&r"(status),
"+m"(*v)
584 }
while (__builtin_expect(status != 0, 0));
614 __asm__ __volatile__(
"ldrexd %0, %H0, [%3]\n"
615 "subs %Q0, %Q0, #1\n"
617 "strexd %1, %0, %H0, [%3]"
618 :
"=&r"(val),
"=&r"(status),
"+m"(*v)
621 }
while (__builtin_expect(status != 0, 0));
649 __asm__ __volatile__(
"ldrexd %0, %H0, [%3]\n"
650 "subs %Q0, %Q0, #1\n"
652 "strexd %1, %0, %H0, [%3]"
653 :
"=&r"(val),
"=&r"(status),
"+m"(*v)
656 }
while (__builtin_expect(status != 0, 0));
685 __asm__ __volatile__(
"ldrexb %0, [%3]\n"
686 "strexb %1, %4, [%3]"
687 :
"=&r"(prevVal),
"=&r"(status),
"+m"(*v)
690 }
while (__builtin_expect(status != 0, 0));
719 __asm__ __volatile__(
"ldrexh %0, [%3]\n"
720 "strexh %1, %4, [%3]"
721 :
"=&r"(prevVal),
"=&r"(status),
"+m"(*v)
724 }
while (__builtin_expect(status != 0, 0));
753 __asm__ __volatile__(
"ldrex %0, [%3]\n"
755 :
"=&r"(prevVal),
"=&r"(status),
"+m"(*v)
758 }
while (__builtin_expect(status != 0, 0));
787 __asm__ __volatile__(
"ldrexd %0, %H0, [%3]\n"
788 "strexd %1, %4, %H4, [%3]"
789 :
"=&r"(prevVal),
"=&r"(status),
"+m"(*v)
792 }
while (__builtin_expect(status != 0, 0));
822 __asm__ __volatile__(
"ldrexb %0, [%3]\n"
825 "strexbeq %1, %5, [%3]"
826 :
"=&r"(prevVal),
"=&r"(status),
"+m"(*v)
827 :
"r"(v),
"r"(oldVal),
"r"(val)
829 }
while (__builtin_expect(status != 0, 0));
831 return prevVal != oldVal;
859 __asm__ __volatile__(
"ldrexh %0, [%3]\n"
862 "strexheq %1, %5, [%3]"
863 :
"=&r"(prevVal),
"=&r"(status),
"+m"(*v)
864 :
"r"(v),
"r"(oldVal),
"r"(val)
866 }
while (__builtin_expect(status != 0, 0));
868 return prevVal != oldVal;
896 __asm__ __volatile__(
"ldrex %0, [%3]\n"
899 "strexeq %1, %5, [%3]"
900 :
"=&r"(prevVal),
"=&r"(status),
"+m"(*v)
901 :
"r"(v),
"r"(oldVal),
"r"(val)
903 }
while (__builtin_expect(status != 0, 0));
905 return prevVal != oldVal;
933 __asm__ __volatile__(
"ldrexd %0, %H0, [%3]\n"
937 "strexdeq %1, %5, %H5, [%3]"
938 :
"=&r"(prevVal),
"=&r"(status),
"+m"(*v)
939 :
"r"(v),
"r"(oldVal),
"r"(val)
941 }
while (__builtin_expect(status != 0, 0));
943 return prevVal != oldVal;
STATIC INLINE INT32 LOS_AtomicXchg32bits(Atomic *v, INT32 val)
Atomic exchange for 32-bit variable. | 交换32位原子数据,原内存中的值以返回值的方式返回
STATIC INLINE VOID LOS_AtomicInc(Atomic *v)
Atomic addSelf.
STATIC INLINE VOID LOS_Atomic64Inc(Atomic64 *v)
Atomic64 addSelf. | 对64位原子数据加1
STATIC INLINE INT64 LOS_Atomic64Sub(Atomic64 *v, INT64 subVal)
Atomic64 subtraction. | 对64位原子数据做减法
STATIC INLINE INT64 LOS_Atomic64DecRet(Atomic64 *v)
Atomic64 auto-decrement. | 对64位原子数据减1并返回运算结果
STATIC INLINE INT64 LOS_Atomic64Add(Atomic64 *v, INT64 addVal)
Atomic64 addition. | 对64位内存数据做加法
STATIC INLINE INT32 LOS_AtomicRead(const Atomic *v)
Atomic read. | 读取32bit原子数据
STATIC INLINE INT64 LOS_Atomic64IncRet(Atomic64 *v)
Atomic64 addSelf. | 对64位原子数据加1并返回运算结果
STATIC INLINE VOID LOS_Atomic64Set(Atomic64 *v, INT64 setVal)
Atomic64 setting. | 写入64位内存数据
STATIC INLINE BOOL LOS_AtomicCmpXchg32bits(Atomic *v, INT32 val, INT32 oldVal)
Atomic exchange for 32-bit variable with compare. | 比较并交换32位原子数据,返回比较结果
STATIC INLINE INT64 LOS_AtomicXchg64bits(Atomic64 *v, INT64 val)
Atomic exchange for 64-bit variable. | 交换64位原子数据,原内存中的值以返回值的方式返回
STATIC INLINE VOID LOS_AtomicSet(Atomic *v, INT32 setVal)
Atomic setting.
STATIC INLINE VOID LOS_AtomicDec(Atomic *v)
Atomic auto-decrement. | 对32bit原子数据做减1
STATIC INLINE INT32 LOS_AtomicDecRet(Atomic *v)
Atomic auto-decrement. | 对内存数据减1并返回运算结果
STATIC INLINE BOOL LOS_AtomicCmpXchg16bits(volatile INT16 *v, INT32 val, INT32 oldVal)
Atomic exchange for 16-bit variable with compare. | 比较并交换16位原子数据,返回比较结果
STATIC INLINE INT32 LOS_AtomicXchg16bits(volatile INT16 *v, INT32 val)
Atomic exchange for 16-bit variable. | 交换16位原子数据,原内存中的值以返回值的方式返回
STATIC INLINE INT32 LOS_AtomicIncRet(Atomic *v)
Atomic addSelf. | 对内存数据加1并返回运算结果
STATIC INLINE INT32 LOS_AtomicAdd(Atomic *v, INT32 addVal)
Atomic addition.
STATIC INLINE INT32 LOS_AtomicSub(Atomic *v, INT32 subVal)
Atomic subtraction.
STATIC INLINE INT32 LOS_AtomicXchgByte(volatile INT8 *v, INT32 val)
Atomic exchange for 8-bit variable. | 交换8位原子数据,原内存中的值以返回值的方式返回
STATIC INLINE INT64 LOS_Atomic64Read(const Atomic64 *v)
Atomic64 read. | 读取64bit原子数据
STATIC INLINE VOID LOS_Atomic64Dec(Atomic64 *v)
Atomic64 auto-decrement. | 对64位原子数据减1
STATIC INLINE BOOL LOS_AtomicCmpXchgByte(volatile INT8 *v, INT32 val, INT32 oldVal)
Atomic exchange for 8-bit variable with compare. | 比较并交换8位原子数据,返回比较结果
STATIC INLINE BOOL LOS_AtomicCmpXchg64bits(Atomic64 *v, INT64 val, INT64 oldVal)
Atomic exchange for 64-bit variable with compare. | 比较并交换64位原子数据,返回比较结果