X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Futils_cache.c;h=05386db9d33e9f12fa486ec90cf5cbf67868c23d;hb=60dffffa1cfc945160a1b85930117d69c3fd98ad;hp=82567f33e01a86b638a572b21e5af35121f1d2a0;hpb=2fb1d3a320cba6abe16fe1e1d22ba085c465b6a8;p=collectd.git diff --git a/src/utils_cache.c b/src/utils_cache.c index 82567f33..05386db9 100644 --- a/src/utils_cache.c +++ b/src/utils_cache.c @@ -68,7 +68,9 @@ static pthread_mutex_t cache_lock = PTHREAD_MUTEX_INITIALIZER; static int cache_compare (const cache_entry_t *a, const cache_entry_t *b) { +#if COLLECT_DEBUG assert ((a != NULL) && (b != NULL)); +#endif return (strcmp (a->name, b->name)); } /* int cache_compare */ @@ -574,18 +576,6 @@ int uc_get_names (char ***ret_names, cdtime_t **ret_times, size_t *ret_number) 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; if ((ret_names == NULL) || (ret_number == NULL)) @@ -593,47 +583,47 @@ int uc_get_names (char ***ret_names, cdtime_t **ret_times, size_t *ret_number) pthread_mutex_lock (&cache_lock); + size_arrays = (size_t) c_avl_size (cache_tree); + if (size_arrays < 1) + { + /* Handle the "no values" case here, to avoid the error message when + * calloc() returns NULL. */ + pthread_mutex_unlock (&cache_lock); + return (0); + } + + names = calloc (size_arrays, sizeof (*names)); + times = calloc (size_arrays, sizeof (*times)); + if ((names == NULL) || (times == NULL)) + { + ERROR ("uc_get_names: calloc failed."); + sfree (names); + sfree (times); + pthread_mutex_unlock (&cache_lock); + return (ENOMEM); + } + iter = c_avl_get_iterator (cache_tree); while (c_avl_iterator_next (iter, (void *) &key, (void *) &value) == 0) { - char **temp; - /* remove missing values when list values */ if (value->state == STATE_MISSING) continue; + /* c_avl_size does not return a number smaller than the number of elements + * returned by c_avl_iterator_next. */ + assert (number < size_arrays); + if (ret_times != NULL) - { - cdtime_t *tmp_times; - - 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[number] = value->last_time; - } - 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[number] = strdup (key); if (names[number] == NULL) { status = -1; break; } + number++; } /* while (c_avl_iterator_next) */