From: Simon Marchi Date: Thu, 28 Nov 2019 22:51:01 +0000 (-0500) Subject: actions: introduce function typedef for creating actions from buffer X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=commitdiff_plain;h=869a3c2d29b8c75cc3b30f76ebd38c9a8b239018 actions: introduce function typedef for creating actions from buffer The only existing action type, LTTNG_ACTION_TYPE_NOTIFY, does not require deserializing additional data (on top of the action type field), so lttng_action_create_from_buffer handles it in a trivial way. Upcoming patches will introduce new action types which will need to deserialize some additional data. This patch prepares lttng_action_create_from_buffer for that by making it call an action-specific function for deserializing this additional data. The changes are inspired by what lttng_condition_create_from_buffer does. No functional changes intended. Change-Id: I469a67b744aa2cf7a45d7d970f1bbee6a994a2a9 Signed-off-by: Simon Marchi Signed-off-by: Jérémie Galarneau --- diff --git a/include/lttng/action/action-internal.h b/include/lttng/action/action-internal.h index 787e9087a..d08024a03 100644 --- a/include/lttng/action/action-internal.h +++ b/include/lttng/action/action-internal.h @@ -19,6 +19,9 @@ typedef bool (*action_validate_cb)(struct lttng_action *action); typedef void (*action_destroy_cb)(struct lttng_action *action); typedef int (*action_serialize_cb)(struct lttng_action *action, struct lttng_dynamic_buffer *buf); +typedef ssize_t (*action_create_from_buffer_cb)( + const struct lttng_buffer_view *view, + struct lttng_action **action); struct lttng_action { enum lttng_action_type type; diff --git a/include/lttng/action/notify-internal.h b/include/lttng/action/notify-internal.h index e6cb174ce..a9d50612d 100644 --- a/include/lttng/action/notify-internal.h +++ b/include/lttng/action/notify-internal.h @@ -15,4 +15,9 @@ struct lttng_action_notify { struct lttng_action parent; }; +LTTNG_HIDDEN +ssize_t lttng_action_notify_create_from_buffer( + const struct lttng_buffer_view *view, + struct lttng_action **action); + #endif /* LTTNG_ACTION_NOTIFY_INTERNAL_H */ diff --git a/src/common/actions/action.c b/src/common/actions/action.c index dc72d37b4..982ca45ff 100644 --- a/src/common/actions/action.c +++ b/src/common/actions/action.c @@ -78,34 +78,48 @@ end: LTTNG_HIDDEN ssize_t lttng_action_create_from_buffer(const struct lttng_buffer_view *view, - struct lttng_action **_action) + struct lttng_action **action) { - ssize_t ret, action_size = sizeof(struct lttng_action_comm); - struct lttng_action *action; + ssize_t consumed_len, specific_action_consumed_len; const struct lttng_action_comm *action_comm; + action_create_from_buffer_cb create_from_buffer_cb; + struct lttng_buffer_view specific_action_view; - if (!view || !_action) { - ret = -1; + if (!view || !action) { + consumed_len = -1; goto end; } action_comm = (const struct lttng_action_comm *) view->data; + DBG("Deserializing action from buffer"); switch (action_comm->action_type) { case LTTNG_ACTION_TYPE_NOTIFY: - action = lttng_action_notify_create(); + create_from_buffer_cb = lttng_action_notify_create_from_buffer; break; default: - ret = -1; + consumed_len = -1; goto end; } - if (!action) { - ret = -1; + /* Create buffer view for the action-type-specific data. */ + specific_action_view = lttng_buffer_view_from_view(view, + sizeof(struct lttng_action_comm), + view->size - sizeof(struct lttng_action_comm)); + + specific_action_consumed_len = + create_from_buffer_cb(&specific_action_view, action); + if (specific_action_consumed_len < 0) { + ERR("Failed to create specific action from buffer."); + consumed_len = -1; goto end; } - ret = action_size; - *_action = action; + + assert(*action); + + consumed_len = sizeof(struct lttng_action_comm) + + specific_action_consumed_len; + end: - return ret; + return consumed_len; } diff --git a/src/common/actions/notify.c b/src/common/actions/notify.c index 00d1a0ef4..9d005b823 100644 --- a/src/common/actions/notify.c +++ b/src/common/actions/notify.c @@ -38,3 +38,20 @@ struct lttng_action *lttng_action_notify_create(void) end: return ¬ify->parent; } + +ssize_t lttng_action_notify_create_from_buffer( + const struct lttng_buffer_view *view, + struct lttng_action **action) +{ + ssize_t consumed_length; + + *action = lttng_action_notify_create(); + if (!*action) { + consumed_length = -1; + goto end; + } + + consumed_length = 0; +end: + return consumed_length; +}