Rev 33 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 33 | Rev 108 | ||
---|---|---|---|
Line 13... | Line 13... | ||
13 | # define pthread_t HANDLE |
13 | # define pthread_t HANDLE |
14 | # define thread_t HANDLE |
14 | # define thread_t HANDLE |
15 | extern pthread_t NumaStartThread(void *func, void *args); |
15 | extern pthread_t NumaStartThread(void *func, void *args); |
16 | 16 | ||
17 | # include <windows.h> |
17 | # include <windows.h> |
18 |
|
18 | //# pragma intrinsic (_InterlockedExchange) // Pierre-Marie Baty -- it's already intrinsic, and there's no leading underscore |
19 | # pragma intrinsic (_InterlockedExchange) |
- | |
20 | typedef volatile LONG lock_t[1]; |
19 | typedef volatile LONG lock_t[1]; |
21 | 20 | ||
22 | # define LockInit(v) ((v)[0] = 0) |
21 | # define LockInit(v) ((v)[0] = 0) |
23 | # define LockFree(v) ((v)[0] = 0) |
22 | # define LockFree(v) ((v)[0] = 0) |
24 | # define Unlock(v) ((v)[0] = 0) |
23 | # define Unlock(v) ((v)[0] = 0) |
25 | __forceinline void Lock(volatile LONG * hPtr) { |
24 | __forceinline void Lock(volatile LONG * hPtr) { |
26 | int iValue; |
25 | int iValue; |
27 | 26 | ||
28 | for (;;) { |
27 | for (;;) { |
29 | iValue = |
28 | iValue = /*_*/InterlockedExchange((LPLONG) hPtr, 1); // Pierre-Marie Baty -- no leading underscore |
30 | if (0 == iValue) |
29 | if (0 == iValue) |
31 | return; |
30 | return; |
32 | while (*hPtr); |
31 | while (*hPtr); |
33 | } |
32 | } |
34 | } |
33 | } |
Line 44... | Line 43... | ||
44 | ******************************************************************************* |
43 | ******************************************************************************* |
45 | */ |
44 | */ |
46 | static void __inline__ LockX86(volatile int *lock) { |
45 | static void __inline__ LockX86(volatile int *lock) { |
47 | int dummy; |
46 | int dummy; |
48 | asm __volatile__( |
47 | asm __volatile__( |
49 | "1: movl $1, %0" "\n\t" |
48 | "1: movl $1, %0" "\n\t" |
50 | " xchgl (%1), %0" "\n\t" |
49 | " xchgl (%1), %0" "\n\t" |
51 | " testl %0, %0" "\n\t" |
50 | " testl %0, %0" "\n\t" |
52 | " jz 3f" "\n\t" |
51 | " jz 3f" "\n\t" |
53 | "2: pause" "\n\t" |
52 | "2: pause" "\n\t" |
54 | " movl (%1), %0" "\n\t" |
53 | " movl (%1), %0" "\n\t" |
55 | " testl %0, %0" "\n\t" |
54 | " testl %0, %0" "\n\t" |
56 | " jnz 2b" "\n\t" |
55 | " jnz 2b" "\n\t" |
57 | " jmp 1b" "\n\t" |
56 | " jmp 1b" "\n\t" |
58 | "3:" "\n\t" |
57 | "3:" "\n\t" |
59 | :"=&q"(dummy) |
58 | :"=&q"(dummy) |
60 | :"q"(lock) |
59 | :"q"(lock) |
61 | :"cc", "memory"); |
60 | :"cc", "memory"); |
62 | } |
61 | } |
63 | static void __inline__ Pause() { |
62 | static void __inline__ Pause() { |
64 | asm __volatile__( |
63 | asm __volatile__( |
65 | " pause" "\n\t"); |
64 | " pause" "\n\t"); |
66 | } |
65 | } |
67 | static void __inline__ UnlockX86(volatile int *lock) { |
66 | static void __inline__ UnlockX86(volatile int *lock) { |
68 | asm __volatile__( |
67 | asm __volatile__( |
69 | "movl $0, (%0)" |
68 | "movl $0, (%0)" |
70 | : |
69 | : |
71 | :"q"(lock) |
70 | :"q"(lock) |
72 | :"memory"); |
71 | :"memory"); |
73 | } |
72 | } |
74 | 73 | ||
Line 81... | Line 80... | ||
81 | #else |
80 | #else |
82 | # define LockInit(p) |
81 | # define LockInit(p) |
83 | # define LockFree(p) |
82 | # define LockFree(p) |
84 | # define Lock(p) |
83 | # define Lock(p) |
85 | # define Unlock(p) |
84 | # define Unlock(p) |
86 | # define lock_t volatile int |
85 | # define lock_t volatile int |
87 | #endif |
86 | #endif /* SMP code */ |
88 | /* *INDENT-ON* */ |
87 | /* *INDENT-ON* */ |