RTDECL(void) RTThreadPreemptDisable(PRTTHREADPREEMPTSTATE pState) { AssertPtr(pState); Assert(pState->u32Reserved == 0); pState->u32Reserved = 42; /* * Disable to prevent preemption while we grab the per-cpu spin lock. * Note! Only take the lock on the first call or we end up spinning for ever. */ RTCCUINTREG fSavedFlags = ASMIntDisableFlags(); RTCPUID idCpu = RTMpCpuId(); if (RT_UNLIKELY(idCpu < RT_ELEMENTS(g_aPreemptHacks))) { Assert(g_aPreemptHacks[idCpu].cRecursion < UINT32_MAX / 2); if (++g_aPreemptHacks[idCpu].cRecursion == 1) { lck_spin_t *pSpinLock = g_aPreemptHacks[idCpu].pSpinLock; if (pSpinLock) lck_spin_lock(pSpinLock); else AssertFailed(); } } ASMSetFlags(fSavedFlags); Assert(!RTThreadPreemptIsEnabled(NIL_RTTHREAD)); RT_ASSERT_PREEMPT_CPUID_DISABLE(pState); }
RTDECL(void) RTThreadPreemptDisable(PRTTHREADPREEMPTSTATE pState) { AssertPtr(pState); Assert(pState->uOldCpuState == 0); pState->uOldCpuState = (uint32_t)disable_interrupts(); RT_ASSERT_PREEMPT_CPUID_DISABLE(pState); }
RTDECL(void) RTThreadPreemptDisable(PRTTHREADPREEMPTSTATE pState) { AssertPtr(pState); Assert(pState->uchOldIrql == 255); Assert(KeGetCurrentIrql() <= DISPATCH_LEVEL); KeRaiseIrql(DISPATCH_LEVEL, &pState->uchOldIrql); RT_ASSERT_PREEMPT_CPUID_DISABLE(pState); }
RTDECL(void) RTThreadPreemptDisable(PRTTHREADPREEMPTSTATE pState) { AssertPtr(pState); Assert(pState->u32Reserved == 0); pState->u32Reserved = 42; critical_enter(); RT_ASSERT_PREEMPT_CPUID_DISABLE(pState); }
RTDECL(void) RTThreadPreemptDisable(PRTTHREADPREEMPTSTATE pState) { AssertPtr(pState); Assert(pState->uOldCpuState == 0); //dprintf("%s(%p)\n", __FUNCTION__, pState); pState->uOldCpuState = (uint32_t)disable_interrupts(); //GRAB_THREAD_LOCK(); RT_ASSERT_PREEMPT_CPUID_DISABLE(pState); }
RTDECL(void) RTThreadPreemptDisable(PRTTHREADPREEMPTSTATE pState) { AssertPtr(pState); Assert(pState->u32Reserved == 0); /* No preemption on OS/2, so do our own accounting. */ int32_t c = ASMAtomicIncS32(&g_acPreemptDisabled[ASMGetApicId()]); AssertMsg(c > 0 && c < 32, ("%d\n", c)); pState->u32Reserved = c; RT_ASSERT_PREEMPT_CPUID_DISABLE(pState); }
RTDECL(void) RTThreadPreemptDisable(PRTTHREADPREEMPTSTATE pState) { #ifdef CONFIG_PREEMPT AssertPtr(pState); Assert(pState->u32Reserved == 0); pState->u32Reserved = 42; preempt_disable(); RT_ASSERT_PREEMPT_CPUID_DISABLE(pState); #else /* !CONFIG_PREEMPT */ int32_t c; AssertPtr(pState); Assert(pState->u32Reserved == 0); /* Do our own accounting. */ c = ASMAtomicIncS32(&g_acPreemptDisabled[smp_processor_id()]); AssertMsg(c > 0 && c < 32, ("%d\n", c)); pState->u32Reserved = c; RT_ASSERT_PREEMPT_CPUID_DISABLE(pState); #endif }