]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
util/atomic: Fetch and add interface
authorJeff Lucovsky <jeff@lucovsky.org>
Mon, 25 Apr 2022 12:39:06 +0000 (08:39 -0400)
committerVictor Julien <vjulien@oisf.net>
Wed, 27 Apr 2022 09:14:27 +0000 (11:14 +0200)
This commit adds an API for an atomic fetch and add function to be
consistent with later branches where SC_ATOMIC_ADD has that
functionality.

src/util-atomic.c
src/util-atomic.h

index 569f4c0a344f0fddcb546a0d42ef1fb4d3bb822c..fa4a1f7d828925bf418b8c83086e9c02ad446481 100644 (file)
@@ -61,12 +61,33 @@ static int SCAtomicTest01(void)
     return result;
 }
 
+static int SCAtomicTest02(void)
+{
+    int temp_int = 0;
+
+    SC_ATOMIC_DECLARE(int, temp);
+    SC_ATOMIC_INIT(temp);
+
+    temp_int = SC_ATOMIC_GET(temp);
+    FAIL_IF(temp_int != 0);
+
+    /* Returns value following add */
+    int cur = SC_ATOMIC_ADD(temp, 1);
+    FAIL_IF(cur != 1);
+
+    /* Returns value prior to add */
+    cur = SC_ATOMIC_FETCH_AND_ADD(temp, 1);
+    FAIL_IF(cur != 1);
+
+    PASS;
+}
 #endif /* UNITTESTS */
 
 void SCAtomicRegisterTests(void)
 {
 #ifdef UNITTESTS
     UtRegisterTest("SCAtomicTest01", SCAtomicTest01);
+    UtRegisterTest("SCAtomicTest02", SCAtomicTest02);
 #endif
 
     return;
index c0b2125944c9d14dd55636707dbaf27106e37c69..7f5f3d7593d232b1a3746256d8bbf6968db02563 100644 (file)
     } while(0); \
     var ; \
 })
+#define SC_ATOMIC_FETCH_AND_ADD(name, val) ({\
+    typeof(name ## _sc_atomic__) var; \
+    do { \
+        SCSpinLock(&(name ## _sc_lock__)); \
+        var = (name ## _sc_atomic__); \
+        (name ## _sc_atomic__) += (val); \
+        SCSpinUnlock(&(name ## _sc_lock__)); \
+    } while(0); \
+    var ; \
+})
 
 /**
  *  \brief sub a value from our atomic variable
 #define SC_ATOMIC_ADD(name, val) \
     SCAtomicAddAndFetch(&(name ## _sc_atomic__), (val))
 
+#define SC_ATOMIC_FETCH_AND_ADD(name, val) \
+    SCAtomicFetchAndAdd(&(name ## _sc_atomic__), (val))
 /**
  *  \brief sub a value from our atomic variable
  *