From: Ethan Jackson Date: Wed, 19 Jun 2013 02:33:51 +0000 (-0700) Subject: ofproto-dpif-sflow: Reference count 'struct dpif_sflow'. X-Git-Tag: sliver-openvswitch-1.10.90-3~6^2~32 X-Git-Url: http://git.onelab.eu/?p=sliver-openvswitch.git;a=commitdiff_plain;h=9723bccec6f955d3ef244b7911b62593cf62a69c ofproto-dpif-sflow: Reference count 'struct dpif_sflow'. Signed-off-by: Ethan Jackson Acked-by: Ben Pfaff --- diff --git a/ofproto/ofproto-dpif-sflow.c b/ofproto/ofproto-dpif-sflow.c index ee31f8887..102467a0a 100644 --- a/ofproto/ofproto-dpif-sflow.c +++ b/ofproto/ofproto-dpif-sflow.c @@ -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(); diff --git a/ofproto/ofproto-dpif-sflow.h b/ofproto/ofproto-dpif-sflow.h index d0f83bce3..d53c95c98 100644 --- a/ofproto/ofproto-dpif-sflow.h +++ b/ofproto/ofproto-dpif-sflow.h @@ -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 *); diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index d0e1b4c05..afda80d45 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -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; }