Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
htsmsg: improve allocation for name and strings (merge allocations)
  • Loading branch information
perexg committed Mar 13, 2016
1 parent 3927788 commit ff06153
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 26 deletions.
53 changes: 33 additions & 20 deletions src/htsmsg.c
Expand Up @@ -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) {
Expand All @@ -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;
Expand Down Expand Up @@ -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;
}

Expand All @@ -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;
}

Expand All @@ -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;
Expand All @@ -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;
}

Expand All @@ -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);
}

/*
Expand Down Expand Up @@ -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);
}

Expand All @@ -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);
}

/*
Expand All @@ -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;
}
Expand Down Expand Up @@ -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);
}

Expand All @@ -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;
Expand Down
8 changes: 5 additions & 3 deletions src/htsmsg.h
Expand Up @@ -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;
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down
6 changes: 3 additions & 3 deletions src/htsmsg_xml.c
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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 {
Expand Down

0 comments on commit ff06153

Please sign in to comment.