mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 00:12:57 +00:00
[NTOS]
Move spinlock inline functions into their own header, so they can be shared with hal. svn path=/branches/ros-amd64-bringup/; revision=44893
This commit is contained in:
parent
78490595ed
commit
3a0ef6c524
3 changed files with 96 additions and 81 deletions
|
@ -101,32 +101,7 @@ KeGetPreviousMode(VOID)
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
|
||||||
NTAPI
|
|
||||||
Kii386SpinOnSpinLock(PKSPIN_LOCK SpinLock, ULONG Flags);
|
|
||||||
|
|
||||||
#ifndef CONFIG_SMP
|
#ifndef CONFIG_SMP
|
||||||
//
|
|
||||||
// Spinlock Acquire at IRQL >= DISPATCH_LEVEL
|
|
||||||
//
|
|
||||||
FORCEINLINE
|
|
||||||
VOID
|
|
||||||
KxAcquireSpinLock(IN PKSPIN_LOCK SpinLock)
|
|
||||||
{
|
|
||||||
/* On UP builds, spinlocks don't exist at IRQL >= DISPATCH */
|
|
||||||
UNREFERENCED_PARAMETER(SpinLock);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Spinlock Release at IRQL >= DISPATCH_LEVEL
|
|
||||||
//
|
|
||||||
FORCEINLINE
|
|
||||||
VOID
|
|
||||||
KxReleaseSpinLock(IN PKSPIN_LOCK SpinLock)
|
|
||||||
{
|
|
||||||
/* On UP builds, spinlocks don't exist at IRQL >= DISPATCH */
|
|
||||||
UNREFERENCED_PARAMETER(SpinLock);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// This routine protects against multiple CPU acquires, it's meaningless on UP.
|
// This routine protects against multiple CPU acquires, it's meaningless on UP.
|
||||||
|
@ -307,62 +282,6 @@ KiReleaseTimerLock(IN PKSPIN_LOCK_QUEUE LockQueue)
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
//
|
|
||||||
// Spinlock Acquisition at IRQL >= DISPATCH_LEVEL
|
|
||||||
//
|
|
||||||
FORCEINLINE
|
|
||||||
VOID
|
|
||||||
KxAcquireSpinLock(IN PKSPIN_LOCK SpinLock)
|
|
||||||
{
|
|
||||||
#ifdef DBG
|
|
||||||
/* Make sure that we don't own the lock already */
|
|
||||||
if (((KSPIN_LOCK)KeGetCurrentThread() | 1) == *SpinLock)
|
|
||||||
{
|
|
||||||
/* We do, bugcheck! */
|
|
||||||
KeBugCheckEx(SPIN_LOCK_ALREADY_OWNED, (ULONG_PTR)SpinLock, 0, 0, 0);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Try to acquire the lock */
|
|
||||||
while (InterlockedBitTestAndSet((PLONG)SpinLock, 0))
|
|
||||||
{
|
|
||||||
#if defined(_M_IX86) && defined(DBG)
|
|
||||||
/* On x86 debug builds, we use a much slower but useful routine */
|
|
||||||
Kii386SpinOnSpinLock(SpinLock, 5);
|
|
||||||
#else
|
|
||||||
/* It's locked... spin until it's unlocked */
|
|
||||||
while (*(volatile KSPIN_LOCK *)SpinLock & 1)
|
|
||||||
{
|
|
||||||
/* Yield and keep looping */
|
|
||||||
YieldProcessor();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#ifdef DBG
|
|
||||||
/* On debug builds, we OR in the KTHREAD */
|
|
||||||
*SpinLock = (KSPIN_LOCK)KeGetCurrentThread() | 1;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Spinlock Release at IRQL >= DISPATCH_LEVEL
|
|
||||||
//
|
|
||||||
FORCEINLINE
|
|
||||||
VOID
|
|
||||||
KxReleaseSpinLock(IN PKSPIN_LOCK SpinLock)
|
|
||||||
{
|
|
||||||
#if DBG
|
|
||||||
/* Make sure that the threads match */
|
|
||||||
if (((KSPIN_LOCK)KeGetCurrentThread() | 1) != *SpinLock)
|
|
||||||
{
|
|
||||||
/* They don't, bugcheck */
|
|
||||||
KeBugCheckEx(SPIN_LOCK_NOT_OWNED, (ULONG_PTR)SpinLock, 0, 0, 0);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
/* Clear the lock */
|
|
||||||
InterlockedAnd((PLONG)SpinLock, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
FORCEINLINE
|
FORCEINLINE
|
||||||
VOID
|
VOID
|
||||||
KiAcquireDispatcherObject(IN DISPATCHER_HEADER* Object)
|
KiAcquireDispatcherObject(IN DISPATCHER_HEADER* Object)
|
||||||
|
|
|
@ -83,6 +83,7 @@
|
||||||
#include "../kdbg/kdb.h"
|
#include "../kdbg/kdb.h"
|
||||||
#endif
|
#endif
|
||||||
#include "dbgk.h"
|
#include "dbgk.h"
|
||||||
|
#include "spinlock.h"
|
||||||
#include "tag.h"
|
#include "tag.h"
|
||||||
#include "test.h"
|
#include "test.h"
|
||||||
#include "inbv.h"
|
#include "inbv.h"
|
||||||
|
|
95
reactos/ntoskrnl/include/internal/spinlock.h
Normal file
95
reactos/ntoskrnl/include/internal/spinlock.h
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
/*
|
||||||
|
* PROJECT: ReactOS Kernel
|
||||||
|
* LICENSE: GPL - See COPYING in the top level directory
|
||||||
|
* FILE: ntoskrnl/include/spinlock.h
|
||||||
|
* PURPOSE: Internal Inlined Functions for spinlocks, shared with HAL
|
||||||
|
* PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
|
||||||
|
*/
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
Kii386SpinOnSpinLock(PKSPIN_LOCK SpinLock, ULONG Flags);
|
||||||
|
|
||||||
|
#ifndef CONFIG_SMP
|
||||||
|
|
||||||
|
//
|
||||||
|
// Spinlock Acquire at IRQL >= DISPATCH_LEVEL
|
||||||
|
//
|
||||||
|
FORCEINLINE
|
||||||
|
VOID
|
||||||
|
KxAcquireSpinLock(IN PKSPIN_LOCK SpinLock)
|
||||||
|
{
|
||||||
|
/* On UP builds, spinlocks don't exist at IRQL >= DISPATCH */
|
||||||
|
UNREFERENCED_PARAMETER(SpinLock);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Spinlock Release at IRQL >= DISPATCH_LEVEL
|
||||||
|
//
|
||||||
|
FORCEINLINE
|
||||||
|
VOID
|
||||||
|
KxReleaseSpinLock(IN PKSPIN_LOCK SpinLock)
|
||||||
|
{
|
||||||
|
/* On UP builds, spinlocks don't exist at IRQL >= DISPATCH */
|
||||||
|
UNREFERENCED_PARAMETER(SpinLock);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
//
|
||||||
|
// Spinlock Acquisition at IRQL >= DISPATCH_LEVEL
|
||||||
|
//
|
||||||
|
FORCEINLINE
|
||||||
|
VOID
|
||||||
|
KxAcquireSpinLock(IN PKSPIN_LOCK SpinLock)
|
||||||
|
{
|
||||||
|
#ifdef DBG
|
||||||
|
/* Make sure that we don't own the lock already */
|
||||||
|
if (((KSPIN_LOCK)KeGetCurrentThread() | 1) == *SpinLock)
|
||||||
|
{
|
||||||
|
/* We do, bugcheck! */
|
||||||
|
KeBugCheckEx(SPIN_LOCK_ALREADY_OWNED, (ULONG_PTR)SpinLock, 0, 0, 0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Try to acquire the lock */
|
||||||
|
while (InterlockedBitTestAndSet((PLONG)SpinLock, 0))
|
||||||
|
{
|
||||||
|
#if defined(_M_IX86) && defined(DBG)
|
||||||
|
/* On x86 debug builds, we use a much slower but useful routine */
|
||||||
|
Kii386SpinOnSpinLock(SpinLock, 5);
|
||||||
|
#else
|
||||||
|
/* It's locked... spin until it's unlocked */
|
||||||
|
while (*(volatile KSPIN_LOCK *)SpinLock & 1)
|
||||||
|
{
|
||||||
|
/* Yield and keep looping */
|
||||||
|
YieldProcessor();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#ifdef DBG
|
||||||
|
/* On debug builds, we OR in the KTHREAD */
|
||||||
|
*SpinLock = (KSPIN_LOCK)KeGetCurrentThread() | 1;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Spinlock Release at IRQL >= DISPATCH_LEVEL
|
||||||
|
//
|
||||||
|
FORCEINLINE
|
||||||
|
VOID
|
||||||
|
KxReleaseSpinLock(IN PKSPIN_LOCK SpinLock)
|
||||||
|
{
|
||||||
|
#if DBG
|
||||||
|
/* Make sure that the threads match */
|
||||||
|
if (((KSPIN_LOCK)KeGetCurrentThread() | 1) != *SpinLock)
|
||||||
|
{
|
||||||
|
/* They don't, bugcheck */
|
||||||
|
KeBugCheckEx(SPIN_LOCK_NOT_OWNED, (ULONG_PTR)SpinLock, 0, 0, 0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/* Clear the lock */
|
||||||
|
InterlockedAnd((PLONG)SpinLock, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Loading…
Add table
Add a link
Reference in a new issue