diff mbox series

[ovs-dev,v5,13/15] idlc: support short version of SAFE macros

Message ID 20220323115624.1469085-14-amorenoz@redhat.com
State Accepted
Commit b54067b24a25c37d6ef0e6cfba9e6ea2d8f9202e
Headers show
Series Fix undefined behavior in loop macros | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success
ovsrobot/github-robot-_Build_and_Test success github build: passed
ovsrobot/intel-ovs-compilation success test: success

Commit Message

Adrian Moreno March 23, 2022, 11:56 a.m. UTC
In order to be consistent with the rest of the SAFE loop macros,
overload each of the generated *_SAFE macro with a SHORT version that
does not require the user to provide the NEXT variable.

Acked-by: Dumitru Ceara <dceara@redhat.com>
Acked-by: Eelco Chaudron <echaudro@redhat.com>
Signed-off-by: Adrian Moreno <amorenoz@redhat.com>
---
 ovsdb/ovsdb-idlc.in   | 19 +++++++++++++++++--
 utilities/ovs-vsctl.c | 36 ++++++++++++++++++------------------
 2 files changed, 35 insertions(+), 20 deletions(-)
diff mbox series

Patch

diff --git a/ovsdb/ovsdb-idlc.in b/ovsdb/ovsdb-idlc.in
index 10a70ae26..13c535939 100755
--- a/ovsdb/ovsdb-idlc.in
+++ b/ovsdb/ovsdb-idlc.in
@@ -251,10 +251,18 @@  const struct %(s)s *%(s)s_table_first(const struct %(s)s_table *);
         for ((ROW) = %(s)s_table_first(TABLE); \\
              (ROW); \\
              (ROW) = %(s)s_next(ROW))
-#define %(S)s_TABLE_FOR_EACH_SAFE(ROW, NEXT, TABLE) \\
+#define %(S)s_TABLE_FOR_EACH_SAFE_LONG(ROW, NEXT, TABLE) \\
         for ((ROW) = %(s)s_table_first(TABLE); \\
              (ROW) ? ((NEXT) = %(s)s_next(ROW), 1) : 0; \\
              (ROW) = (NEXT))
+#define %(S)s_TABLE_FOR_EACH_SAFE_SHORT(ROW, TABLE) \\
+        for (const struct %(s)s * ROW__next = ((ROW) = %(s)s_table_first(TABLE), NULL); \\
+             (ROW) ? (ROW__next = %(s)s_next(ROW), 1) : (ROW__next = NULL, 0); \\
+             (ROW) = ROW__next)
+#define %(S)s_TABLE_FOR_EACH_SAFE(...)                                        \\
+        OVERLOAD_SAFE_MACRO(%(S)s_TABLE_FOR_EACH_SAFE_LONG,                   \\
+                            %(S)s_TABLE_FOR_EACH_SAFE_SHORT, 3, __VA_ARGS__)
+
 
 const struct %(s)s *%(s)s_get_for_uuid(const struct ovsdb_idl *, const struct uuid *);
 const struct %(s)s *%(s)s_table_get_for_uuid(const struct %(s)s_table *, const struct uuid *);
@@ -264,10 +272,17 @@  const struct %(s)s *%(s)s_next(const struct %(s)s *);
         for ((ROW) = %(s)s_first(IDL); \\
              (ROW); \\
              (ROW) = %(s)s_next(ROW))
-#define %(S)s_FOR_EACH_SAFE(ROW, NEXT, IDL) \\
+#define %(S)s_FOR_EACH_SAFE_LONG(ROW, NEXT, IDL) \\
         for ((ROW) = %(s)s_first(IDL); \\
              (ROW) ? ((NEXT) = %(s)s_next(ROW), 1) : 0; \\
              (ROW) = (NEXT))
+#define %(S)s_FOR_EACH_SAFE_SHORT(ROW, IDL) \\
+        for (const struct %(s)s * ROW__next = ((ROW) = %(s)s_first(IDL), NULL); \\
+             (ROW) ? (ROW__next = %(s)s_next(ROW), 1) : (ROW__next = NULL, 0); \\
+             (ROW) = ROW__next)
+#define %(S)s_FOR_EACH_SAFE(...)                                         \\
+        OVERLOAD_SAFE_MACRO(%(S)s_FOR_EACH_SAFE_LONG,                    \\
+                            %(S)s_FOR_EACH_SAFE_SHORT, 3, __VA_ARGS__)
 
 unsigned int %(s)s_get_seqno(const struct ovsdb_idl *);
 unsigned int %(s)s_row_get_seqno(const struct %(s)s *row, enum ovsdb_idl_change change);
diff --git a/utilities/ovs-vsctl.c b/utilities/ovs-vsctl.c
index 14f5cb92e..1032089fc 100644
--- a/utilities/ovs-vsctl.c
+++ b/utilities/ovs-vsctl.c
@@ -1100,14 +1100,14 @@  cmd_emer_reset(struct ctl_context *ctx)
     const struct ovsrec_bridge *br;
     const struct ovsrec_port *port;
     const struct ovsrec_interface *iface;
