OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2007, 2008, 2010, 2012 Apple Inc. All rights reserved. | 2 * Copyright (C) 2007, 2008, 2010, 2012 Apple Inc. All rights reserved. |
3 * Copyright (C) 2007 Justin Haygood (jhaygood@reaktix.com) | 3 * Copyright (C) 2007 Justin Haygood (jhaygood@reaktix.com) |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
7 * are met: | 7 * are met: |
8 * | 8 * |
9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
69 #include <atomic.h> | 69 #include <atomic.h> |
70 #elif OS(ANDROID) | 70 #elif OS(ANDROID) |
71 #include <sys/atomics.h> | 71 #include <sys/atomics.h> |
72 #endif | 72 #endif |
73 | 73 |
74 namespace WTF { | 74 namespace WTF { |
75 | 75 |
76 #if OS(WINDOWS) | 76 #if OS(WINDOWS) |
77 #define WTF_USE_LOCKFREE_THREADSAFEREFCOUNTED 1 | 77 #define WTF_USE_LOCKFREE_THREADSAFEREFCOUNTED 1 |
78 | 78 |
79 #if OS(WINCE) | 79 #if COMPILER(MINGW) || COMPILER(MSVC7_OR_LOWER) |
80 inline int atomicIncrement(int* addend) { return InterlockedIncrement(reinterpre
t_cast<long*>(addend)); } | |
81 inline int atomicDecrement(int* addend) { return InterlockedDecrement(reinterpre
t_cast<long*>(addend)); } | |
82 #elif COMPILER(MINGW) || COMPILER(MSVC7_OR_LOWER) | |
83 inline int atomicIncrement(int* addend) { return InterlockedIncrement(reinterpre
t_cast<long*>(addend)); } | 80 inline int atomicIncrement(int* addend) { return InterlockedIncrement(reinterpre
t_cast<long*>(addend)); } |
84 inline int atomicDecrement(int* addend) { return InterlockedDecrement(reinterpre
t_cast<long*>(addend)); } | 81 inline int atomicDecrement(int* addend) { return InterlockedDecrement(reinterpre
t_cast<long*>(addend)); } |
85 | 82 |
86 inline int64_t atomicIncrement(int64_t* addend) { return InterlockedIncrement64(
reinterpret_cast<long long*>(addend)); } | 83 inline int64_t atomicIncrement(int64_t* addend) { return InterlockedIncrement64(
reinterpret_cast<long long*>(addend)); } |
87 inline int64_t atomicDecrement(int64_t* addend) { return InterlockedDecrement64(
reinterpret_cast<long long*>(addend)); } | 84 inline int64_t atomicDecrement(int64_t* addend) { return InterlockedDecrement64(
reinterpret_cast<long long*>(addend)); } |
88 #else | 85 #else |
89 inline int atomicIncrement(int volatile* addend) { return InterlockedIncrement(r
einterpret_cast<long volatile*>(addend)); } | 86 inline int atomicIncrement(int volatile* addend) { return InterlockedIncrement(r
einterpret_cast<long volatile*>(addend)); } |
90 inline int atomicDecrement(int volatile* addend) { return InterlockedDecrement(r
einterpret_cast<long volatile*>(addend)); } | 87 inline int atomicDecrement(int volatile* addend) { return InterlockedDecrement(r
einterpret_cast<long volatile*>(addend)); } |
91 | 88 |
92 inline int64_t atomicIncrement(int64_t volatile* addend) { return InterlockedInc
rement64(reinterpret_cast<long long volatile*>(addend)); } | 89 inline int64_t atomicIncrement(int64_t volatile* addend) { return InterlockedInc
rement64(reinterpret_cast<long long volatile*>(addend)); } |
(...skipping 21 matching lines...) Expand all Loading... |
114 inline int atomicDecrement(int volatile* addend) { return __sync_sub_and_fetch(a
ddend, 1); } | 111 inline int atomicDecrement(int volatile* addend) { return __sync_sub_and_fetch(a
ddend, 1); } |
115 | 112 |
116 inline int64_t atomicIncrement(int64_t volatile* addend) { return __sync_add_and
_fetch(addend, 1); } | 113 inline int64_t atomicIncrement(int64_t volatile* addend) { return __sync_add_and
_fetch(addend, 1); } |
117 inline int64_t atomicDecrement(int64_t volatile* addend) { return __sync_sub_and
_fetch(addend, 1); } | 114 inline int64_t atomicDecrement(int64_t volatile* addend) { return __sync_sub_and
_fetch(addend, 1); } |
118 | 115 |
119 #endif | 116 #endif |
120 | 117 |
121 #if OS(WINDOWS) | 118 #if OS(WINDOWS) |
122 inline bool weakCompareAndSwap(volatile unsigned* location, unsigned expected, u
nsigned newValue) | 119 inline bool weakCompareAndSwap(volatile unsigned* location, unsigned expected, u
nsigned newValue) |
123 { | 120 { |
124 #if OS(WINCE) | |
125 return InterlockedCompareExchange(reinterpret_cast<LONG*>(const_cast<unsigne
d*>(location)), static_cast<LONG>(newValue), static_cast<LONG>(expected)) == sta
tic_cast<LONG>(expected); | |
126 #else | |
127 return InterlockedCompareExchange(reinterpret_cast<LONG volatile*>(location)
, static_cast<LONG>(newValue), static_cast<LONG>(expected)) == static_cast<LONG>
(expected); | 121 return InterlockedCompareExchange(reinterpret_cast<LONG volatile*>(location)
, static_cast<LONG>(newValue), static_cast<LONG>(expected)) == static_cast<LONG>
(expected); |
128 #endif | |
129 } | 122 } |
130 | 123 |
131 inline bool weakCompareAndSwap(void*volatile* location, void* expected, void* ne
wValue) | 124 inline bool weakCompareAndSwap(void*volatile* location, void* expected, void* ne
wValue) |
132 { | 125 { |
133 return InterlockedCompareExchangePointer(location, newValue, expected) == ex
pected; | 126 return InterlockedCompareExchangePointer(location, newValue, expected) == ex
pected; |
134 } | 127 } |
135 #else // OS(WINDOWS) --> not windows | 128 #else // OS(WINDOWS) --> not windows |
136 #if COMPILER(GCC) && !COMPILER(CLANG) // Work around a gcc bug | 129 #if COMPILER(GCC) && !COMPILER(CLANG) // Work around a gcc bug |
137 inline bool weakCompareAndSwap(volatile unsigned* location, unsigned expected, u
nsigned newValue) | 130 inline bool weakCompareAndSwap(volatile unsigned* location, unsigned expected, u
nsigned newValue) |
138 #else | 131 #else |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
227 #endif | 220 #endif |
228 | 221 |
229 } // namespace WTF | 222 } // namespace WTF |
230 | 223 |
231 #if USE(LOCKFREE_THREADSAFEREFCOUNTED) | 224 #if USE(LOCKFREE_THREADSAFEREFCOUNTED) |
232 using WTF::atomicDecrement; | 225 using WTF::atomicDecrement; |
233 using WTF::atomicIncrement; | 226 using WTF::atomicIncrement; |
234 #endif | 227 #endif |
235 | 228 |
236 #endif // Atomics_h | 229 #endif // Atomics_h |
OLD | NEW |