Using the SHORT version of the *_SAFE loops makes the code cleaner
and less error-prone. So, use the SHORT version and remove the extra
variable when possible.
In order to be able to use both long and short versions without changing
the name of the macro for all the clients, overload the existing name
and select the appropriate version depending on the number of arguments.
Signed-off-by: Adrian Moreno <amore...@redhat.com>
---
include/openvswitch/list.h | 32 +++++++++++++++++++++++++++++--
lib/conntrack.c | 4 ++--
lib/fat-rwlock.c | 4 ++--
lib/id-fpool.c | 3 +--
lib/ipf.c | 22 ++++++++++-----------
lib/lldp/lldpd-structs.c | 7 +++----
lib/lldp/lldpd.c | 8 ++++----
lib/mcast-snooping.c | 12 ++++++------
lib/netdev-afxdp.c | 4 ++--
lib/netdev-dpdk.c | 4 ++--
lib/ofp-msgs.c | 4 ++--
lib/ovs-lldp.c | 12 ++++++------
lib/ovsdb-idl.c | 30 ++++++++++++++---------------
lib/seq.c | 4 ++--
lib/tnl-ports.c | 16 ++++++++--------
lib/unixctl.c | 8 ++++----
lib/vconn.c | 4 ++--
ofproto/connmgr.c | 8 ++++----
ofproto/ofproto-dpif-ipfix.c | 4 ++--
ofproto/ofproto-dpif-trace.c | 4 ++--
ofproto/ofproto-dpif-xlate.c | 4 ++--
ofproto/ofproto-dpif.c | 24 +++++++++++------------
ovsdb/jsonrpc-server.c | 16 ++++++++--------
ovsdb/monitor.c | 24 +++++++++++------------
ovsdb/ovsdb.c | 4 ++--
ovsdb/raft.c | 15 +++++++--------
ovsdb/transaction-forward.c | 6 +++---
ovsdb/transaction.c | 28 +++++++++++++--------------
ovsdb/trigger.c | 4 ++--
tests/test-list.c | 37 ++++++++++++++++++++++++++++++++++++
utilities/ovs-ofctl.c | 4 ++--
utilities/ovs-vsctl.c | 8 ++++----
vswitchd/bridge.c | 16 ++++++++--------
vtep/vtep-ctl.c | 12 ++++++------
34 files changed, 228 insertions(+), 168 deletions(-)
diff --git a/include/openvswitch/list.h b/include/openvswitch/list.h
index 997afc0e4..c6941e896 100644
--- a/include/openvswitch/list.h
+++ b/include/openvswitch/list.h
@@ -93,7 +93,8 @@ static inline bool ovs_list_is_short(const struct ovs_list *);
CONDITION_MULTIVAR(VAR, MEMBER, ITER_VAR(VAR) !=
(LIST)); \
UPDATE_MULTIVAR(VAR, (ITER_VAR(VAR) = ITER_VAR(VAR)->prev)))
-#define LIST_FOR_EACH_REVERSE_SAFE(VAR, PREV, MEMBER, LIST) \
+/* LONG version of SAFE iterators */
+#define LIST_FOR_EACH_REVERSE_SAFE_LONG(VAR, PREV, MEMBER, LIST) \
for (INIT_MULTIVAR_SAFE_LONG(VAR, PREV, MEMBER,
(LIST)->prev); \
CONDITION_MULTIVAR_SAFE_LONG(VAR, PREV,
MEMBER, \
ITER_VAR(VAR) !=
(LIST), \
@@ -101,7 +102,7 @@ static inline bool ovs_list_is_short(const struct
ovs_list *);
ITER_VAR(PREV) !=
(LIST)); \
UPDATE_MULTIVAR_SAFE_LONG(VAR, PREV))
-#define LIST_FOR_EACH_SAFE(VAR, NEXT, MEMBER, LIST) \
+#define LIST_FOR_EACH_SAFE_LONG(VAR, NEXT, MEMBER, LIST) \
for (INIT_MULTIVAR_SAFE_LONG(VAR, NEXT, MEMBER,
(LIST)->next); \
CONDITION_MULTIVAR_SAFE_LONG(VAR, NEXT,
MEMBER, \
ITER_VAR(VAR) !=
(LIST), \
@@ -109,6 +110,33 @@ static inline bool ovs_list_is_short(const struct
ovs_list *);
ITER_VAR(NEXT) !=
(LIST)); \
UPDATE_MULTIVAR_SAFE_LONG(VAR, NEXT))
+/* SHORT version of SAFE iterators */
+#define LIST_FOR_EACH_REVERSE_SAFE_SHORT(VAR, MEMBER, LIST) \
+ for (INIT_MULTIVAR_SAFE_SHORT(VAR, MEMBER, (LIST)->prev); \
+ CONDITION_MULTIVAR_SAFE_SHORT(VAR, MEMBER, \
+ ITER_VAR(VAR) != (LIST), \
+ ITER_NEXT_VAR(VAR) = ITER_VAR(VAR)->prev); \
+ UPDATE_MULTIVAR_SAFE_SHORT(VAR))
+
+#define LIST_FOR_EACH_SAFE_SHORT(VAR, MEMBER, LIST) \
+ for (INIT_MULTIVAR_SAFE_SHORT(VAR, MEMBER, (LIST)->next); \
+ CONDITION_MULTIVAR_SAFE_SHORT(VAR, MEMBER, \
+ ITER_VAR(VAR) != (LIST), \
+ ITER_NEXT_VAR(VAR) = ITER_VAR(VAR)->next); \
+ UPDATE_MULTIVAR_SAFE_SHORT(VAR))
+
+/* Select the right SAFE macro depending on the number of arguments .*/
+#define LIST_GET_SAFE_MACRO(_1, _2, _3, _4, NAME, ...) NAME
+#define LIST_FOR_EACH_SAFE(...) \
+ LIST_GET_SAFE_MACRO(__VA_ARGS__, \
+ LIST_FOR_EACH_SAFE_LONG, \
+ LIST_FOR_EACH_SAFE_SHORT)(__VA_ARGS__)