/* *INDENT-OFF* */
#if (CPUS > 1)
# if !defined(UNIX)
/*
*******************************************************************************
* *
* this is a Microsoft windows-based operating system. *
* *
*******************************************************************************
*/
# include <windows.h>
# define pthread_attr_t HANDLE
# define pthread_t HANDLE
# define thread_t HANDLE
extern pthread_t NumaStartThread(void *func, void *args);
# include <windows.h>
//# pragma intrinsic (_InterlockedExchange) // Pierre-Marie Baty -- it's already intrinsic, and there's no leading underscore
typedef volatile LONG lock_t[1];
# define LockInit(v) ((v)[0] = 0)
# define LockFree(v) ((v)[0] = 0)
# define Unlock(v) ((v)[0] = 0)
__forceinline void Lock(volatile LONG * hPtr) {
int iValue;
for (;;) {
iValue = /*_*/InterlockedExchange((LPLONG) hPtr, 1); // Pierre-Marie Baty -- no leading underscore
if (0 == iValue)
return;
while (*hPtr);
}
}
void Pause() {
}
# else
/*
*******************************************************************************
* *
* this is a Unix-based operating system. define the spinlock code as needed *
* for SMP synchronization. *
* *
*******************************************************************************
*/
static void __inline__ LockX86(volatile int *lock) {
int dummy;
asm __volatile__(
"1: movl $1, %0" "\n\t"
" xchgl (%1), %0" "\n\t"
" testl %0, %0" "\n\t"
" jz 3f" "\n\t"
"2: pause" "\n\t"
" movl (%1), %0" "\n\t"
" testl %0, %0" "\n\t"
" jnz 2b" "\n\t"
" jmp 1b" "\n\t"
"3:" "\n\t"
:"=&q"(dummy)
:"q"(lock)
:"cc", "memory");
}
static void __inline__ Pause() {
asm __volatile__(
" pause" "\n\t");
}
static void __inline__ UnlockX86(volatile int *lock) {
asm __volatile__(
"movl $0, (%0)"
:
:"q"(lock)
:"memory");
}
# define LockInit(p) (p=0)
# define LockFree(p) (p=0)
# define Unlock(p) (UnlockX86(&p))
# define Lock(p) (LockX86(&p))
# define lock_t volatile int
# endif
#else
# define LockInit(p)
# define LockFree(p)
# define Lock(p)
# define Unlock(p)
# define lock_t volatile int
#endif /* SMP code */
/* *INDENT-ON* */