]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
rx: Implement rx_atomic_dec_and_read
authorSimon Wilkinson <sxw@your-file-system.com>
Thu, 16 Dec 2010 11:36:43 +0000 (11:36 +0000)
committerJeffrey Altman <jaltman@openafs.org>
Sun, 2 Jan 2011 03:22:03 +0000 (19:22 -0800)
Add a function which decrements an atomic counter, and returns the
result. This is essential for implementing reference counting.

Change-Id: Ib173f078bcf117369a82f981d58124018648a71c
Reviewed-on: http://gerrit.openafs.org/3581
Reviewed-by: Jeffrey Altman <jaltman@openafs.org>
Tested-by: Jeffrey Altman <jaltman@openafs.org>
src/rx/rx_atomic.h

index 0b2d6af8c69fc9761b695a83ddc5b77546f49364..ba80f9cb7d91e6cf5e593f27756302c94fe1d9b4 100644 (file)
@@ -62,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);
@@ -110,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);
@@ -165,6 +175,11 @@ 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(&atomic->var, 0 - change);
@@ -206,6 +221,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);
@@ -275,6 +295,17 @@ 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);