View | Details | Raw Unified | Return to bug 43793
Collapse All | Expand All

(-)atomic/win32/apr_atomic.c (-7 / +39 lines)
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
}

Return to bug 43793