Hi
I wonder why you are implementing this pool in a slightly different way than 
msg pool.
Why not use malloc and then memset 0 the new/reused tlv when returned from 
tlv_extra_alloc
Why not name the function tlv_extra_put instead of recycle, and remove the 
memset 0 since it can be made in the alloc function
Change the text for recycle function in h-file, the free is made in cleanup, 
this just adds it to pool

/Anders

-----Ursprungligt meddelande-----
Från: Richard Cochran [mailto:richardcoch...@gmail.com] 
Skickat: den 1 mars 2018 20:35
Till: linuxptp-devel@lists.sourceforge.net
Ämne: [Linuxptp-devel] [PATCH RFC V2 01/10] tlv: Implement a memory pool for 
TLV descriptors.

Signed-off-by: Richard Cochran <richardcoch...@gmail.com>
---
 msg.c |  3 +++
 tlv.c | 32 ++++++++++++++++++++++++++++++++  tlv.h | 21 +++++++++++++++++++++
 3 files changed, 56 insertions(+)

diff --git a/msg.c b/msg.c
index 6943431..52a59e7 100644
--- a/msg.c
+++ b/msg.c
@@ -213,6 +213,9 @@ void msg_cleanup(void)  {
        struct message_storage *s;
        struct ptp_message *m;
+
+       tlv_extra_cleanup();
+
        while ((m = TAILQ_FIRST(&msg_pool)) != NULL) {
                TAILQ_REMOVE(&msg_pool, m, list);
                s = container_of(m, struct message_storage, msg); diff --git 
a/tlv.c b/tlv.c index a5c2eb3..aa4dafa 100644
--- a/tlv.c
+++ b/tlv.c
@@ -18,6 +18,7 @@
  */
 #include <arpa/inet.h>
 #include <errno.h>
+#include <stdlib.h>
 #include <string.h>
 
 #include "port.h"
@@ -29,6 +30,9 @@
 
 uint8_t ieee8021_id[3] = { IEEE_802_1_COMMITTEE };
 
+static TAILQ_HEAD(tlv_pool, tlv_extra) tlv_pool =
+       TAILQ_HEAD_INITIALIZER(tlv_pool);
+
 static void scaled_ns_n2h(ScaledNs *sns)  {
        sns->nanoseconds_msb = ntohs(sns->nanoseconds_msb); @@ -412,6 +416,34 
@@ static void org_pre_send(struct organization_tlv *org)
        }
 }
 
+struct tlv_extra *tlv_extra_alloc(void) {
+       struct tlv_extra *extra = TAILQ_FIRST(&tlv_pool);
+
+       if (extra) {
+               TAILQ_REMOVE(&tlv_pool, extra, list);
+       } else {
+               extra = calloc(1, sizeof(*extra));
+       }
+       return extra;
+}
+
+void tlv_extra_cleanup(void)
+{
+       struct tlv_extra *extra;
+
+       while ((extra = TAILQ_FIRST(&tlv_pool)) != NULL) {
+               TAILQ_REMOVE(&tlv_pool, extra, list);
+               free(extra);
+       }
+}
+
+void tlv_extra_recycle(struct tlv_extra *extra) {
+       memset(extra, 0, sizeof(*extra));
+       TAILQ_INSERT_HEAD(&tlv_pool, extra, list); }
+
 int tlv_post_recv(struct TLV *tlv, struct tlv_extra *extra)  {
        int result = 0;
diff --git a/tlv.h b/tlv.h
index c345afe..fd41022 100644
--- a/tlv.h
+++ b/tlv.h
@@ -20,6 +20,8 @@
 #ifndef HAVE_TLV_H
 #define HAVE_TLV_H
 
+#include <sys/queue.h>
+
 #include "ddt.h"
 #include "ds.h"
 
@@ -228,12 +230,31 @@ struct mgmt_clock_description {  };
 
 struct tlv_extra {
+       TAILQ_ENTRY(tlv_extra) list;
+       struct TLV *tlv;
        union {
                struct mgmt_clock_description cd;
        };
 };
 
 /**
+ * Allocates a new tlv_extra structure.
+ * @return  Pointer to a new structure on success or NULL otherwise.
+ */
+struct tlv_extra *tlv_extra_alloc(void);
+
+/**
+ * Release all of the memory in the tlv_extra cache.
+ */
+void tlv_extra_cleanup(void);
+
+/**
+ * Frees a tlv_extra structure.
+ * @param extra  Pointer to the structure to free.
+ */
+void tlv_extra_recycle(struct tlv_extra *extra);
+
+/**
  * Converts recognized value sub-fields into host byte order.
  * @param tlv Pointer to a Type Length Value field.
  * @param extra Additional struct where data from tlv will be saved,
--
2.11.0


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Linuxptp-devel mailing list
Linuxptp-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Linuxptp-devel mailing list
Linuxptp-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel

Reply via email to