Signed-off-by: Ethan Jackson <et...@nicira.com> --- lib/learning-switch.c | 2 +- lib/mac-learning.c | 23 ++++++++++++++++++++--- lib/mac-learning.h | 4 +++- ofproto/ofproto-dpif.c | 2 +- 4 files changed, 25 insertions(+), 6 deletions(-)
diff --git a/lib/learning-switch.c b/lib/learning-switch.c index 426cb37..f2b3319 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 f9b3171..ca0ccb8 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 9feca00..06e99f3 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 c4b359b..9ac60be 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -1187,7 +1187,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); -- 1.7.9.5 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev