[ovs-dev] [xlate v1 04/18] bfd: Reference count 'struct bfd'.

Ethan Jackson ethan at nicira.com
Tue Jun 25 01:59:18 UTC 2013


Signed-off-by: Ethan Jackson <ethan at nicira.com>
---
 lib/bfd.c |   33 ++++++++++++++++++++++++++++-----
 lib/bfd.h |    2 ++
 2 files changed, 30 insertions(+), 5 deletions(-)

diff --git a/lib/bfd.c b/lib/bfd.c
index ddf8c4c..7c15c6a 100644
--- a/lib/bfd.c
+++ b/lib/bfd.c
@@ -179,6 +179,8 @@ struct bfd {
     long long int last_tx;        /* Last TX time. */
     long long int next_tx;        /* Next TX time. */
     long long int detect_time;    /* RFC 5880 6.8.4 Detection time. */
+
+    int ref_cnt;
 };
 
 static bool bfd_in_poll(const struct bfd *);
@@ -248,11 +250,7 @@ bfd_configure(struct bfd *bfd, const char *name,
     }
 
     if (!cfg || !smap_get_bool(cfg, "enable", false)) {
-        if (bfd) {
-            hmap_remove(&all_bfds, &bfd->node);
-            free(bfd->name);
-            free(bfd);
-        }
+        bfd_unref(bfd);
         return NULL;
     }
 
@@ -265,6 +263,7 @@ bfd_configure(struct bfd *bfd, const char *name,
         bfd->diag = DIAG_NONE;
         bfd->min_tx = 1000;
         bfd->mult = 3;
+        bfd->ref_cnt = 1;
 
         /* RFC 5881 section 4
          * The source port MUST be in the range 49152 through 65535.  The same
@@ -309,6 +308,30 @@ bfd_configure(struct bfd *bfd, const char *name,
     return bfd;
 }
 
+struct bfd *
+bfd_ref(const struct bfd *bfd_)
+{
+    struct bfd *bfd = CONST_CAST(struct bfd *, bfd_);
+    if (bfd) {
+        ovs_assert(bfd->ref_cnt > 0);
+        bfd->ref_cnt++;
+    }
+    return bfd;
+}
+
+void
+bfd_unref(struct bfd *bfd)
+{
+    if (bfd) {
+        ovs_assert(bfd->ref_cnt > 0);
+        if (!--bfd->ref_cnt) {
+            hmap_remove(&all_bfds, &bfd->node);
+            free(bfd->name);
+            free(bfd);
+        }
+    }
+}
+
 void
 bfd_wait(const struct bfd *bfd)
 {
diff --git a/lib/bfd.h b/lib/bfd.h
index 61f9945..ab854d8 100644
--- a/lib/bfd.h
+++ b/lib/bfd.h
@@ -40,6 +40,8 @@ void bfd_process_packet(struct bfd *, const struct flow *,
 
 struct bfd *bfd_configure(struct bfd *, const char *name,
                           const struct smap *smap);
+struct bfd *bfd_ref(const struct bfd *);
+void bfd_unref(struct bfd *);
 
 bool bfd_forwarding(const struct bfd *);
 void bfd_get_status(const struct bfd *, struct smap *);
-- 
1.7.9.5




More information about the dev mailing list