summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEthan Jackson <ethan@nicira.com>2013-06-18 19:41:51 -0700
committerEthan Jackson <ethan@nicira.com>2013-06-27 18:23:40 -0700
commit5d9895170f5b066d4cb2984fc5a890478a5b8206 (patch)
tree3d058809464d53a71d8a5bbd16bd326a032799ff
parent03366a2d585a6917d7d94c79073e1e615d8d8025 (diff)
downloadopenvswitch-5d9895170f5b066d4cb2984fc5a890478a5b8206.tar.gz
mac-learning: Reference count 'struct mac_learning".
Signed-off-by: Ethan Jackson <ethan@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
-rw-r--r--lib/learning-switch.c2
-rw-r--r--lib/mac-learning.c23
-rw-r--r--lib/mac-learning.h4
-rw-r--r--ofproto/ofproto-dpif.c2
4 files changed, 25 insertions, 6 deletions
diff --git a/lib/learning-switch.c b/lib/learning-switch.c
index 426cb375c..f2b331904 100644
--- a/lib/learning-switch.c
+++ b/lib/learning-switch.c
@@ -237,7 +237,7 @@ lswitch_destroy(struct lswitch *sw)
free(node);
}
shash_destroy(&sw->queue_names);
- mac_learning_destroy(sw->ml);
+ mac_learning_unref(sw->ml);
rconn_packet_counter_destroy(sw->queued);
free(sw);
}
diff --git a/lib/mac-learning.c b/lib/mac-learning.c
index f9b3171cf..ca0ccb8e1 100644
--- a/lib/mac-learning.c
+++ b/lib/mac-learning.c
@@ -124,14 +124,31 @@ mac_learning_create(unsigned int idle_time)
ml->idle_time = normalize_idle_time(idle_time);
ml->max_entries = MAC_DEFAULT_MAX;
tag_set_init(&ml->tags);
+ ml->ref_cnt = 1;
return ml;
}
-/* Destroys MAC learning table 'ml'. */
-void
-mac_learning_destroy(struct mac_learning *ml)
+struct mac_learning *
+mac_learning_ref(const struct mac_learning *ml_)
{
+ struct mac_learning *ml = CONST_CAST(struct mac_learning *, ml_);
if (ml) {
+ ovs_assert(ml->ref_cnt > 0);
+ ml->ref_cnt++;
+ }
+ return ml;
+}
+
+/* Unreferences (and possibly destroys) MAC learning table 'ml'. */
+void
+mac_learning_unref(struct mac_learning *ml)
+{
+ if (!ml) {
+ return;
+ }
+
+ ovs_assert(ml->ref_cnt > 0);
+ if (!--ml->ref_cnt) {
struct mac_entry *e, *next;
HMAP_FOR_EACH_SAFE (e, next, hmap_node, &ml->table) {
diff --git a/lib/mac-learning.h b/lib/mac-learning.h
index 9feca0057..06e99f3db 100644
--- a/lib/mac-learning.h
+++ b/lib/mac-learning.h
@@ -86,11 +86,13 @@ struct mac_learning {
unsigned int idle_time; /* Max age before deleting an entry. */
size_t max_entries; /* Max number of learned MACs. */
struct tag_set tags; /* Tags which have changed. */
+ int ref_cnt;
};
/* Basics. */
struct mac_learning *mac_learning_create(unsigned int idle_time);
-void mac_learning_destroy(struct mac_learning *);
+struct mac_learning *mac_learning_ref(const struct mac_learning *);
+void mac_learning_unref(struct mac_learning *);
void mac_learning_run(struct mac_learning *, struct tag_set *);
void mac_learning_wait(struct mac_learning *);
diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
index 87b44f25c..d0e1b4c05 100644
--- a/ofproto/ofproto-dpif.c
+++ b/ofproto/ofproto-dpif.c
@@ -1197,7 +1197,7 @@ destruct(struct ofproto *ofproto_)
netflow_destroy(ofproto->netflow);
dpif_sflow_destroy(ofproto->sflow);
hmap_destroy(&ofproto->bundles);
- mac_learning_destroy(ofproto->ml);
+ mac_learning_unref(ofproto->ml);
classifier_destroy(&ofproto->facets);