/********************************************************************************************************* ** 函数名称: _SmpSpinUnlockIrq ** 功能描述: 自旋锁解锁操作, 连同解锁中断 ** 输 入 : psl 自旋锁 ** iregInterLevel 中断锁定信息 ** 输 出 : 调度器返回值 ** 全局变量: ** 调用模块: *********************************************************************************************************/ INT _SmpSpinUnlockIrq (spinlock_t *psl, INTREG iregInterLevel) { PLW_CLASS_CPU pcpuCur; PLW_CLASS_TCB ptcbCur; BOOL bTrySched = LW_FALSE; INT iRet; KN_SMP_MB(); iRet = __ARCH_SPIN_UNLOCK(psl); _BugFormat((iRet != LW_SPIN_OK), LW_TRUE, "unlock error 0x%p!\r\n", psl); pcpuCur = LW_CPU_GET_CUR(); if (!pcpuCur->CPU_ulInterNesting) { ptcbCur = pcpuCur->CPU_ptcbTCBCur; __THREAD_LOCK_DEC(ptcbCur); /* 解除任务锁定 */ if (__ISNEED_SCHED(pcpuCur, 0)) { bTrySched = LW_TRUE; /* 需要尝试调度 */ } } LW_CPU_SPIN_NESTING_DEC(pcpuCur); KN_INT_ENABLE(iregInterLevel); if (bTrySched) { return (_ThreadSched(ptcbCur)); } else { return (ERROR_NONE); } }
/********************************************************************************************************* ** 函数名称: archSpinLock ** 功能描述: spinlock 上锁 ** 输 入 : psl spinlock 指针 ** 输 出 : 0: 没有获取 ** 1: 正常加锁 ** 全局变量: ** 调用模块: *********************************************************************************************************/ INT archSpinLock (spinlock_t *psl) { if (psl->SL_pcpuOwner == LW_CPU_GET_CUR()) { psl->SL_ulCounter++; _BugFormat((psl->SL_ulCounter > 10), LW_TRUE, "spinlock RECURSIVE %lu!\r\n", psl->SL_ulCounter); return (1); /* 重复调用 */ } armSpinLock(&psl->SL_sltData); psl->SL_pcpuOwner = LW_CPU_GET_CUR(); /* 保存当前 CPU */ return (1); /* 加锁成功 */ }
/********************************************************************************************************* ** 函数名称: _SmpSpinUnlockIgnIrq ** 功能描述: 自旋锁解锁操作, 忽略中断锁定 (必须在中断关闭的状态下被调用) ** 输 入 : psl 自旋锁 ** 输 出 : NONE ** 全局变量: ** 调用模块: *********************************************************************************************************/ VOID _SmpSpinUnlockIgnIrq (spinlock_t *psl) { PLW_CLASS_CPU pcpuCur; INT iRet; KN_SMP_MB(); iRet = __ARCH_SPIN_UNLOCK(psl); _BugFormat((iRet != LW_SPIN_OK), LW_TRUE, "unlock error 0x%p!\r\n", psl); pcpuCur = LW_CPU_GET_CUR(); if (!pcpuCur->CPU_ulInterNesting) { __THREAD_LOCK_DEC(pcpuCur->CPU_ptcbTCBCur); /* 解除任务锁定 */ } LW_CPU_SPIN_NESTING_DEC(pcpuCur); }