Hello David, > > add 128 bytes of storage in each tagstruct that will initially > > be used; if this storage is exceeded the type changes to _DYNAMIC > > > > v2: (thanks Alexander Patrakov) > > * replace constant 100 with GROW_TAG_SIZE (the increment in with a dynamic > tagstruct grows when extend()ed) > > > > Signed-off-by: Peter Meerwald <pmeerw at pmeerw.net> > > --- > > src/pulsecore/tagstruct.c | 22 +++++++++++++++++----- > > 1 file changed, 17 insertions(+), 5 deletions(-) > > > > diff --git a/src/pulsecore/tagstruct.c b/src/pulsecore/tagstruct.c > > index 834a972..a504be8 100644 > > --- a/src/pulsecore/tagstruct.c > > +++ b/src/pulsecore/tagstruct.c > > @@ -41,6 +41,8 @@ > > #include "tagstruct.h" > > > > #define MAX_TAG_SIZE (64*1024) > > +#define MAX_APPENDED_SIZE 128 > > +#define GROW_TAG_SIZE 100 > > > > struct pa_tagstruct { > > uint8_t *data; > > @@ -50,17 +52,21 @@ struct pa_tagstruct { > > enum { > > PA_TAGSTRUCT_FIXED, > > PA_TAGSTRUCT_DYNAMIC, > > + PA_TAGSTRUCT_APPENDED, > > How about adding comments like this: > > PA_TAGSTRUCT_FIXED, /* The tagstruct does not own the data, buffer was > provided by caller */ > PA_TAGSTRUCT_DYNAMIC, /* Buffer owned by tagstruct, data must be freed */ > PA_TAGSTRUCT_APPENDED, /* Data points to per_type.appended minibuffer, > used for small tagstructs. Will change to dynamic if needed */ good idea! will do for the next revision thanks, p. > > } type; > > + union { > > + uint8_t appended[MAX_APPENDED_SIZE]; > > + } per_type; > > }; > > > > pa_tagstruct *pa_tagstruct_new(void) { > > pa_tagstruct*t; > > > > t = pa_xnew(pa_tagstruct, 1); > > - t->data = NULL; > > - t->allocated = t->length = 0; > > - t->rindex = 0; > > - t->type = PA_TAGSTRUCT_DYNAMIC; > > + t->data = t->per_type.appended; > > + t->allocated = MAX_APPENDED_SIZE; > > + t->length = t->rindex = 0; > > + t->type = PA_TAGSTRUCT_APPENDED; > > > > return t; > > } > > @@ -94,7 +100,13 @@ static void extend(pa_tagstruct*t, size_t l) { > > if (t->length+l <= t->allocated) > > return; > > > > - t->data = pa_xrealloc(t->data, t->allocated = t->length+l+100); > > + if (t->type == PA_TAGSTRUCT_DYNAMIC) > > + t->data = pa_xrealloc(t->data, t->allocated = t->length + l + > GROW_TAG_SIZE); > > + else if (t->type == PA_TAGSTRUCT_APPENDED) { > > + t->type = PA_TAGSTRUCT_DYNAMIC; > > + t->data = pa_xmalloc(t->allocated = t->length + l + GROW_TAG_SIZE); > > + memcpy(t->data, t->per_type.appended, t->length); > > + } > > } > > > > void pa_tagstruct_puts(pa_tagstruct*t, const char *s) { > > > > -- Peter Meerwald +43-664-2444418 (mobile)