From: Jeff Lucovsky Date: Mon, 25 Apr 2022 12:39:06 +0000 (-0400) Subject: util/atomic: Fetch and add interface X-Git-Tag: suricata-5.0.10~78 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3ddd9944b6a97feae90884c1de7f71610ae7a677;p=thirdparty%2Fsuricata.git util/atomic: Fetch and add interface 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. --- diff --git a/src/util-atomic.c b/src/util-atomic.c index 569f4c0a34..fa4a1f7d82 100644 --- a/src/util-atomic.c +++ b/src/util-atomic.c @@ -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; diff --git a/src/util-atomic.h b/src/util-atomic.h index c0b2125944..7f5f3d7593 100644 --- a/src/util-atomic.h +++ b/src/util-atomic.h @@ -114,6 +114,16 @@ } 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 @@ -396,6 +406,8 @@ #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 *