RTDECL(void) RTSpinlockRelease(RTSPINLOCK Spinlock) { PRTSPINLOCKINTERNAL pThis = (PRTSPINLOCKINTERNAL)Spinlock; RT_ASSERT_PREEMPT_CPUID_SPIN_RELEASE_VARS(); AssertMsg(pThis && pThis->u32Magic == RTSPINLOCK_MAGIC, ("pThis=%p u32Magic=%08x\n", pThis, pThis ? (int)pThis->u32Magic : 0)); RT_ASSERT_PREEMPT_CPUID_SPIN_RELEASE(pThis); #ifdef CONFIG_PROVE_LOCKING lockdep_off(); #endif if (pThis->fFlags & RTSPINLOCK_FLAGS_INTERRUPT_SAFE) { unsigned long fIntSaved = pThis->fIntSaved; pThis->fIntSaved = 0; spin_unlock_irqrestore(&pThis->Spinlock, fIntSaved); } else spin_unlock(&pThis->Spinlock); #ifdef CONFIG_PROVE_LOCKING lockdep_on(); #endif RT_ASSERT_PREEMPT_CPUID(); }
RTDECL(void) RTSpinlockRelease(RTSPINLOCK Spinlock) { PRTSPINLOCKINTERNAL pThis = (PRTSPINLOCKINTERNAL)Spinlock; RT_ASSERT_PREEMPT_CPUID_SPIN_RELEASE_VARS(); AssertPtr(pThis); Assert(pThis->u32Magic == RTSPINLOCK_MAGIC); RT_ASSERT_PREEMPT_CPUID_SPIN_RELEASE(pThis); if (pThis->fFlags & RTSPINLOCK_FLAGS_INTERRUPT_SAFE) { uint32_t fIntSaved = pThis->fIntSaved; pThis->fIntSaved = 0; if (ASMAtomicCmpXchgU32(&pThis->fLocked, 0, 1)) ASMSetFlags(fIntSaved); else AssertMsgFailed(("Spinlock %p was not locked!\n", pThis)); } else { if (!ASMAtomicCmpXchgU32(&pThis->fLocked, 0, 1)) AssertMsgFailed(("Spinlock %p was not locked!\n", pThis)); } critical_exit(); }
RTDECL(void) RTSpinlockRelease(RTSPINLOCK Spinlock) { PRTSPINLOCKINTERNAL pThis = (PRTSPINLOCKINTERNAL)Spinlock; RT_ASSERT_PREEMPT_CPUID_SPIN_RELEASE_VARS(); AssertPtr(pThis); Assert(pThis->u32Magic == RTSPINLOCK_MAGIC); RT_ASSERT_PREEMPT_CPUID_SPIN_RELEASE(pThis); if (pThis->fFlags & RTSPINLOCK_FLAGS_INTERRUPT_SAFE) { #if defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86) uint32_t fIntSaved = pThis->fIntSaved; pThis->fIntSaved = 0; #endif mutex_exit(&pThis->Mtx); #if defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86) ASMSetFlags(fIntSaved); #endif } else { #if defined(RT_STRICT) && (defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86)) bool fIntsOn = ASMIntAreEnabled(); #endif mutex_exit(&pThis->Mtx); #if defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86) AssertMsg(fIntsOn == ASMIntAreEnabled(), ("fIntsOn=%RTbool\n", fIntsOn)); #endif } RT_ASSERT_PREEMPT_CPUID(); }