]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: compiler: implement an ONLY_ONCE() macro
authorWilly Tarreau <w@1wt.eu>
Thu, 26 Aug 2021 13:46:51 +0000 (15:46 +0200)
committerWilly Tarreau <w@1wt.eu>
Thu, 26 Aug 2021 14:35:00 +0000 (16:35 +0200)
There are regularly places, especially in config analysis, where we
need to report certain things (warnings or errors) only once, but
where implementing a counter is sufficiently deterrent so that it's
not done.

Let's add a simple ONLY_ONCE() macro that implements a static variable
(char) which is atomically turned on, and returns true if it's set for
the first time. This uses fairly compact code, a single byte of BSS
and is thread-safe. There are probably a number of places in the config
parser where this could be used. It may also be used to implement a
WARN_ON() similar to BUG_ON() but which would only warn once.

include/haproxy/compiler.h

index 72d158b37e1eef76ecdb74bb3d6793589f3fba9a..ca3b844c15d71ff40e5b520a810345618591a4eb 100644 (file)
  */
 #define DISGUISE(v) ({ typeof(v) __v = (v); ALREADY_CHECKED(__v); __v; })
 
+/* Implements a static event counter where it's used. This is typically made to
+ * report some warnings only once, either during boot or at runtime. It only
+ * returns true on the very first call, and zero later. It's thread-safe and
+ * uses a single byte of memory per call place. It relies on the atomic xchg
+ * defined in atomic.h which is also part of the common API.
+ */
+#define ONLY_ONCE() ({ static char __cnt; !_HA_ATOMIC_XCHG(&__cnt, 1); })
+
 /*
  * Gcc >= 3 provides the ability for the program to give hints to the
  * compiler about what branch of an if is most likely to be taken. This