]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
htsmsg: improve allocation for name and strings (merge allocations)
authorJaroslav Kysela <perex@perex.cz>
Sun, 13 Mar 2016 17:19:55 +0000 (18:19 +0100)
committerJaroslav Kysela <perex@perex.cz>
Sun, 13 Mar 2016 17:19:55 +0000 (18:19 +0100)
src/htsmsg.c
src/htsmsg.h
src/htsmsg_xml.c

index b68658b94aef9a92dcd1b17cc3e3e660b593ad51..2238f04da0ba2d2cf3d8b273a68e378b67f01c95 100644 (file)
@@ -90,10 +90,16 @@ htsmsg_clear(htsmsg_t *msg)
  *
  */
 htsmsg_field_t *
-htsmsg_field_add(htsmsg_t *msg, const char *name, int type, int flags)
+htsmsg_field_add(htsmsg_t *msg, const char *name, int type, int flags, size_t esize)
 {
-  htsmsg_field_t *f = malloc(sizeof(htsmsg_field_t));
+  size_t nsize = 0;
+  htsmsg_field_t *f;
   
+  if((flags & HMF_NAME_INALLOCED) && name)
+    nsize = strlen(name) + 1;
+  f = malloc(sizeof(htsmsg_field_t) + nsize + esize);
+  if(f == NULL)
+    return NULL;
   TAILQ_INSERT_TAIL(&msg->hm_fields, f, hmf_link);
 
   if(msg->hm_islist) {
@@ -102,10 +108,19 @@ htsmsg_field_add(htsmsg_t *msg, const char *name, int type, int flags)
     assert(name != NULL);
   }
 
-  if(flags & HMF_NAME_ALLOCED)
+  if(flags & HMF_NAME_INALLOCED) {
+    if (name) {
+      f->hmf_name = f->hmf_edata;
+      strcpy(f->hmf_edata, name);
+    }
+  } else if(flags & HMF_NAME_ALLOCED) {
     f->hmf_name = name ? strdup(name) : NULL;
-  else
+  } else {
     f->hmf_name = name;
+  }
+
+  if(esize)
+    f->hmf_str = f->hmf_edata + nsize;
 
   f->hmf_type = type;
   f->hmf_flags = flags;
@@ -223,7 +238,7 @@ htsmsg_destroy(htsmsg_t *msg)
 void
 htsmsg_add_bool(htsmsg_t *msg, const char *name, int b)
 {
-  htsmsg_field_t *f = htsmsg_field_add(msg, name, HMF_BOOL, HMF_NAME_ALLOCED);
+  htsmsg_field_t *f = htsmsg_field_add(msg, name, HMF_BOOL, HMF_NAME_INALLOCED, 0);
   f->hmf_bool = !!b;
 }
 
@@ -233,7 +248,7 @@ htsmsg_add_bool(htsmsg_t *msg, const char *name, int b)
 void
 htsmsg_add_s64(htsmsg_t *msg, const char *name, int64_t s64)
 {
-  htsmsg_field_t *f = htsmsg_field_add(msg, name, HMF_S64, HMF_NAME_ALLOCED);
+  htsmsg_field_t *f = htsmsg_field_add(msg, name, HMF_S64, HMF_NAME_INALLOCED, 0);
   f->hmf_s64 = s64;
 }
 
@@ -245,7 +260,7 @@ htsmsg_set_s64(htsmsg_t *msg, const char *name, int64_t s64)
 {
   htsmsg_field_t *f = htsmsg_field_find(msg, name);
   if (!f)
-    f = htsmsg_field_add(msg, name, HMF_S64, HMF_NAME_ALLOCED);
+    f = htsmsg_field_add(msg, name, HMF_S64, HMF_NAME_INALLOCED, 0);
   if (f->hmf_type != HMF_S64)
     return 1;
   f->hmf_s64 = s64;
@@ -259,7 +274,7 @@ htsmsg_set_s64(htsmsg_t *msg, const char *name, int64_t s64)
 void
 htsmsg_add_dbl(htsmsg_t *msg, const char *name, double dbl)
 {
-  htsmsg_field_t *f = htsmsg_field_add(msg, name, HMF_DBL, HMF_NAME_ALLOCED);
+  htsmsg_field_t *f = htsmsg_field_add(msg, name, HMF_DBL, HMF_NAME_INALLOCED, 0);
   f->hmf_dbl = dbl;
 }
 
@@ -271,9 +286,9 @@ htsmsg_add_dbl(htsmsg_t *msg, const char *name, double dbl)
 void
 htsmsg_add_str(htsmsg_t *msg, const char *name, const char *str)
 {
-  htsmsg_field_t *f = htsmsg_field_add(msg, name, HMF_STR, 
-                                       HMF_ALLOCED | HMF_NAME_ALLOCED);
-  f->hmf_str = strdup(str);
+  htsmsg_field_t *f = htsmsg_field_add(msg, name, HMF_STR, HMF_NAME_INALLOCED,
+                                       strlen(str) + 1);
+  strcpy((char *)f->hmf_str, str);
 }
 
 /*
@@ -328,7 +343,7 @@ htsmsg_set_str(htsmsg_t *msg, const char *name, const char *str)
 {
   htsmsg_field_t *f = htsmsg_field_find(msg, name);
   if (!f)
-    f = htsmsg_field_add(msg, name, HMF_STR, HMF_NAME_ALLOCED);
+    f = htsmsg_field_add(msg, name, HMF_STR, HMF_NAME_INALLOCED, 0);
   return htsmsg_field_set_str(f, str);
 }
 
@@ -338,12 +353,10 @@ htsmsg_set_str(htsmsg_t *msg, const char *name, const char *str)
 void
 htsmsg_add_bin(htsmsg_t *msg, const char *name, const void *bin, size_t len)
 {
-  htsmsg_field_t *f = htsmsg_field_add(msg, name, HMF_BIN, 
-                                      HMF_ALLOCED | HMF_NAME_ALLOCED);
-  void *v;
-  f->hmf_bin = v = malloc(len);
+  htsmsg_field_t *f = htsmsg_field_add(msg, name, HMF_BIN, HMF_NAME_INALLOCED, len);
+  f->hmf_bin = f->hmf_str;
   f->hmf_binsize = len;
-  memcpy(v, bin, len);
+  memcpy((void *)f->hmf_bin, bin, len);
 }
 
 /*
@@ -352,7 +365,7 @@ htsmsg_add_bin(htsmsg_t *msg, const char *name, const void *bin, size_t len)
 void
 htsmsg_add_binptr(htsmsg_t *msg, const char *name, const void *bin, size_t len)
 {
-  htsmsg_field_t *f = htsmsg_field_add(msg, name, HMF_BIN, HMF_NAME_ALLOCED);
+  htsmsg_field_t *f = htsmsg_field_add(msg, name, HMF_BIN, HMF_NAME_INALLOCED, 0);
   f->hmf_bin = bin;
   f->hmf_binsize = len;
 }
@@ -385,7 +398,7 @@ htsmsg_add_msg(htsmsg_t *msg, const char *name, htsmsg_t *sub)
   htsmsg_field_t *f;
 
   f = htsmsg_field_add(msg, name, sub->hm_islist ? HMF_LIST : HMF_MAP,
-                      HMF_NAME_ALLOCED);
+                      HMF_NAME_INALLOCED, 0);
   return htsmsg_field_set_msg(f, sub);
 }
 
@@ -412,7 +425,7 @@ htsmsg_add_msg_extname(htsmsg_t *msg, const char *name, htsmsg_t *sub)
 {
   htsmsg_field_t *f;
 
-  f = htsmsg_field_add(msg, name, sub->hm_islist ? HMF_LIST : HMF_MAP, 0);
+  f = htsmsg_field_add(msg, name, sub->hm_islist ? HMF_LIST : HMF_MAP, 0, 0);
 
   assert(sub->hm_data == NULL);
   f->hmf_msg.hm_data = NULL;
index 02e21fc1acbd6f8b50b7bc0fbeab302d5ea147c6..0d3cdf8100e6ec5cd0dc29669e5a221aaa07c3b2 100644 (file)
@@ -58,8 +58,9 @@ typedef struct htsmsg_field {
   uint8_t hmf_type;
   uint8_t hmf_flags;
 
-#define HMF_ALLOCED 0x1
-#define HMF_NAME_ALLOCED 0x2
+#define HMF_ALLOCED        0x1
+#define HMF_NAME_INALLOCED 0x2
+#define HMF_NAME_ALLOCED   0x4
 
   union {
     int64_t  s64;
@@ -72,6 +73,7 @@ typedef struct htsmsg_field {
     double dbl;
     int bool;
   } u;
+  char hmf_edata[0];
 } htsmsg_field_t;
 
 #define hmf_s64     u.s64
@@ -378,7 +380,7 @@ void htsmsg_print(htsmsg_t *msg);
  * Create a new field. Primarily intended for htsmsg internal functions.
  */
 htsmsg_field_t *htsmsg_field_add(htsmsg_t *msg, const char *name,
-                                int type, int flags);
+                                int type, int flags, size_t esize);
 
 /**
  * Get a field, return NULL if it does not exist
index babb18a19e4e2a989026d334ba0a6e2ec5bde3d3..b13f2d8022fc4246bd07dda1de1a977064fd12b8 100644 (file)
@@ -300,7 +300,7 @@ htsmsg_xml_parse_attrib(xmlparser_t *xp, htsmsg_t *msg, char *src,
   attribname[attriblen] = 0;
   payload[payloadlen] = 0;
 
-  f = htsmsg_field_add(msg, attribname, HMF_STR, 0);
+  f = htsmsg_field_add(msg, attribname, HMF_STR, 0, 0);
   f->hmf_str = payload;
   return src;
 }
@@ -702,7 +702,7 @@ htsmsg_xml_parse_cd(xmlparser_t *xp, htsmsg_t *parent, char *src)
     assert(cc != NULL);
     assert(TAILQ_NEXT(cc, cc_link) == NULL);
     
-    f = htsmsg_field_add(parent, "cdata", HMF_STR, 0);
+    f = htsmsg_field_add(parent, "cdata", HMF_STR, 0, 0);
     f->hmf_str = cc->cc_start;
     *cc->cc_end = 0;
     free(cc);
@@ -731,7 +731,7 @@ htsmsg_xml_parse_cd(xmlparser_t *xp, htsmsg_t *parent, char *src)
     }
     body[c] = 0;
 
-    f = htsmsg_field_add(parent, "cdata", HMF_STR, HMF_ALLOCED);
+    f = htsmsg_field_add(parent, "cdata", HMF_STR, HMF_ALLOCED, 0);
     f->hmf_str = body;
 
   } else {