From: Jaroslav Kysela Date: Sun, 13 Mar 2016 17:19:55 +0000 (+0100) Subject: htsmsg: improve allocation for name and strings (merge allocations) X-Git-Tag: v4.2.1~872 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ff0615305dbdc3546e385fa6bce2a682aad9964f;p=thirdparty%2Ftvheadend.git htsmsg: improve allocation for name and strings (merge allocations) --- diff --git a/src/htsmsg.c b/src/htsmsg.c index b68658b94..2238f04da 100644 --- a/src/htsmsg.c +++ b/src/htsmsg.c @@ -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; diff --git a/src/htsmsg.h b/src/htsmsg.h index 02e21fc1a..0d3cdf810 100644 --- a/src/htsmsg.h +++ b/src/htsmsg.h @@ -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 diff --git a/src/htsmsg_xml.c b/src/htsmsg_xml.c index babb18a19..b13f2d802 100644 --- a/src/htsmsg_xml.c +++ b/src/htsmsg_xml.c @@ -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 {