diff --git a/src/utils_cache.c b/src/utils_cache.c
index dd5bcb59ffc9833b2a92341a085e32d526e9e812..82567f33e01a86b638a572b21e5af35121f1d2a0 100644 (file)
--- a/src/utils_cache.c
+++ b/src/utils_cache.c
char **names = NULL;
cdtime_t *times = NULL;
size_t number = 0;
+ size_t size_arrays = 0;
+
+ /* Increment size for the 2 arrays of values
+ * Because realloc is time consuming, it's better to
+ * realloc by blocks and not by units.
+ * To see the difference, set this value to 1.
+ *
+ * To change this value at compile time:
+ * ./configure CPPFLAGS="-DLISTVAL_INCREASE=102400"
+ */
+#ifndef LISTVAL_INCREASE
+# define LISTVAL_INCREASE 1024
+#endif
int status = 0;
@@ -593,23 +606,28 @@ int uc_get_names (char ***ret_names, cdtime_t **ret_times, size_t *ret_number)
{
cdtime_t *tmp_times;
- tmp_times = (cdtime_t *) realloc (times, sizeof (cdtime_t) * (number + 1));
- if (tmp_times == NULL)
- {
- status = -1;
- break;
+ if(number <= size_arrays) {
+ tmp_times = (cdtime_t *) realloc (times, sizeof (cdtime_t) * (size_arrays + LISTVAL_INCREASE));
+ if (tmp_times == NULL)
+ {
+ status = -1;
+ break;
+ }
+ times = tmp_times;
}
- times = tmp_times;
times[number] = value->last_time;
}
- temp = (char **) realloc (names, sizeof (char *) * (number + 1));
- if (temp == NULL)
- {
- status = -1;
- break;
+ if(number <= size_arrays) {
+ temp = (char **) realloc (names, sizeof (char *) * (size_arrays + LISTVAL_INCREASE));
+ if (temp == NULL)
+ {
+ status = -1;
+ break;
+ }
+ names = temp;
+ size_arrays += LISTVAL_INCREASE;
}
- names = temp;
names[number] = strdup (key);
if (names[number] == NULL)
{