-    const struct ovsrec_mirror *mirror, *next_mirror;
-    const struct ovsrec_controller *ctrl, *next_ctrl;
-    const struct ovsrec_manager *mgr, *next_mgr;
-    const struct ovsrec_netflow *nf, *next_nf;
-    const struct ovsrec_ssl *ssl, *next_ssl;
-    const struct ovsrec_sflow *sflow, *next_sflow;
-    const struct ovsrec_ipfix *ipfix, *next_ipfix;
-    const struct ovsrec_flow_sample_collector_set *fscset, *next_fscset;
+    const struct ovsrec_mirror *mirror;
+    const struct ovsrec_controller *ctrl;
+    const struct ovsrec_manager *mgr;
+    const struct ovsrec_netflow *nf;
+    const struct ovsrec_ssl *ssl;
+    const struct ovsrec_sflow *sflow;
+    const struct ovsrec_ipfix *ipfix;
+    const struct ovsrec_flow_sample_collector_set *fscset;
 
     /* Reset the Open_vSwitch table. */
     ovsrec_open_vswitch_set_manager_options(vsctl_ctx->ovs, NULL, 0);
@@ -1145,35 +1145,35 @@  cmd_emer_reset(struct ctl_context *ctx)
         ovsrec_interface_set_ingress_policing_burst(iface, 0);
     }
 
-    OVSREC_MIRROR_FOR_EACH_SAFE (mirror, next_mirror, idl) {
+    OVSREC_MIRROR_FOR_EACH_SAFE (mirror, idl) {
         ovsrec_mirror_delete(mirror);
     }
 
-    OVSREC_CONTROLLER_FOR_EACH_SAFE (ctrl, next_ctrl, idl) {
+    OVSREC_CONTROLLER_FOR_EACH_SAFE (ctrl, idl) {
         ovsrec_controller_delete(ctrl);
     }
 
-    OVSREC_MANAGER_FOR_EACH_SAFE (mgr, next_mgr, idl) {
+    OVSREC_MANAGER_FOR_EACH_SAFE (mgr, idl) {
         ovsrec_manager_delete(mgr);
     }
 
-    OVSREC_NETFLOW_FOR_EACH_SAFE (nf, next_nf, idl) {
+    OVSREC_NETFLOW_FOR_EACH_SAFE (nf, idl) {
         ovsrec_netflow_delete(nf);
     }
 
-    OVSREC_SSL_FOR_EACH_SAFE (ssl, next_ssl, idl) {
+    OVSREC_SSL_FOR_EACH_SAFE (ssl, idl) {
         ovsrec_ssl_delete(ssl);
     }
 
-    OVSREC_SFLOW_FOR_EACH_SAFE (sflow, next_sflow, idl) {
+    OVSREC_SFLOW_FOR_EACH_SAFE (sflow, idl) {
         ovsrec_sflow_delete(sflow);
     }
 
-    OVSREC_IPFIX_FOR_EACH_SAFE (ipfix, next_ipfix, idl) {
+    OVSREC_IPFIX_FOR_EACH_SAFE (ipfix, idl) {
         ovsrec_ipfix_delete(ipfix);
     }
 
-    OVSREC_FLOW_SAMPLE_COLLECTOR_SET_FOR_EACH_SAFE (fscset, next_fscset, idl) {
+    OVSREC_FLOW_SAMPLE_COLLECTOR_SET_FOR_EACH_SAFE (fscset, idl) {
         ovsrec_flow_sample_collector_set_delete(fscset);
     }
 
@@ -1527,7 +1527,7 @@  del_bridge(struct vsctl_context *vsctl_ctx, struct vsctl_bridge *br)
 {
     struct vsctl_bridge *child;
     struct vsctl_port *port;
-    const struct ovsrec_flow_sample_collector_set *fscset, *next_fscset;
+    const struct ovsrec_flow_sample_collector_set *fscset;
 
     HMAP_FOR_EACH_SAFE (child, children_node, &br->children) {
         del_bridge(vsctl_ctx, child);
@@ -1537,7 +1537,7 @@  del_bridge(struct vsctl_context *vsctl_ctx, struct vsctl_bridge *br)
         del_port(vsctl_ctx, port);
     }
 
-    OVSREC_FLOW_SAMPLE_COLLECTOR_SET_FOR_EACH_SAFE (fscset, next_fscset,
+    OVSREC_FLOW_SAMPLE_COLLECTOR_SET_FOR_EACH_SAFE (fscset,
                                                     vsctl_ctx->base.idl) {
         if (fscset->bridge == br->br_cfg) {
             ovsrec_flow_sample_collector_set_delete(fscset);