hal: Implement plain spinlock functions on top of DPC-level ones.

Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Zebediah Figura 2019-01-27 20:45:34 -06:00 committed by Alexandre Julliard
parent 05f5cce6c8
commit 286ef48498
2 changed files with 3 additions and 8 deletions

View file

@ -1,5 +1,6 @@
MODULE = hal.dll
IMPORTLIB = hal
IMPORTS = ntoskrnl
C_SRCS = \
hal.c

View file

@ -76,16 +76,10 @@ KIRQL WINAPI DECLSPEC_HIDDEN __regs_KfAcquireSpinLock( KSPIN_LOCK *lock )
return irql;
}
static inline void small_pause(void)
{
__asm__ __volatile__( "rep;nop" : : : "memory" );
}
void WINAPI KeAcquireSpinLock( KSPIN_LOCK *lock, KIRQL *irql )
{
TRACE("lock %p, irql %p.\n", lock, irql);
while (!InterlockedCompareExchangePointer( (void **)lock, (void *)1, (void *)0 ))
small_pause();
KeAcquireSpinLockAtDpcLevel( lock );
*irql = 0;
}
@ -98,7 +92,7 @@ void WINAPI DECLSPEC_HIDDEN __regs_KfReleaseSpinLock( KSPIN_LOCK *lock, KIRQL ir
void WINAPI KeReleaseSpinLock( KSPIN_LOCK *lock, KIRQL irql )
{
TRACE("lock %p, irql %u.\n", lock, irql);
InterlockedExchangePointer( (void **)lock, 0 );
KeReleaseSpinLockFromDpcLevel( lock );
}
#endif /* __i386__ */