From e892d3f7a3b41f0f473a41bfadd0c55e2db8b233 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=A9mie=20Galarneau?= Date: Mon, 27 Feb 2017 18:48:07 -0500 Subject: [PATCH] lttng-ctl: Implement the buffer usage condition evaluation interface MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérémie Galarneau --- .../lttng/condition/buffer-usage-internal.h | 11 +++ src/lib/lttng-ctl/buffer-usage.c | 80 ++++++++++++++++++- 2 files changed, 88 insertions(+), 3 deletions(-) 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; +} -- 2.34.1