X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Fsession-consumed-size.c;h=e147d1e5ffcf0536d8e7b32595b39ce9be0f042e;hp=f2ae65a9e22cb2963db00c97cf58dcaa2cb47f07;hb=3e6e0df2f8f9f23d252c2508b6d741916dfcc4b3;hpb=e8360425c2fd0f8cfef1e678af5adfde7ae0a68e diff --git a/src/common/session-consumed-size.c b/src/common/session-consumed-size.c index f2ae65a9e..e147d1e5f 100644 --- a/src/common/session-consumed-size.c +++ b/src/common/session-consumed-size.c @@ -1,22 +1,13 @@ /* - * Copyright (C) 2017 - Jérémie Galarneau + * Copyright (C) 2017 Jérémie Galarneau * - * This library is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License, version 2.1 only, - * as published by the Free Software Foundation. + * SPDX-License-Identifier: LGPL-2.1-only * - * This library is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this library; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include +#include #include #include #include @@ -58,11 +49,11 @@ bool lttng_condition_session_consumed_size_validate( consumed = container_of(condition, struct lttng_condition_session_consumed_size, parent); if (!consumed->session_name) { - ERR("Invalid buffer condition: a target session name must be set."); + ERR("Invalid session consumed size condition: a target session name must be set."); goto end; } if (!consumed->consumed_threshold_bytes.set) { - ERR("Invalid session condition: a threshold must be set."); + ERR("Invalid session consumed size condition: a threshold must be set."); goto end; } @@ -72,40 +63,46 @@ end: } static -ssize_t lttng_condition_session_consumed_size_serialize( - const struct lttng_condition *condition, char *buf) +int lttng_condition_session_consumed_size_serialize( + const struct lttng_condition *condition, + struct lttng_payload *payload) { - struct lttng_condition_session_consumed_size *consumed; - ssize_t ret, size; + int ret; size_t session_name_len; + struct lttng_condition_session_consumed_size *consumed; + struct lttng_condition_session_consumed_size_comm consumed_comm; if (!condition || !IS_CONSUMED_SIZE_CONDITION(condition)) { ret = -1; goto end; } - DBG("Serializing session consumed condition"); - consumed = container_of(condition, struct lttng_condition_session_consumed_size, + DBG("Serializing session consumed size condition"); + consumed = container_of(condition, + struct lttng_condition_session_consumed_size, parent); - size = sizeof(struct lttng_condition_session_consumed_size_comm); + session_name_len = strlen(consumed->session_name) + 1; if (session_name_len > LTTNG_NAME_MAX) { ret = -1; goto end; } - size += session_name_len; - if (buf) { - struct lttng_condition_session_consumed_size_comm consumed_comm = { - .consumed_threshold_bytes = consumed->consumed_threshold_bytes.value, - .session_name_len = session_name_len, - }; - memcpy(buf, &consumed_comm, sizeof(consumed_comm)); - buf += sizeof(consumed_comm); - memcpy(buf, consumed->session_name, session_name_len); - buf += session_name_len; + consumed_comm.consumed_threshold_bytes = + consumed->consumed_threshold_bytes.value; + consumed_comm.session_name_len = (uint32_t) session_name_len; + + ret = lttng_dynamic_buffer_append(&payload->buffer, &consumed_comm, + sizeof(consumed_comm)); + if (ret) { + goto end; + } + + ret = lttng_dynamic_buffer_append(&payload->buffer, consumed->session_name, + session_name_len); + if (ret) { + goto end; } - ret = size; end: return ret; } @@ -130,8 +127,9 @@ bool lttng_condition_session_consumed_size_is_equal(const struct lttng_condition } } - if ((a->session_name && !b->session_name) || - (!a->session_name && b->session_name)) { + assert(a->session_name); + assert(b->session_name); + if (strcmp(a->session_name, b->session_name)) { goto end; } @@ -158,24 +156,26 @@ struct lttng_condition *lttng_condition_session_consumed_size_create(void) } static -ssize_t init_condition_from_buffer(struct lttng_condition *condition, - const struct lttng_buffer_view *src_view) +ssize_t init_condition_from_payload(struct lttng_condition *condition, + struct lttng_payload_view *src_view) { ssize_t ret, condition_size; enum lttng_condition_status status; - const struct lttng_condition_session_consumed_size_comm *condition_comm; const char *session_name; - struct lttng_buffer_view names_view; + struct lttng_buffer_view session_name_view; + const struct lttng_condition_session_consumed_size_comm *condition_comm; + struct lttng_payload_view condition_comm_view = lttng_payload_view_from_view( + src_view, 0, sizeof(*condition_comm)); - if (src_view->size < sizeof(*condition_comm)) { + if (!lttng_payload_view_is_valid(&condition_comm_view)) { ERR("Failed to initialize from malformed condition buffer: buffer too short to contain header"); ret = -1; goto end; } - condition_comm = (const struct lttng_condition_session_consumed_size_comm *) src_view->data; - names_view = lttng_buffer_view_from_view(src_view, - sizeof(*condition_comm), -1); + condition_comm = (typeof(condition_comm)) condition_comm_view.buffer.data; + session_name_view = lttng_buffer_view_from_view(&src_view->buffer, + sizeof(*condition_comm), condition_comm->session_name_len); if (condition_comm->session_name_len > LTTNG_NAME_MAX) { ERR("Failed to initialize from malformed condition buffer: name exceeds LTTNG_MAX_NAME"); @@ -183,7 +183,7 @@ ssize_t init_condition_from_buffer(struct lttng_condition *condition, goto end; } - if (names_view.size < condition_comm->session_name_len) { + if (!lttng_buffer_view_is_valid(&session_name_view)) { ERR("Failed to initialize from malformed condition buffer: buffer too short to contain element names"); ret = -1; goto end; @@ -192,12 +192,12 @@ ssize_t init_condition_from_buffer(struct lttng_condition *condition, status = lttng_condition_session_consumed_size_set_threshold(condition, condition_comm->consumed_threshold_bytes); if (status != LTTNG_CONDITION_STATUS_OK) { - ERR("Failed to initialize session consumed condition threshold"); + ERR("Failed to initialize session consumed size condition threshold"); ret = -1; goto end; } - session_name = names_view.data; + session_name = session_name_view.data; if (*(session_name + condition_comm->session_name_len - 1) != '\0') { ERR("Malformed session name encountered in condition buffer"); ret = -1; @@ -207,7 +207,7 @@ ssize_t init_condition_from_buffer(struct lttng_condition *condition, status = lttng_condition_session_consumed_size_set_session_name(condition, session_name); if (status != LTTNG_CONDITION_STATUS_OK) { - ERR("Failed to set buffer consumed session name"); + ERR("Failed to set session consumed size condition's session name"); ret = -1; goto end; } @@ -225,8 +225,8 @@ end: } LTTNG_HIDDEN -ssize_t lttng_condition_session_consumed_size_create_from_buffer( - const struct lttng_buffer_view *view, +ssize_t lttng_condition_session_consumed_size_create_from_payload( + struct lttng_payload_view *view, struct lttng_condition **_condition) { ssize_t ret; @@ -238,7 +238,7 @@ ssize_t lttng_condition_session_consumed_size_create_from_buffer( goto error; } - ret = init_condition_from_buffer(condition, view); + ret = init_condition_from_payload(condition, view); if (ret < 0) { goto error; } @@ -251,27 +251,26 @@ error: } static -struct lttng_evaluation *create_evaluation_from_buffer( - enum lttng_condition_type type, - const struct lttng_buffer_view *view) +struct lttng_evaluation *create_evaluation_from_payload( + const struct lttng_payload_view *view) { const struct lttng_evaluation_session_consumed_size_comm *comm = - (const struct lttng_evaluation_session_consumed_size_comm *) view->data; + (typeof(comm)) view->buffer.data; struct lttng_evaluation *evaluation = NULL; - if (view->size < sizeof(*comm)) { + if (view->buffer.size < sizeof(*comm)) { goto end; } - evaluation = lttng_evaluation_session_consumed_size_create(type, + evaluation = lttng_evaluation_session_consumed_size_create( comm->session_consumed); end: return evaluation; } LTTNG_HIDDEN -ssize_t lttng_evaluation_session_consumed_size_create_from_buffer( - const struct lttng_buffer_view *view, +ssize_t lttng_evaluation_session_consumed_size_create_from_payload( + struct lttng_payload_view *view, struct lttng_evaluation **_evaluation) { ssize_t ret; @@ -282,8 +281,7 @@ ssize_t lttng_evaluation_session_consumed_size_create_from_buffer( goto error; } - evaluation = create_evaluation_from_buffer( - LTTNG_CONDITION_TYPE_SESSION_CONSUMED_SIZE, view); + evaluation = create_evaluation_from_payload(view); if (!evaluation) { ret = -1; goto error; @@ -396,24 +394,18 @@ end: } static -ssize_t lttng_evaluation_session_consumed_size_serialize( - struct lttng_evaluation *evaluation, char *buf) +int lttng_evaluation_session_consumed_size_serialize( + const struct lttng_evaluation *evaluation, + struct lttng_payload *payload) { - ssize_t ret; struct lttng_evaluation_session_consumed_size *consumed; + struct lttng_evaluation_session_consumed_size_comm comm; - consumed = container_of(evaluation, struct lttng_evaluation_session_consumed_size, - parent); - if (buf) { - struct lttng_evaluation_session_consumed_size_comm comm = { - .session_consumed = consumed->session_consumed, - }; - - memcpy(buf, &comm, sizeof(comm)); - } - - ret = sizeof(struct lttng_evaluation_session_consumed_size_comm); - return ret; + consumed = container_of(evaluation, + struct lttng_evaluation_session_consumed_size, parent); + comm.session_consumed = consumed->session_consumed; + return lttng_dynamic_buffer_append( + &payload->buffer, &comm, sizeof(comm)); } static @@ -429,7 +421,7 @@ void lttng_evaluation_session_consumed_size_destroy( LTTNG_HIDDEN struct lttng_evaluation *lttng_evaluation_session_consumed_size_create( - enum lttng_condition_type type, uint64_t consumed) + uint64_t consumed) { struct lttng_evaluation_session_consumed_size *consumed_eval; @@ -438,7 +430,7 @@ struct lttng_evaluation *lttng_evaluation_session_consumed_size_create( goto end; } - consumed_eval->parent.type = type; + consumed_eval->parent.type = LTTNG_CONDITION_TYPE_SESSION_CONSUMED_SIZE; consumed_eval->session_consumed = consumed; consumed_eval->parent.serialize = lttng_evaluation_session_consumed_size_serialize; consumed_eval->parent.destroy = lttng_evaluation_session_consumed_size_destroy;