From: Jérémie Galarneau Date: Mon, 27 Feb 2017 23:48:07 +0000 (-0500) Subject: lttng-ctl: Implement the buffer usage condition evaluation interface X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=commitdiff_plain;h=e892d3f7a3b41f0f473a41bfadd0c55e2db8b233 lttng-ctl: Implement the buffer usage condition evaluation interface Signed-off-by: Jérémie Galarneau --- diff --git a/include/lttng/condition/buffer-usage-internal.h b/include/lttng/condition/buffer-usage-internal.h index dfe9608df..c3f473cc2 100644 --- a/include/lttng/condition/buffer-usage-internal.h +++ b/include/lttng/condition/buffer-usage-internal.h @@ -20,6 +20,7 @@ #include #include +#include #include struct lttng_condition_buffer_usage { @@ -41,4 +42,14 @@ struct lttng_condition_buffer_usage { } domain; }; +struct lttng_evaluation_buffer_usage { + struct lttng_evaluation parent; + uint64_t buffer_use; + uint64_t buffer_capacity; +}; + +LTTNG_HIDDEN +struct lttng_evaluation *lttng_evaluation_buffer_usage_create(uint64_t use, + uint64_t capacity); + #endif /* LTTNG_CONDITION_BUFFER_USAGE_INTERNAL_H */ diff --git a/src/lib/lttng-ctl/buffer-usage.c b/src/lib/lttng-ctl/buffer-usage.c index aaa5f2a9d..b6e4c8cd8 100644 --- a/src/lib/lttng-ctl/buffer-usage.c +++ b/src/lib/lttng-ctl/buffer-usage.c @@ -30,10 +30,12 @@ bool is_usage_condition(struct lttng_condition *condition) } static -bool is_usage_condition(struct lttng_condition *condition) +bool is_usage_evaluation(struct lttng_evaluation *evaluation) { - return is_low_usage_condition(condition) || - is_high_usage_condition(condition); + enum lttng_condition_type type = lttng_evaluation_get_type(evaluation); + + return type == LTTNG_CONDITION_TYPE_BUFFER_USAGE_LOW || + type == LTTNG_CONDITION_TYPE_BUFFER_USAGE_HIGH; } static @@ -334,3 +336,75 @@ lttng_condition_buffer_usage_set_domain_type( end: return status; } + +static +void lttng_evaluation_buffer_usage_destroy( + struct lttng_evaluation *evaluation) +{ + struct lttng_evaluation_buffer_usage *usage; + + usage = container_of(evaluation, struct lttng_evaluation_buffer_usage, + parent); + free(usage); +} + +LTTNG_HIDDEN +struct lttng_evaluation *lttng_evaluation_buffer_usage_create(uint64_t use, + uint64_t capacity) +{ + struct lttng_evaluation_buffer_usage *usage; + + usage = zmalloc(sizeof(struct lttng_evaluation_buffer_usage)); + if (!usage) { + goto end; + } + + usage->buffer_use = use; + usage->buffer_capacity = capacity; + usage->parent.destroy = lttng_evaluation_buffer_usage_destroy; +end: + return &usage->parent; +} + +/* + * Get the sampled buffer usage which caused the associated condition to + * evaluate to "true". + */ +enum lttng_evaluation_status +lttng_evaluation_buffer_usage_get_usage_percentage( + struct lttng_evaluation *evaluation, double *usage_percent) +{ + struct lttng_evaluation_buffer_usage *usage; + enum lttng_evaluation_status status = LTTNG_EVALUATION_STATUS_OK; + + if (!evaluation || !is_usage_evaluation(evaluation) || !usage_percent) { + status = LTTNG_EVALUATION_STATUS_INVALID; + goto end; + } + + usage = container_of(evaluation, struct lttng_evaluation_buffer_usage, + parent); + *usage_percent = (double) usage->buffer_use / + (double) usage->buffer_capacity; +end: + return status; +} + +enum lttng_evaluation_status +lttng_evaluation_buffer_usage_get_usage(struct lttng_evaluation *evaluation, + uint64_t *usage_bytes) +{ + struct lttng_evaluation_buffer_usage *usage; + enum lttng_evaluation_status status = LTTNG_EVALUATION_STATUS_OK; + + if (!evaluation || !is_usage_evaluation(evaluation) || !usage_bytes) { + status = LTTNG_EVALUATION_STATUS_INVALID; + goto end; + } + + usage = container_of(evaluation, struct lttng_evaluation_buffer_usage, + parent); + *usage_bytes = usage->buffer_use; +end: + return status; +}