Remove support for Solaris pre-8
[openafs.git] / src / rx / rx_atomic.h
index 805c285..d8a5c90 100644 (file)
@@ -22,6 +22,9 @@
  * 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
@@ -59,6 +62,11 @@ rx_atomic_dec(rx_atomic_t *atomic) {
     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);
@@ -107,6 +115,11 @@ rx_atomic_dec(rx_atomic_t *atomic) {
     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);
@@ -116,17 +129,32 @@ rx_atomic_sub(rx_atomic_t *atomic, int change) {
 
 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
@@ -159,9 +187,14 @@ rx_atomic_dec(rx_atomic_t *atomic) {
     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)
@@ -200,6 +233,11 @@ rx_atomic_dec(rx_atomic_t *atomic) {
     (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);
@@ -269,11 +307,24 @@ rx_atomic_dec(rx_atomic_t *atomic) {
     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