From de69ee14d3ed094cd2bc4df603a03675c28d1b5b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 12 Mar 2009 12:31:57 -0400 Subject: [PATCH] [fcxml.c] Embed a static 64-byte attr buffer in FcPStack Reduces number of mallocs called from FcConfigSaveAttr in my small test from 160 down to 6. --- src/fcstr.c | 4 ++-- src/fcxml.c | 23 +++++++++++++++-------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/fcstr.c b/src/fcstr.c index c683c80..bebf8ce 100644 --- a/src/fcstr.c +++ b/src/fcstr.c @@ -716,8 +716,8 @@ FcStrBufInit (FcStrBuf *buf, FcChar8 *init, int size) buf->size = size; } else { - buf->buf = buf->static_buf; - buf->size = sizeof (buf->static_buf); + buf->buf = buf->buf_static; + buf->size = sizeof (buf->buf_static); } buf->allocated = FcFalse; buf->failed = FcFalse; diff --git a/src/fcxml.c b/src/fcxml.c index a25ffe7..2928ef9 100644 --- a/src/fcxml.c +++ b/src/fcxml.c @@ -414,6 +414,7 @@ typedef struct _FcPStack { FcElement element; FcChar8 **attr; FcStrBuf str; + FcChar8 *attr_buf_static[16]; } FcPStack; typedef enum _FcVStackTag { @@ -920,7 +921,7 @@ FcVStackElements (FcConfigParse *parse) } static FcChar8 ** -FcConfigSaveAttr (const XML_Char **attr) +FcConfigSaveAttr (const XML_Char **attr, FcChar8 **buf, int size_bytes) { int slen; int i; @@ -934,13 +935,19 @@ FcConfigSaveAttr (const XML_Char **attr) slen += strlen ((char *) attr[i]) + 1; if (i == 0) return 0; - new = malloc ((i + 1) * sizeof (FcChar8 *) + slen); - if (!new) + slen += (i + 1) * sizeof (FcChar8 *); + if (slen <= size_bytes) + new = buf; + else { - FcConfigMessage (0, FcSevereError, "out of memory"); - return 0; + new = malloc (slen); + if (!new) + { + FcConfigMessage (0, FcSevereError, "out of memory"); + return 0; + } + FcMemAlloc (FC_MEM_ATTR, 1); /* size is too expensive */ } - FcMemAlloc (FC_MEM_ATTR, 1); /* size is too expensive */ s = (FcChar8 *) (new + (i + 1)); for (i = 0; attr[i]; i++) { @@ -969,7 +976,7 @@ FcPStackPush (FcConfigParse *parse, FcElement element, const XML_Char **attr) new->prev = parse->pstack; new->element = element; - new->attr = FcConfigSaveAttr (attr); + new->attr = FcConfigSaveAttr (attr, new->attr_buf_static, sizeof (new->attr_buf_static)); FcStrBufInit (&new->str, 0, 0); parse->pstack = new; return FcTrue; @@ -989,7 +996,7 @@ FcPStackPop (FcConfigParse *parse) old = parse->pstack; parse->pstack = old->prev; FcStrBufDestroy (&old->str); - if (old->attr) + if (old->attr && old->attr != old->attr_buf_static) { FcMemFree (FC_MEM_ATTR, 1); /* size is to expensive */ free (old->attr); -- 2.39.5