From: Ben Pfaff <blp@nicira.com>
Date: Thu, 28 Jul 2011 22:02:06 +0000 (-0700)
Subject: ofproto: New helper macro OFPROTO_FOR_EACH_TABLE.
X-Git-Tag: v1.3.0~467
X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=b772ded808ccc1b3cce2c10377a35637b1beb28c;p=sliver-openvswitch.git

ofproto: New helper macro OFPROTO_FOR_EACH_TABLE.

In my opinion this makes the code slightly easier to read and write.
---

diff --git a/ofproto/ofproto-provider.h b/ofproto/ofproto-provider.h
index f46ff8427..8c32e4fc3 100644
--- a/ofproto/ofproto-provider.h
+++ b/ofproto/ofproto-provider.h
@@ -67,6 +67,15 @@ struct ofproto {
 struct ofproto *ofproto_lookup(const char *name);
 struct ofport *ofproto_get_port(const struct ofproto *, uint16_t ofp_port);
 
+/* Assigns CLS to each classifier table, in turn, in OFPROTO.
+ *
+ * All parameters are evaluated multiple times. */
+#define OFPROTO_FOR_EACH_TABLE(CLS, OFPROTO)                \
+    for ((CLS) = (OFPROTO)->tables;                         \
+         (CLS) < &(OFPROTO)->tables[(OFPROTO)->n_tables];   \
+         (CLS)++)
+
+
 /* An OpenFlow port within a "struct ofproto".
  *
  * With few exceptions, ofproto implementations may look at these fields but
diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c
index 8d22c50f7..2dd3c9f71 100644
--- a/ofproto/ofproto.c
+++ b/ofproto/ofproto.c
@@ -289,10 +289,10 @@ ofproto_create(const char *datapath_name, const char *datapath_type,
                struct ofproto **ofprotop)
 {
     const struct ofproto_class *class;
+    struct classifier *table;
     struct ofproto *ofproto;
     int n_tables;
     int error;
-    int i;
 
     *ofprotop = NULL;
 
@@ -350,8 +350,8 @@ ofproto_create(const char *datapath_name, const char *datapath_type,
     assert(n_tables >= 1 && n_tables <= 255);
     ofproto->n_tables = n_tables;
     ofproto->tables = xmalloc(n_tables * sizeof *ofproto->tables);
-    for (i = 0; i < n_tables; i++) {
-        classifier_init(&ofproto->tables[i]);
+    OFPROTO_FOR_EACH_TABLE (table, ofproto) {
+        classifier_init(table);
     }
 
     ofproto->datapath_id = pick_datapath_id(ofproto);
@@ -675,8 +675,7 @@ ofproto_flush__(struct ofproto *ofproto)
     }
 
     group = ofopgroup_create(ofproto);
-    for (table = ofproto->tables; table < &ofproto->tables[ofproto->n_tables];
-         table++) {
+    OFPROTO_FOR_EACH_TABLE (table, ofproto) {
         struct rule *rule, *next_rule;
         struct cls_cursor cursor;
 
@@ -695,7 +694,7 @@ ofproto_flush__(struct ofproto *ofproto)
 static void
 ofproto_destroy__(struct ofproto *ofproto)
 {
-    size_t i;
+    struct classifier *table;
 
     assert(list_is_empty(&ofproto->pending));
 
@@ -712,9 +711,9 @@ ofproto_destroy__(struct ofproto *ofproto)
     hmap_destroy(&ofproto->ports);
     shash_destroy(&ofproto->port_by_name);
 
-    for (i = 0; i < ofproto->n_tables; i++) {
-        assert(classifier_is_empty(&ofproto->tables[i]));
-        classifier_destroy(&ofproto->tables[i]);
+    OFPROTO_FOR_EACH_TABLE (table, ofproto) {
+        assert(classifier_is_empty(table));
+        classifier_destroy(table);
     }
     free(ofproto->tables);
 
@@ -1956,7 +1955,7 @@ ofproto_get_all_flows(struct ofproto *p, struct ds *results)
 {
     struct classifier *cls;
 
-    for (cls = &p->tables[0]; cls < &p->tables[p->n_tables]; cls++) {
+    OFPROTO_FOR_EACH_TABLE (cls, p) {
         struct cls_cursor cursor;
         struct rule *rule;