31 #ifndef _USER_ATOMIC_H_ 32 #define _USER_ATOMIC_H_ 43 #include <sys/types.h> 45 #if defined(__Userspace_os_Darwin) || defined (__Userspace_os_Windows) 46 #if defined (__Userspace_os_Windows) 47 #define atomic_add_int(addr, val) InterlockedExchangeAdd((LPLONG)addr, (LONG)val) 48 #define atomic_fetchadd_int(addr, val) InterlockedExchangeAdd((LPLONG)addr, (LONG)val) 49 #define atomic_subtract_int(addr, val) InterlockedExchangeAdd((LPLONG)addr,-((LONG)val)) 50 #define atomic_cmpset_int(dst, exp, src) InterlockedCompareExchange((LPLONG)dst, src, exp) 51 #define SCTP_DECREMENT_AND_CHECK_REFCOUNT(addr) (InterlockedExchangeAdd((LPLONG)addr, (-1L)) == 1) 53 #include <libkern/OSAtomic.h> 54 #define atomic_add_int(addr, val) OSAtomicAdd32Barrier(val, (int32_t *)addr) 55 #define atomic_fetchadd_int(addr, val) OSAtomicAdd32Barrier(val, (int32_t *)addr) 56 #define atomic_subtract_int(addr, val) OSAtomicAdd32Barrier(-val, (int32_t *)addr) 57 #define atomic_cmpset_int(dst, exp, src) OSAtomicCompareAndSwapIntBarrier(exp, src, (int *)dst) 58 #define SCTP_DECREMENT_AND_CHECK_REFCOUNT(addr) (atomic_fetchadd_int(addr, -1) == 0) 61 #if defined(INVARIANTS) 62 #define SCTP_SAVE_ATOMIC_DECREMENT(addr, val) \ 65 newval = atomic_fetchadd_int(addr, -val); \ 67 panic("Counter goes negative"); \ 71 #define SCTP_SAVE_ATOMIC_DECREMENT(addr, val) \ 74 newval = atomic_fetchadd_int(addr, -val); \ 80 #if defined(__Userspace_os_Windows) 81 static void atomic_init() {}
94 #define atomic_add_int(P, V) (void) __sync_fetch_and_add(P, V) 97 #define atomic_subtract_int(P, V) (void) __sync_fetch_and_sub(P, V) 103 #define atomic_fetchadd_int(p, v) __sync_fetch_and_add(p, v) 113 #define atomic_cmpset_int(dst, exp, src) __sync_bool_compare_and_swap(dst, exp, src) 115 #define SCTP_DECREMENT_AND_CHECK_REFCOUNT(addr) (atomic_fetchadd_int(addr, -1) == 1) 116 #if defined(INVARIANTS) 117 #define SCTP_SAVE_ATOMIC_DECREMENT(addr, val) \ 120 oldval = atomic_fetchadd_int(addr, -val); \ 121 if (oldval < val) { \ 122 panic("Counter goes negative"); \ 126 #define SCTP_SAVE_ATOMIC_DECREMENT(addr, val) \ 129 oldval = atomic_fetchadd_int(addr, -val); \ 130 if (oldval < val) { \ 135 static inline void atomic_init() {}
139 #include "user_include/atomic_ops.h" 142 #define atomic_add_int(P, V) AO_fetch_and_add((AO_t*)P, V) 144 #define atomic_subtract_int(P, V) AO_fetch_and_add((AO_t*)P, -(V)) 150 #define atomic_fetchadd_int(p, v) AO_fetch_and_add((AO_t*)p, v) 165 #define atomic_cmpset_int(dst, exp, src) AO_compare_and_swap((AO_t*)dst, exp, src) 167 static inline void atomic_init() {}
176 #if defined (__Userspace_os_Windows) 177 static inline void atomic_init() {
180 static inline void atomic_destroy() {
183 static inline void atomic_lock() {
186 static inline void atomic_unlock() {
190 static inline void atomic_init() {
191 pthread_mutexattr_t mutex_attr;
193 pthread_mutexattr_init(&mutex_attr);
195 pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_ERRORCHECK);
198 pthread_mutexattr_destroy(&mutex_attr);
200 static inline void atomic_destroy() {
203 static inline void atomic_lock() {
205 KASSERT(pthread_mutex_lock(&
atomic_mtx) == 0, (
"atomic_lock: atomic_mtx already locked"))
210 static inline void atomic_unlock() {
212 KASSERT(pthread_mutex_unlock(&
atomic_mtx) == 0, (
"atomic_unlock: atomic_mtx not locked"))
223 #define MPLOCKED "lock ; " 229 static __inline u_int
237 "# atomic_fetchadd_int" 247 #ifdef CPU_DISABLE_CMPXCHG 264 "# atomic_cmpset_int" 289 "# atomic_cmpset_int" 303 #define atomic_add_int(P, V) do { \ 305 (*(u_int *)(P) += (V)); \ 308 #define atomic_subtract_int(P, V) do { \ 310 (*(u_int *)(P) -= (V)); \ #define atomic_fetchadd_int(p, v)
Definition: user_atomic.h:103
DOMString p
Definition: WebCryptoAPI.idl:116
userland_mutex_t accept_mtx
Definition: user_socket.c:59
void
Definition: AVFoundationCFSoftLinking.h:81
EGLStreamKHR EGLint n
Definition: eglext.h:984
GLenum GLenum dst
Definition: gl2ext.h:304
const GLfloat * v
Definition: gl2.h:514
pthread_mutex_t userland_mutex_t
Definition: sctp_os_userspace.h:280
GLenum src
Definition: gl2ext.h:304
userland_mutex_t atomic_mtx
Definition: user_environment.c:61
#define atomic_cmpset_int(dst, exp, src)
Definition: user_atomic.h:113
res
Definition: harness.py:111
#define KASSERT(cond, args)
Definition: user_environment.h:111