Lines 18-23
Link Here
|
18 |
#include "apr_atomic.h" |
18 |
#include "apr_atomic.h" |
19 |
#include "apr_thread_mutex.h" |
19 |
#include "apr_thread_mutex.h" |
20 |
|
20 |
|
|
|
21 |
#if _MSC_VER >= 1310 |
22 |
#define USE_ATOMICS_BUILTINS |
23 |
#include <intrin.h> |
24 |
#pragma intrinsic( _InterlockedIncrement ) |
25 |
#pragma intrinsic( _InterlockedDecrement ) |
26 |
#pragma intrinsic( _InterlockedCompareExchange ) |
27 |
#pragma intrinsic( _InterlockedExchange ) |
28 |
#pragma intrinsic( _InterlockedExchangeAdd ) |
29 |
#endif |
30 |
|
21 |
APR_DECLARE(apr_status_t) apr_atomic_init(apr_pool_t *p) |
31 |
APR_DECLARE(apr_status_t) apr_atomic_init(apr_pool_t *p) |
22 |
{ |
32 |
{ |
23 |
return APR_SUCCESS; |
33 |
return APR_SUCCESS; |
Lines 44-50
Link Here
|
44 |
|
54 |
|
45 |
APR_DECLARE(apr_uint32_t) apr_atomic_add32(volatile apr_uint32_t *mem, apr_uint32_t val) |
55 |
APR_DECLARE(apr_uint32_t) apr_atomic_add32(volatile apr_uint32_t *mem, apr_uint32_t val) |
46 |
{ |
56 |
{ |
47 |
#if (defined(_M_IA64) || defined(_M_AMD64)) |
57 |
#if defined(USE_ATOMICS_BUILTINS) |
|
|
58 |
return _InterlockedExchangeAdd(mem, val); |
59 |
#elif (defined(_M_IA64) || defined(_M_AMD64)) |
48 |
return InterlockedExchangeAdd(mem, val); |
60 |
return InterlockedExchangeAdd(mem, val); |
49 |
#elif defined(__MINGW32__) |
61 |
#elif defined(__MINGW32__) |
50 |
return InterlockedExchangeAdd((long *)mem, val); |
62 |
return InterlockedExchangeAdd((long *)mem, val); |
Lines 58-64
Link Here
|
58 |
|
70 |
|
59 |
APR_DECLARE(void) apr_atomic_sub32(volatile apr_uint32_t *mem, apr_uint32_t val) |
71 |
APR_DECLARE(void) apr_atomic_sub32(volatile apr_uint32_t *mem, apr_uint32_t val) |
60 |
{ |
72 |
{ |
61 |
#if (defined(_M_IA64) || defined(_M_AMD64)) |
73 |
#if defined(USE_ATOMICS_BUILTINS) |
|
|
74 |
_InterlockedExchangeAdd(mem, -val); |
75 |
#elif (defined(_M_IA64) || defined(_M_AMD64)) |
62 |
InterlockedExchangeAdd(mem, -val); |
76 |
InterlockedExchangeAdd(mem, -val); |
63 |
#elif defined(__MINGW32__) |
77 |
#elif defined(__MINGW32__) |
64 |
InterlockedExchangeAdd((long *)mem, -val); |
78 |
InterlockedExchangeAdd((long *)mem, -val); |
Lines 70-76
Link Here
|
70 |
APR_DECLARE(apr_uint32_t) apr_atomic_inc32(volatile apr_uint32_t *mem) |
84 |
APR_DECLARE(apr_uint32_t) apr_atomic_inc32(volatile apr_uint32_t *mem) |
71 |
{ |
85 |
{ |
72 |
/* we return old value, win32 returns new value :( */ |
86 |
/* we return old value, win32 returns new value :( */ |
73 |
#if (defined(_M_IA64) || defined(_M_AMD64)) && !defined(RC_INVOKED) |
87 |
#if defined(USE_ATOMICS_BUILTINS) |
|
|
88 |
return _InterlockedIncrement(mem) - 1; |
89 |
#elif (defined(_M_IA64) || defined(_M_AMD64)) && !defined(RC_INVOKED) |
74 |
return InterlockedIncrement(mem) - 1; |
90 |
return InterlockedIncrement(mem) - 1; |
75 |
#elif defined(__MINGW32__) |
91 |
#elif defined(__MINGW32__) |
76 |
return InterlockedIncrement((long *)mem) - 1; |
92 |
return InterlockedIncrement((long *)mem) - 1; |
Lines 81-87
Link Here
|
81 |
|
97 |
|
82 |
APR_DECLARE(int) apr_atomic_dec32(volatile apr_uint32_t *mem) |
98 |
APR_DECLARE(int) apr_atomic_dec32(volatile apr_uint32_t *mem) |
83 |
{ |
99 |
{ |
84 |
#if (defined(_M_IA64) || defined(_M_AMD64)) && !defined(RC_INVOKED) |
100 |
#if defined(USE_ATOMICS_BUILTINS) |
|
|
101 |
return _InterlockedDecrement(mem); |
102 |
#elif (defined(_M_IA64) || defined(_M_AMD64)) && !defined(RC_INVOKED) |
85 |
return InterlockedDecrement(mem); |
103 |
return InterlockedDecrement(mem); |
86 |
#elif defined(__MINGW32__) |
104 |
#elif defined(__MINGW32__) |
87 |
return InterlockedDecrement((long *)mem); |
105 |
return InterlockedDecrement((long *)mem); |
Lines 92-98
Link Here
|
92 |
|
110 |
|
93 |
APR_DECLARE(void) apr_atomic_set32(volatile apr_uint32_t *mem, apr_uint32_t val) |
111 |
APR_DECLARE(void) apr_atomic_set32(volatile apr_uint32_t *mem, apr_uint32_t val) |
94 |
{ |
112 |
{ |
95 |
#if (defined(_M_IA64) || defined(_M_AMD64)) && !defined(RC_INVOKED) |
113 |
#if defined(USE_ATOMICS_BUILTINS) |
|
|
114 |
_InterlockedExchange(mem, val); |
115 |
#elif (defined(_M_IA64) || defined(_M_AMD64)) && !defined(RC_INVOKED) |
96 |
InterlockedExchange(mem, val); |
116 |
InterlockedExchange(mem, val); |
97 |
#elif defined(__MINGW32__) |
117 |
#elif defined(__MINGW32__) |
98 |
InterlockedExchange((long*)mem, val); |
118 |
InterlockedExchange((long*)mem, val); |
Lines 109-115
Link Here
|
109 |
APR_DECLARE(apr_uint32_t) apr_atomic_cas32(volatile apr_uint32_t *mem, apr_uint32_t with, |
129 |
APR_DECLARE(apr_uint32_t) apr_atomic_cas32(volatile apr_uint32_t *mem, apr_uint32_t with, |
110 |
apr_uint32_t cmp) |
130 |
apr_uint32_t cmp) |
111 |
{ |
131 |
{ |
112 |
#if (defined(_M_IA64) || defined(_M_AMD64)) && !defined(RC_INVOKED) |
132 |
#if defined(USE_ATOMICS_BUILTINS) |
|
|
133 |
return _InterlockedCompareExchange(mem, with, cmp); |
134 |
#elif (defined(_M_IA64) || defined(_M_AMD64)) && !defined(RC_INVOKED) |
113 |
return InterlockedCompareExchange(mem, with, cmp); |
135 |
return InterlockedCompareExchange(mem, with, cmp); |
114 |
#elif defined(__MINGW32__) |
136 |
#elif defined(__MINGW32__) |
115 |
return InterlockedCompareExchange((long*)mem, with, cmp); |
137 |
return InterlockedCompareExchange((long*)mem, with, cmp); |
Lines 125-138
Link Here
|
125 |
#elif defined(__MINGW32__) |
147 |
#elif defined(__MINGW32__) |
126 |
return InterlockedCompareExchangePointer((void**)mem, with, (void*)cmp); |
148 |
return InterlockedCompareExchangePointer((void**)mem, with, (void*)cmp); |
127 |
#else |
149 |
#else |
|
|
150 |
#ifdef USE_ATOMICS_BUILTINS |
151 |
return (void*)_InterlockedCompareExchange((long*)mem, (long)with, (long)cmp); |
152 |
#else |
128 |
/* Too many VC6 users have stale win32 API files, stub this */ |
153 |
/* Too many VC6 users have stale win32 API files, stub this */ |
129 |
return ((apr_atomic_win32_ptr_ptr_ptr_fn)InterlockedCompareExchange)(mem, with, cmp); |
154 |
return ((apr_atomic_win32_ptr_ptr_ptr_fn)InterlockedCompareExchange)(mem, with, cmp); |
130 |
#endif |
155 |
#endif |
|
|
156 |
#endif |
131 |
} |
157 |
} |
132 |
|
158 |
|
133 |
APR_DECLARE(apr_uint32_t) apr_atomic_xchg32(volatile apr_uint32_t *mem, apr_uint32_t val) |
159 |
APR_DECLARE(apr_uint32_t) apr_atomic_xchg32(volatile apr_uint32_t *mem, apr_uint32_t val) |
134 |
{ |
160 |
{ |
135 |
#if (defined(_M_IA64) || defined(_M_AMD64)) && !defined(RC_INVOKED) |
161 |
#if defined(USE_ATOMICS_BUILTINS) |
|
|
162 |
return _InterlockedExchange(mem, val); |
163 |
#elif (defined(_M_IA64) || defined(_M_AMD64)) && !defined(RC_INVOKED) |
136 |
return InterlockedExchange(mem, val); |
164 |
return InterlockedExchange(mem, val); |
137 |
#elif defined(__MINGW32__) |
165 |
#elif defined(__MINGW32__) |
138 |
return InterlockedExchange((long *)mem, val); |
166 |
return InterlockedExchange((long *)mem, val); |
Lines 146-152
Link Here
|
146 |
#if (defined(_M_IA64) || defined(_M_AMD64) || defined(__MINGW32__)) && !defined(RC_INVOKED) |
174 |
#if (defined(_M_IA64) || defined(_M_AMD64) || defined(__MINGW32__)) && !defined(RC_INVOKED) |
147 |
return InterlockedExchangePointer((void**)mem, with); |
175 |
return InterlockedExchangePointer((void**)mem, with); |
148 |
#else |
176 |
#else |
|
|
177 |
#ifdef USE_ATOMICS_BUILTINS |
178 |
return (void*)_InterlockedExchange((long*)mem, (long)with); |
179 |
#else |
149 |
/* Too many VC6 users have stale win32 API files, stub this */ |
180 |
/* Too many VC6 users have stale win32 API files, stub this */ |
150 |
return ((apr_atomic_win32_ptr_ptr_fn)InterlockedExchange)(mem, with); |
181 |
return ((apr_atomic_win32_ptr_ptr_fn)InterlockedExchange)(mem, with); |
151 |
#endif |
182 |
#endif |
|
|
183 |
#endif |
152 |
} |
184 |
} |