#include <regex.h>
-#define UTILS_MATCH_FLAGS_FREE_USER_DATA 0x01
#define UTILS_MATCH_FLAGS_EXCLUDE_REGEX 0x02
struct cu_match_s {
int (*callback)(const char *str, char *const *matches, size_t matches_num,
void *user_data);
void *user_data;
+ void (*free)(void *user_data);
};
/*
if (matches[1] == endptr)
return (-1);
+ if (data->ds_type & UTILS_MATCH_CF_GAUGE_DIST) {
+ latency_counter_add(data->latency, DOUBLE_TO_CDTIME_T(value));
+ data->values_num++;
+ return (0);
+ }
+
if ((data->values_num == 0) ||
- (data->ds_type & UTILS_MATCH_CF_GAUGE_LAST)) {
+ (data->ds_type & UTILS_MATCH_CF_GAUGE_LAST) ||
+ (data->ds_type & UTILS_MATCH_CF_GAUGE_PERSIST)) {
data->value.gauge = value;
} else if (data->ds_type & UTILS_MATCH_CF_GAUGE_AVERAGE) {
double f = ((double)data->values_num) / ((double)(data->values_num + 1));
return (0);
} /* int default_callback */
+static void match_simple_free(void *data) {
+ cu_match_value_t *user_data = (cu_match_value_t *)data;
+ if (user_data->latency)
+ latency_counter_destroy(user_data->latency);
+
+ free(data);
+} /* void match_simple_free */
+
/*
* Public functions
*/
match_create_callback(const char *regex, const char *excluderegex,
int (*callback)(const char *str, char *const *matches,
size_t matches_num, void *user_data),
- void *user_data) {
+ void *user_data,
+ void (*free_user_data)(void *user_data)) {
cu_match_t *obj;
int status;
obj->callback = callback;
obj->user_data = user_data;
+ obj->free = free_user_data;
return (obj);
} /* cu_match_t *match_create_callback */
return (NULL);
user_data->ds_type = match_ds_type;
- obj = match_create_callback(regex, excluderegex, default_callback, user_data);
+ if ((match_ds_type & UTILS_MATCH_DS_TYPE_GAUGE) &&
+ (match_ds_type & UTILS_MATCH_CF_GAUGE_DIST)) {
+ user_data->latency = latency_counter_create();
+ if (user_data->latency == NULL) {
+ ERROR("match_create_simple(): latency_counter_create() failed.");
+ free(user_data);
+ return (NULL);
+ }
+ }
+
+ obj = match_create_callback(regex, excluderegex, default_callback, user_data,
+ match_simple_free);
if (obj == NULL) {
+ if (user_data->latency)
+ latency_counter_destroy(user_data->latency);
+
sfree(user_data);
return (NULL);
}
-
- obj->flags |= UTILS_MATCH_FLAGS_FREE_USER_DATA;
-
return (obj);
} /* cu_match_t *match_create_simple */
if (mv == NULL)
return;
- if (mv->ds_type & UTILS_MATCH_DS_TYPE_GAUGE) {
+ /* Reset GAUGE metrics only and except GAUGE_PERSIST. */
+ if ((mv->ds_type & UTILS_MATCH_DS_TYPE_GAUGE) &&
+ !(mv->ds_type & UTILS_MATCH_CF_GAUGE_PERSIST)) {
mv->value.gauge = NAN;
mv->values_num = 0;
}
if (obj == NULL)
return;
- if (obj->flags & UTILS_MATCH_FLAGS_FREE_USER_DATA) {
- sfree(obj->user_data);
- }
+ if ((obj->user_data != NULL) && (obj->free != NULL))
+ (*obj->free)(obj->user_data);
sfree(obj);
} /* void match_destroy */