X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Futils_cache.c;h=648c54de5b13b498df24b9ac3909eb2275544844;hb=0e1bb73758ac56f435e1313e6d78c4e41d53a78d;hp=956f8269c786a04614b089a088d5640be0b3ce83;hpb=c35203c82560eba66bb901aa22c5170fb8c389fb;p=collectd.git diff --git a/src/utils_cache.c b/src/utils_cache.c index 956f8269..648c54de 100644 --- a/src/utils_cache.c +++ b/src/utils_cache.c @@ -46,6 +46,7 @@ typedef struct cache_entry_s * (for purding old entries) */ int interval; int state; + int hits; /* * +-----+-----+-----+-----+-----+-----+-----+-----+-----+---- @@ -895,6 +896,83 @@ int uc_get_history (const data_set_t *ds, const value_list_t *vl, return (uc_get_history_by_name (name, ret_history, num_steps, num_ds)); } /* int uc_get_history */ +int uc_get_hits (const data_set_t *ds, const value_list_t *vl) +{ + char name[6 * DATA_MAX_NAME_LEN]; + cache_entry_t *ce = NULL; + int ret = STATE_ERROR; + + if (FORMAT_VL (name, sizeof (name), vl) != 0) + { + ERROR ("uc_get_state: FORMAT_VL failed."); + return (STATE_ERROR); + } + + pthread_mutex_lock (&cache_lock); + + if (c_avl_get (cache_tree, name, (void *) &ce) == 0) + { + assert (ce != NULL); + ret = ce->hits; + } + + pthread_mutex_unlock (&cache_lock); + + return (ret); +} /* int uc_get_hits */ + +int uc_set_hits (const data_set_t *ds, const value_list_t *vl, int hits) +{ + char name[6 * DATA_MAX_NAME_LEN]; + cache_entry_t *ce = NULL; + int ret = -1; + + if (FORMAT_VL (name, sizeof (name), vl) != 0) + { + ERROR ("uc_get_state: FORMAT_VL failed."); + return (STATE_ERROR); + } + + pthread_mutex_lock (&cache_lock); + + if (c_avl_get (cache_tree, name, (void *) &ce) == 0) + { + assert (ce != NULL); + ret = ce->hits; + ce->hits = hits; + } + + pthread_mutex_unlock (&cache_lock); + + return (ret); +} /* int uc_set_hits */ + +int uc_inc_hits (const data_set_t *ds, const value_list_t *vl, int step) +{ + char name[6 * DATA_MAX_NAME_LEN]; + cache_entry_t *ce = NULL; + int ret = -1; + + if (FORMAT_VL (name, sizeof (name), vl) != 0) + { + ERROR ("uc_get_state: FORMAT_VL failed."); + return (STATE_ERROR); + } + + pthread_mutex_lock (&cache_lock); + + if (c_avl_get (cache_tree, name, (void *) &ce) == 0) + { + assert (ce != NULL); + ret = ce->hits; + ce->hits = ret + step; + } + + pthread_mutex_unlock (&cache_lock); + + return (ret); +} /* int uc_inc_hits */ + /* * Meta data interface */ @@ -925,6 +1003,9 @@ static meta_data_t *uc_get_meta (const value_list_t *vl) /* {{{ */ if (ce->meta == NULL) ce->meta = meta_data_create (); + if (ce->meta == NULL) + pthread_mutex_unlock (&cache_lock); + return (ce->meta); } /* }}} meta_data_t *uc_get_meta */