Skip to content

Commit 728548e

Browse files
authored
Merge pull request #2 from collabora/vector
vector: grow exponentially to reduce number of reallocs
2 parents d5827c2 + d932e0c commit 728548e

File tree

1 file changed

+15
-4
lines changed

1 file changed

+15
-4
lines changed

src/utils/vector.c

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,14 +99,25 @@ parserutils_error parserutils_vector_append(parserutils_vector *vector,
9999
slot = vector->current_item + 1;
100100

101101
if ((size_t) slot >= vector->items_allocated) {
102-
void *temp = realloc(vector->items,
103-
(vector->items_allocated + vector->chunk_size) *
104-
vector->item_size);
102+
/* Exponential growth: double current allocation,
103+
but at least add chunk_size */
104+
size_t new_allocated = vector->items_allocated * 2;
105+
void *temp;
106+
107+
if (new_allocated < vector->items_allocated + vector->chunk_size)
108+
new_allocated = vector->items_allocated + vector->chunk_size;
109+
110+
/* Overflow check */
111+
if (new_allocated < vector->items_allocated ||
112+
new_allocated > SIZE_MAX / vector->item_size)
113+
return PARSERUTILS_NOMEM;
114+
115+
temp = realloc(vector->items, new_allocated * vector->item_size);
105116
if (temp == NULL)
106117
return PARSERUTILS_NOMEM;
107118

108119
vector->items = temp;
109-
vector->items_allocated += vector->chunk_size;
120+
vector->items_allocated = new_allocated;
110121
}
111122

112123
memcpy((uint8_t *) vector->items + (slot * vector->item_size),

0 commit comments

Comments
 (0)