ofproto-dpif-sflow: Reference count 'struct dpif_sflow'.
authorEthan Jackson <ethan@nicira.com>
Wed, 19 Jun 2013 02:33:51 +0000 (19:33 -0700)
committerEthan Jackson <ethan@nicira.com>
Fri, 28 Jun 2013 01:23:40 +0000 (18:23 -0700)
Signed-off-by: Ethan Jackson <ethan@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
ofproto/ofproto-dpif-sflow.c
ofproto/ofproto-dpif-sflow.h
ofproto/ofproto-dpif.c

index ee31f88..102467a 100644 (file)
@@ -57,6 +57,7 @@ struct dpif_sflow {
     size_t n_flood, n_all;
     struct hmap ports;          /* Contains "struct dpif_sflow_port"s. */
     uint32_t probability;
+    int ref_cnt;
 };
 
 static void dpif_sflow_del_port__(struct dpif_sflow *,
@@ -302,10 +303,22 @@ dpif_sflow_create(void)
     hmap_init(&ds->ports);
     ds->probability = 0;
     route_table_register();
+    ds->ref_cnt = 1;
 
     return ds;
 }
 
+struct dpif_sflow *
+dpif_sflow_ref(const struct dpif_sflow *ds_)
+{
+    struct dpif_sflow *ds = CONST_CAST(struct dpif_sflow *, ds_);
+    if (ds) {
+        ovs_assert(ds->ref_cnt > 0);
+        ds->ref_cnt++;
+    }
+    return ds;
+}
+
 /* 32-bit fraction of packets to sample with.  A value of 0 samples no packets,
  * a value of %UINT32_MAX samples all packets and intermediate values sample
  * intermediate fractions of packets. */
@@ -316,9 +329,14 @@ dpif_sflow_get_probability(const struct dpif_sflow *ds)
 }
 
 void
-dpif_sflow_destroy(struct dpif_sflow *ds)
+dpif_sflow_unref(struct dpif_sflow *ds)
 {
-    if (ds) {
+    if (!ds) {
+        return;
+    }
+
+    ovs_assert(ds->ref_cnt > 0);
+    if (!--ds->ref_cnt) {
         struct dpif_sflow_port *dsp, *next;
 
         route_table_unregister();
index d0f83bc..d53c95c 100644 (file)
@@ -29,9 +29,11 @@ struct ofproto_sflow_options;
 struct ofport;
 
 struct dpif_sflow *dpif_sflow_create(void);
+struct dpif_sflow *dpif_sflow_ref(const struct dpif_sflow *);
+void dpif_sflow_unref(struct dpif_sflow *);
+
 uint32_t dpif_sflow_get_probability(const struct dpif_sflow *);
 
-void dpif_sflow_destroy(struct dpif_sflow *);
 void dpif_sflow_set_options(struct dpif_sflow *,
                             const struct ofproto_sflow_options *);
 void dpif_sflow_clear(struct dpif_sflow *);
index d0e1b4c..afda80d 100644 (file)
@@ -1195,7 +1195,7 @@ destruct(struct ofproto *ofproto_)
     }
 
     netflow_destroy(ofproto->netflow);
-    dpif_sflow_destroy(ofproto->sflow);
+    dpif_sflow_unref(ofproto->sflow);
     hmap_destroy(&ofproto->bundles);
     mac_learning_unref(ofproto->ml);
 
@@ -1617,7 +1617,7 @@ set_sflow(struct ofproto *ofproto_,
         dpif_sflow_set_options(ds, sflow_options);
     } else {
         if (ds) {
-            dpif_sflow_destroy(ds);
+            dpif_sflow_unref(ds);
             ofproto->backer->need_revalidate = REV_RECONFIGURE;
             ofproto->sflow = NULL;
         }