X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Factions%2Fnotify.c;h=0ab88be44fe6397ab7351dc058a3057dfef2c8a2;hp=ea68c75fd0f0c38eba8255e7374033ec1928d5dd;hb=7f4d5b07cf7be895b38b69073389a4fcc318ec29;hpb=6acb3f46333c25d5a2f3a3ff8158956a4689031e diff --git a/src/common/actions/notify.c b/src/common/actions/notify.c index ea68c75fd..0ab88be44 100644 --- a/src/common/actions/notify.c +++ b/src/common/actions/notify.c @@ -5,53 +5,205 @@ * */ +#include +#include +#include #include #include -#include -#include +#include + +#define IS_NOTIFY_ACTION(action) \ + (lttng_action_get_type(action) == LTTNG_ACTION_TYPE_NOTIFY) + +static struct lttng_action_notify *action_notify_from_action( + struct lttng_action *action) +{ + assert(action); + + return container_of(action, struct lttng_action_notify, parent); +} + +static const struct lttng_action_notify *action_notify_from_action_const( + const struct lttng_action *action) +{ + assert(action); + + return container_of(action, struct lttng_action_notify, parent); +} static void lttng_action_notify_destroy(struct lttng_action *action) { - free(action); + struct lttng_action_notify *notify_action; + notify_action = action_notify_from_action(action); + lttng_rate_policy_destroy(notify_action->policy); + free(notify_action); } static int lttng_action_notify_serialize(struct lttng_action *action, - struct lttng_dynamic_buffer *buf) + struct lttng_payload *payload) +{ + int ret; + struct lttng_action_notify *notify_action; + + if (!action || !IS_NOTIFY_ACTION(action) || !payload) { + ret = -1; + goto end; + } + + DBG("Serializing notify action"); + + notify_action = action_notify_from_action(action); + DBG("Serializing notify action rate policy"); + ret = lttng_rate_policy_serialize(notify_action->policy, payload); + +end: + return ret; +} + +static +bool lttng_action_notify_is_equal(const struct lttng_action *a, + const struct lttng_action *b) { - return 0; + const struct lttng_action_notify *_a, *_b; + + _a = action_notify_from_action_const(a); + _b = action_notify_from_action_const(b); + return lttng_rate_policy_is_equal(_a->policy, _b->policy); +} + +static const struct lttng_rate_policy * +lttng_action_notify_internal_get_rate_policy(const struct lttng_action *action) +{ + const struct lttng_action_notify *_action; + _action = action_notify_from_action_const(action); + + return _action->policy; } struct lttng_action *lttng_action_notify_create(void) { - struct lttng_action_notify *notify; + struct lttng_rate_policy *policy = NULL; + struct lttng_action_notify *notify = NULL; + struct lttng_action *action = NULL; notify = zmalloc(sizeof(struct lttng_action_notify)); if (!notify) { goto end; } + /* Default policy. */ + policy = lttng_rate_policy_every_n_create(1); + if (!policy) { + goto end; + } + lttng_action_init(¬ify->parent, LTTNG_ACTION_TYPE_NOTIFY, NULL, lttng_action_notify_serialize, - lttng_action_notify_destroy); + lttng_action_notify_is_equal, + lttng_action_notify_destroy, + lttng_action_notify_internal_get_rate_policy); + + notify->policy = policy; + policy = NULL; + + action = ¬ify->parent; + notify = NULL; + end: - return ¬ify->parent; + free(notify); + lttng_rate_policy_destroy(policy); + return action; } -ssize_t lttng_action_notify_create_from_buffer( - const struct lttng_buffer_view *view, +ssize_t lttng_action_notify_create_from_payload( + struct lttng_payload_view *view, struct lttng_action **action) { + enum lttng_action_status status; ssize_t consumed_length; + struct lttng_rate_policy *rate_policy = NULL; + struct lttng_action *_action = NULL; + + consumed_length = lttng_rate_policy_create_from_payload( + view, &rate_policy); + if (!rate_policy) { + consumed_length = -1; + goto end; + } + + _action = lttng_action_notify_create(); + if (!_action) { + consumed_length = -1; + goto end; + } - *action = lttng_action_notify_create(); - if (!*action) { + status = lttng_action_notify_set_rate_policy(_action, rate_policy); + if (status != LTTNG_ACTION_STATUS_OK) { consumed_length = -1; goto end; } - consumed_length = 0; + *action = _action; + _action = NULL; + end: + lttng_rate_policy_destroy(rate_policy); + lttng_action_destroy(_action); return consumed_length; } + +enum lttng_action_status lttng_action_notify_set_rate_policy( + struct lttng_action *action, + const struct lttng_rate_policy *policy) +{ + enum lttng_action_status status; + struct lttng_action_notify *notify_action; + struct lttng_rate_policy *copy = NULL; + + if (!action || !policy || !IS_NOTIFY_ACTION(action)) { + status = LTTNG_ACTION_STATUS_INVALID; + goto end; + } + + copy = lttng_rate_policy_copy(policy); + if (!copy) { + status = LTTNG_ACTION_STATUS_ERROR; + goto end; + } + + notify_action = action_notify_from_action(action); + + /* Free the previous rate policy .*/ + lttng_rate_policy_destroy(notify_action->policy); + + /* Assign the policy. */ + notify_action->policy = copy; + status = LTTNG_ACTION_STATUS_OK; + copy = NULL; + +end: + lttng_rate_policy_destroy(copy); + return status; +} + +enum lttng_action_status lttng_action_notify_get_rate_policy( + const struct lttng_action *action, + const struct lttng_rate_policy **policy) +{ + enum lttng_action_status status; + const struct lttng_action_notify *notify_action; + + if (!action || !policy || !IS_NOTIFY_ACTION(action)) { + status = LTTNG_ACTION_STATUS_INVALID; + goto end; + } + + notify_action = action_notify_from_action_const(action); + + *policy = notify_action->policy; + status = LTTNG_ACTION_STATUS_OK; +end: + return status; +}