/* *INDENT-OFF* */ #if (CPUS > 1) # if !defined(UNIX) /* ******************************************************************************* * * * this is a Microsoft windows-based operating system. * * * ******************************************************************************* */ # include # define pthread_attr_t HANDLE # define pthread_t HANDLE # define thread_t HANDLE extern pthread_t NumaStartThread(void *func, void *args); # include # pragma intrinsic (_InterlockedExchange) 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); if (0 == iValue) return; while (*hPtr); } } void Pause(void) { } # 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* */