39#ifdef LOSCFG_KERNEL_SMP_LOCKDEP
41#define PRINT_BUF_SIZE 256
43#define LOCKDEP_GET_NAME(lockDep, index) (((SPIN_LOCK_S *)((lockDep)->heldLocks[(index)].lockPtr))->name)
44#define LOCKDEP_GET_ADDR(lockDep, index) ((lockDep)->heldLocks[(index)].lockAddr)
69 return (((
UINT64)high << 32) + low);
74 CHAR *errorString = NULL;
78 errorString =
"double lock";
81 errorString =
"dead lock";
84 errorString =
"unlock without lock";
87 errorString =
"lockdep overflow";
90 errorString =
"unknown error code";
109 CHAR buf[PRINT_BUF_SIZE] = {0};
111 len = vsnprintf_s(buf, PRINT_BUF_SIZE, PRINT_BUF_SIZE - 1, fmt, ap);
112 if ((len == -1) && (*buf ==
'\0')) {
114 UartPuts(
"OsLockDepPrint is error\n", strlen(
"OsLockDepPrint is error\n"), 0);
146 for (i = 0; i < lockDep->
lockDepth; i++) {
149 LOCKDEP_GET_ADDR(lockDep, i));
170 BOOL checkResult = TRUE;
174 if (current == lockOwner) {
180 lockOwner = lockTemp->
owner;
184 }
while (lockOwner != SPINLOCK_OWNER_INIT);
193#ifdef LOSCFG_COMPILER_CLANG_LLVM
194 VOID *requestAddr = (VOID *)__builtin_return_address(1);
196 VOID *requestAddr = (VOID *)__builtin_return_address(0);
209 lockOwner = lock->
owner;
211 if (lockOwner == SPINLOCK_OWNER_INIT) {
215 if (current == lockOwner) {
263 lock->
owner = current;
279#ifdef LOSCFG_COMPILER_CLANG_LLVM
280 VOID *requestAddr = (VOID *)__builtin_return_address(1);
282 VOID *requestAddr = (VOID *)__builtin_return_address(0);
292 if (owner == SPINLOCK_OWNER_INIT) {
305 while (--depth >= 0) {
306 if (heldlocks[depth].lockPtr == lock) {
311 LOS_ASSERT(depth >= 0);
317 while (depth < lockDep->lockDepth - 1) {
324 lock->
owner = SPINLOCK_OWNER_INIT;
STATIC INLINE BOOL LOS_AtomicCmpXchg32bits(Atomic *v, INT32 val, INT32 oldVal)
Atomic exchange for 32-bit variable with compare. | 比较并交换32位原子数据,返回比较结果
STATIC INLINE VOID LOS_AtomicSet(Atomic *v, INT32 setVal)
Atomic setting.
VOID OsBackTrace(VOID)
Kernel backtrace function.
STATIC INLINE VOID LOS_IntRestore(UINT32 intSave)
Restore interrupts. | 恢复到使用LOS_IntLock关闭所有中断之前的状态
STATIC INLINE UINT32 LOS_IntLock(VOID)
Disable all interrupts. | 关闭当前处理器所有中断响应
LITE_OS_SEC_TEXT_MINOR VOID LOS_GetCpuCycle(UINT32 *highCnt, UINT32 *lowCnt)
获取自系统启动以来的Cycle数
原子操作 http://weharmonyos.com/openharmony/zh-cn/device-dev/kernel/kernel-small-basic-atomic....
STATIC INLINE UINT32 ArchCurrCpuid(VOID)
STATIC BOOL OsLockDepCheckDependency(const LosTaskCB *current, LosTaskCB *lockOwner)
STATIC INLINE CHAR * OsLockDepErrorStringGet(enum LockDepErrType type)
STATIC VOID OsPrintLockDepInfo(const CHAR *fmt,...)
STATIC INLINE UINT64 OsLockDepGetCycles(VOID)
VOID OsLockDepCheckIn(SPIN_LOCK_S *lock)
VOID OsLockDepCheckOut(SPIN_LOCK_S *lock)
VOID OsLockDepRecord(SPIN_LOCK_S *lock)
WEAK VOID OsLockDepPanic(enum LockDepErrType errType)
VOID OsLockdepClearSpinlocks(VOID)
STATIC VOID OsLockDepDumpLock(const LosTaskCB *task, const SPIN_LOCK_S *lock, const VOID *requestAddr, enum LockDepErrType errType)
STATIC Atomic g_lockdepAvailable
STATIC INLINE VOID OsLockDepRequire(UINT32 *intSave)
STATIC VOID OsLockDepPrint(const CHAR *fmt, va_list ap)
STATIC INLINE VOID OsLockDepRelease(UINT32 intSave)
@ LOCKDEP_ERR_UNLOCK_WITOUT_LOCK
@ LOCKDEP_ERR_DOUBLE_LOCK
STATIC INLINE LosTaskCB * OsCurrTaskGet(VOID)
VOID LOS_SpinUnlock(SPIN_LOCK_S *lock)
HeldLocks heldLocks[MAX_LOCK_DEPTH]
CHAR taskName[OS_TCB_NAME_LEN]
VOID UartPuts(const CHAR *s, UINT32 len, BOOL isLock)