* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+#ifndef OPENAFS_RX_ATOMIC_H
+#define OPENAFS_RX_ATOMIC_H 1
+
#define RX_ATOMIC_INIT(i) { (i) }
#ifdef AFS_NT40_ENV
InterlockedDecrement(&atomic->var);
}
+static_inline int
+rx_atomic_dec_and_read(rx_atomic_t *atomic) {
+ return InterlockedDecrement(&atomic->var);
+}
+
static_inline void
rx_atomic_sub(rx_atomic_t *atomic, int change) {
InterlockedExchangeAdd(&atomic->var, 0 - change);
OSAtomicDecrement32(&atomic->var);
}
+static_inline int
+rx_atomic_dec_and_read(rx_atomic_t *atomic) {
+ return OSAtomicDecrement32(&atomic->var);
+}
+
static_inline void
rx_atomic_sub(rx_atomic_t *atomic, int change) {
OSAtomicAdd32(0 - change, &atomic->var);
typedef atomic_t rx_atomic_t;
-#define rx_atomic_set(X) atomic_set(X)
+#define rx_atomic_set(X, V) atomic_set(X, V)
#define rx_atomic_read(X) atomic_read(X)
#define rx_atomic_inc(X) atomic_inc(X)
#define rx_atomic_inc_and_read(X) atomic_inc_return(X)
-#define rx_atomic_add(X, V) atomic_add(X, V)
+#define rx_atomic_add(X, V) atomic_add(V, X)
#define rx_atomic_dec(X) atomic_dec(X)
-#define rx_atomic_sub(X, V) atomic_sub(X, V)
+#define rx_atomic_dec_and_read(X) atomic_dec_return(X)
+#define rx_atomic_sub(X, V) atomic_sub(V, X)
+
+#elif defined(AFS_SUN510_ENV) || (defined(AFS_SUN5_ENV) && defined(KERNEL) && !defined(UKERNEL))
+
+# if defined(KERNEL) && !defined(UKERNEL)
+# include <sys/atomic.h>
+# else
+# include <atomic.h>
+# endif
+
+#ifndef AFS_SUN510_ENV
+# define atomic_inc_32(X) atomic_add_32((X), 1)
+# define atomic_inc_32_nv(X) atomic_add_32_nv((X), 1)
+# define atomic_dec_32(X) atomic_add_32((X), -1)
+# define atomic_dec_32_nv(X) atomic_add_32_nv((X), -1)
+#endif
-#elif defined(AFS_SUN58_ENV)
typedef struct {
- volatile int var;
+ volatile unsigned int var;
} rx_atomic_t;
static_inline void
atomic_dec_32(&atomic->var);
}
+static_inline int
+rx_atomic_dec_and_read(rx_atomic_t *atomic) {
+ return atomic_dec_32_nv(&atomic->var);
+}
+
static_inline void
rx_atomic_sub(rx_atomic_t *atomic, int change) {
- atomic_add_32(&object, 0 - change);
+ atomic_add_32(&atomic->var, 0 - change);
}
#elif defined(__GNUC__) && defined(HAVE_SYNC_FETCH_AND_ADD)
(void)__sync_fetch_and_sub(&atomic->var, 1);
}
+static_inline int
+rx_atomic_dec_and_read(rx_atomic_t *atomic) {
+ return __sync_sub_and_fetch(&atomic->var, 1);
+}
+
static_inline void
rx_atomic_sub(rx_atomic_t *atomic, int change) {
(void)__sync_fetch_and_sub(&atomic->var, change);
MUTEX_EXIT(&rx_atomic_mutex);
}
+static_inline int
+rx_atomic_dec_and_read(rx_atomic_t *atomic) {
+ int retval;
+ MUTEX_ENTER(&rx_atomic_mutex);
+ atomic->var--;
+ retval = atomic->var;
+ MUTEX_EXIT(&rx_atomic_mutex);
+ return retval;
+}
+
+
static_inline void
rx_atomic_sub(rx_atomic_t *atomic, int change) {
MUTEX_ENTER(&rx_atomic_mutex);
atomic->var -= change;
- MUTEX_ENTER(&rx_atomic_mutex);
+ MUTEX_EXIT(&rx_atomic_mutex);
}
#endif
+
+#endif