X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Frrdtool.c;h=b80e1109cfcdfed8e27623a3390e548e0ca9e7e5;hb=6d86a97190a193863aadc252f20f6b9dba61c263;hp=debb7bd4ff4416386d5881ec814e1dbd63f7313a;hpb=6e419a825c50f9c97471aba7d50521bfc7e19828;p=collectd.git diff --git a/src/rrdtool.c b/src/rrdtool.c index debb7bd4..b80e1109 100644 --- a/src/rrdtool.c +++ b/src/rrdtool.c @@ -279,6 +279,7 @@ static void *rrd_queue_thread (void __attribute__((unused)) *data) rrd_cache_t *cache_entry; char **values; int values_num; + int status; int i; pthread_mutex_lock (&queue_lock); @@ -286,7 +287,6 @@ static void *rrd_queue_thread (void __attribute__((unused)) *data) while (true) { struct timespec ts_wait; - int status; while ((flushq_head == NULL) && (queue_head == NULL) && (do_shutdown == 0)) @@ -361,17 +361,28 @@ static void *rrd_queue_thread (void __attribute__((unused)) *data) * we make a copy of it's values */ pthread_mutex_lock (&cache_lock); - c_avl_get (cache, queue_entry->filename, (void *) &cache_entry); + status = c_avl_get (cache, queue_entry->filename, + (void *) &cache_entry); - values = cache_entry->values; - values_num = cache_entry->values_num; + if (status == 0) + { + values = cache_entry->values; + values_num = cache_entry->values_num; - cache_entry->values = NULL; - cache_entry->values_num = 0; - cache_entry->flags = FLAG_NONE; + cache_entry->values = NULL; + cache_entry->values_num = 0; + cache_entry->flags = FLAG_NONE; + } pthread_mutex_unlock (&cache_lock); + if (status != 0) + { + sfree (queue_entry->filename); + sfree (queue_entry); + continue; + } + /* Update `tv_next_update' */ if (write_rate > 0.0) { @@ -625,6 +636,15 @@ static int rrd_cache_insert (const char *filename, pthread_mutex_lock (&cache_lock); + /* This shouldn't happen, but it did happen at least once, so we'll be + * careful. */ + if (cache == NULL) + { + pthread_mutex_unlock (&cache_lock); + WARNING ("rrdtool plugin: cache == NULL."); + return (-1); + } + c_avl_get (cache, filename, (void *) &rc); if (rc == NULL)