tag: try not to reallocate tag.items in every add() call

If many tag_items are added at once while the tag cache is being
loaded, manage these items in a static fixed list, instead of
reallocating the list with every newly created item.  This reduces
heap fragmentation.

Massif results again:

 mk before:  total 12,837,632; useful 10,626,383; extra 2,211,249
 mk now:     total 12,736,720; useful 10,626,383; extra 2,110,337

The "useful" value is the same since this patch only changes the way
we allocate the same amount of memory, but heap fragmentation was
reduced by 5%.
This commit is contained in:
Max Kellermann
2008-08-29 09:39:08 +02:00
parent 031522060a
commit 1aa3457346
3 changed files with 91 additions and 7 deletions

View File

@@ -61,8 +61,22 @@ void tag_clear_items_by_type(struct tag *tag, enum tag_type itemType);
void tag_free(struct tag *tag);
/**
* Gives an optional hint to the tag library that we will now add
* several tag items; this is used by the library to optimize memory
* allocation. Only one tag may be in this state, and this tag must
* not have any items yet. You must call tag_end_add() when you are
* done.
*/
void tag_begin_add(struct tag *tag);
/**
* Finishes the operation started with tag_begin_add().
*/
void tag_end_add(struct tag *tag);
void tag_add_item_n(struct tag *tag, enum tag_type itemType,
const char *value, size_t len);
const char *value, size_t len);
static inline void tag_add_item(struct tag *tag, enum tag_type itemType,
const char *value)