actions: introduce function typedef for creating actions from buffer
authorSimon Marchi <simon.marchi@efficios.com>
Thu, 28 Nov 2019 22:51:01 +0000 (17:51 -0500)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Fri, 17 Apr 2020 20:33:36 +0000 (16:33 -0400)
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 <simon.marchi@efficios.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
include/lttng/action/action-internal.h
include/lttng/action/notify-internal.h
src/common/actions/action.c
src/common/actions/notify.c

index 787e9087a01e353c664c1876575dad2867a4fa5b..d08024a039b3e9cd5e195153b9ac32f60042ce4e 100644 (file)
@@ -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;
index e6cb174ceea5de44705dc7b880259e5cbdfe8705..a9d50612dbceace92565d08deed4a85ed31902cb 100644 (file)
@@ -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 */
index dc72d37b4a88f75e6bf0575e16bf0c8c911435d3..982ca45ff27619f3c52d1ba6a15e937ae4b2b647 100644 (file)
@@ -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;
 }
index 00d1a0ef4e0e9828f0a55d150fb408e55b843a57..9d005b82365b9797c073408db5fa852f32385822 100644 (file)
@@ -38,3 +38,20 @@ struct lttng_action *lttng_action_notify_create(void)
 end:
        return &notify->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;
+}
This page took 0.037878 seconds and 4 git commands to generate.