2 * Copyright (c) 2008, Your File System, Inc.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of the company nor the names of its contributors may
14 * be used to endorse or promote products derived from this software
15 * without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 #ifndef _RX_INTERNAL_H_
31 #define _RX_INTERNAL_H_
33 #ifdef AFS_DARWIN80_ENV
34 #include <libkern/OSAtomic.h>
37 #include <sys/atomic.h>
44 #pragma intrinsic(_InterlockedOr)
45 #pragma intrinsic(_InterlockedAnd)
46 #define rx_AtomicOr(object, operand, mutex) _InterlockedOr(&object, operand)
47 #define rx_AtomicAnd(object, operand, mutex) _InterlockedAnd(&object, operand)
48 #endif /* __cplusplus */
50 #define rx_AtomicOr(object, operand, mutex) InterlockedOr(&object, operand)
51 #define rx_AtomicAnd(object, operand, mutex) InterlockedAnd(&object, operand)
53 #define rx_AtomicIncrement_NL(object) InterlockedIncrement(&object)
54 #define rx_AtomicIncrement(object, mutex) InterlockedIncrement(&object)
55 #define rx_AtomicXor(object, operand, mutex) InterlockedXor(&object, operand)
56 #define rx_AtomicAdd_NL(object, addend) InterlockedExchangeAdd(&object, addend)
57 #define rx_AtomicAdd(object, addend, mutex) InterlockedExchangeAdd(&object, addend)
58 #define rx_AtomicDecrement_NL(object) InterlockedDecrement(&object)
59 #define rx_AtomicDecrement(object, mutex) InterlockedDecrement(&object)
60 #define rx_AtomicSwap_NL(object1, object2) InterlockedExchange ((volatile LONG *) object1, object2);
61 #define rx_AtomicSwap(object1, object2, mutex) InterlockedExchange ((volatile LONG *) object1, object2);
62 #elif defined(AFS_DARWIN80_ENV)
63 #define rx_AtomicIncrement_NL(object) OSAtomicIncrement32(&object)
64 #define rx_AtomicIncrement(object, mutex) OSAtomicIncrement32(&object)
65 #define rx_AtomicOr(object, operand, mutex) OSAtomicOr32(operand, &object)
66 #define rx_AtomicAnd(object, operand, mutex) OSAtomicAnd32(operand, &object)
67 #define rx_AtomicXor(object, operand, mutex) OSAtomicXor32(operand, &object)
68 #define rx_AtomicAdd_NL(object, addend) OSAtomicAdd32(addend, &object)
69 #define rx_AtomicAdd(object, addend, mutex) OSAtomicAdd32(addend, &object)
70 #define rx_AtomicDecrement_NL(object) OSAtomicDecrement32(&object)
71 #define rx_AtomicDecrement(object, mutex) OSAtomicDecrement32(&object)
72 #define rx_AtomicSwap_NL(oldval, newval) rx_AtomicSwap_int(oldval, newval)
73 #define rx_AtomicSwap(oldval, newval, mutex) rx_AtomicSwap_int(oldval, newval)
74 static inline afs_int32 rx_AtomicSwap_int(afs_int32 *oldval, afs_int32 newval) {
75 afs_int32 ret = *oldval;
76 OSAtomicCompareAndSwap32 ((afs_int32) *oldval,(afs_int32) newval,
80 #elif defined(AFS_SUN58_ENV)
81 #define rx_AtomicIncrement_NL(object) atomic_inc_32(&object)
82 #define rx_AtomicIncrement(object, mutex) atomic_inc_32(&object)
83 #define rx_AtomicOr(object, operand, mutex) atomic_or_32(&object, operand)
84 #define rx_AtomicAnd(object, operand, mutex) atomic_and_32(&object, operand)
85 #define rx_AtomicAdd_NL(object, addend) atomic_add_32(&object, addend)
86 #define rx_AtomicAdd(object, addend, mutex) atomic_add_32(&object, addend)
87 #define rx_AtomicDecrement_NL(object) atomic_dec_32(&object)
88 #define rx_AtomicDecrement(object, mutex) atomic_dec_32(&object)
89 #define rx_AtomicSwap_NL(oldval, newval) rx_AtomicSwap_int(oldval, newval)
90 #define rx_AtomicSwap(oldval, newval, mutex) rx_AtomicSwap_int(oldval, newval)
91 static inline afs_int32 rx_AtomicSwap_int(afs_int32 *oldval, afs_int32 newval) {
92 afs_int32 ret = *oldval;
93 atomic_cas_32((afs_int32) *oldval,(afs_int32) newval,
98 #define rx_AtomicIncrement_NL(object) (object)++
99 #define rx_AtomicIncrement(object, mutex) rx_MutexIncrement(object, mutex)
100 #define rx_AtomicOr(object, operand, mutex) rx_MutexOr(object, operand, mutex)
101 #define rx_AtomicAnd(object, operand, mutex) rx_MutexAnd(object, operand, mutex)
102 #define rx_AtomicAdd_NL(object, addend) (object += addend)
103 #define rx_AtomicAdd(object, addend, mutex) rx_MutexAdd(object, addand, mutex)
104 #define rx_AtomicDecrement_NL(object) (object)--
105 #define rx_AtomicDecrement(object, mutex) rx_MutexDecrement(object, mutex)
106 #define rx_AtomicSwap_NL(oldval, newval) rx_AtomicSwap_int(oldval, newval)
107 #define rx_AtomicSwap(oldval, newval, mutex) rx_AtomicSwap_int(oldval, newval)
108 static inline afs_int32 rx_AtomicSwap_int(afs_int32 *oldval, afs_int32 newval) {
109 afs_int32 ret = *oldval;
114 #define rx_AtomicPeek_NL(object) rx_AtomicAdd_NL(object, 0)
115 #define rx_AtomicPeek(object, mutex) rx_AtomicAdd(object, 0, mutex)
116 #define rx_MutexIncrement(object, mutex) \
118 MUTEX_ENTER(&mutex); \
120 MUTEX_EXIT(&mutex); \
122 #define rx_MutexOr(object, operand, mutex) \
124 MUTEX_ENTER(&mutex); \
126 MUTEX_EXIT(&mutex); \
128 #define rx_MutexAnd(object, operand, mutex) \
130 MUTEX_ENTER(&mutex); \
132 MUTEX_EXIT(&mutex); \
134 #define rx_MutexXor(object, operand, mutex) \
136 MUTEX_ENTER(&mutex); \
138 MUTEX_EXIT(&mutex); \
140 #define rx_MutexAdd(object, addend, mutex) \
142 MUTEX_ENTER(&mutex); \
144 MUTEX_EXIT(&mutex); \
146 #define rx_MutexDecrement(object, mutex) \
148 MUTEX_ENTER(&mutex); \
150 MUTEX_EXIT(&mutex); \
152 #define rx_MutexAdd1Increment2(object1, addend, object2, mutex) \
154 MUTEX_ENTER(&mutex); \
157 MUTEX_EXIT(&mutex); \
159 #define rx_MutexAdd1Decrement2(object1, addend, object2, mutex) \
161 MUTEX_ENTER(&mutex); \
164 MUTEX_EXIT(&mutex); \
167 #define rx_MutexAdd1AtomicIncrement2(object1, addend, object2, mutex) \
169 MUTEX_ENTER(&mutex); \
171 rx_AtomicIncrement(&object2); \
172 MUTEX_EXIT(&mutex); \
174 #define rx_MutexAdd1AtomicDecrement2(object1, addend, object2, mutex) \
176 MUTEX_ENTER(&mutex); \
178 rx_AtomicDecrement(&object2); \
179 MUTEX_EXIT(&mutex); \
181 #endif /* _RX_INTERNAL_H */