X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Factions%2Frotate-session.c;h=3d5a61709b791be6a531eeee7c82b18f677e3737;hb=7f4d5b07cf7be895b38b69073389a4fcc318ec29;hp=a492876607a4e68c53cf640f82cc8f08cd3f16d8;hpb=17182cfd13b6d35cf8c80d4f9ccf8d2bdd1a05f2;p=lttng-tools.git diff --git a/src/common/actions/rotate-session.c b/src/common/actions/rotate-session.c index a49287660..3d5a61709 100644 --- a/src/common/actions/rotate-session.c +++ b/src/common/actions/rotate-session.c @@ -9,6 +9,8 @@ #include #include #include +#include +#include #include #include @@ -20,6 +22,7 @@ struct lttng_action_rotate_session { /* Owned by this. */ char *session_name; + struct lttng_rate_policy *policy; }; struct lttng_action_rotate_session_comm { @@ -30,10 +33,15 @@ struct lttng_action_rotate_session_comm { * Variable data: * * - session name (null terminated) + * - policy */ char data[]; } LTTNG_PACKED; +static const struct lttng_rate_policy * +lttng_action_rotate_session_internal_get_rate_policy( + const struct lttng_action *action); + static struct lttng_action_rotate_session *action_rotate_session_from_action( struct lttng_action *action) { @@ -90,7 +98,7 @@ static bool lttng_action_rotate_session_is_equal( goto end; } - is_equal = true; + is_equal = lttng_rate_policy_is_equal(a->policy, b->policy); end: return is_equal; } @@ -129,7 +137,12 @@ static int lttng_action_rotate_session_serialize( goto end; } - ret = 0; + ret = lttng_rate_policy_serialize( + action_rotate_session->policy, payload); + if (ret) { + ret = -1; + goto end; + } end: return ret; } @@ -144,6 +157,7 @@ static void lttng_action_rotate_session_destroy(struct lttng_action *action) action_rotate_session = action_rotate_session_from_action(action); + lttng_rate_policy_destroy(action_rotate_session->policy); free(action_rotate_session->session_name); free(action_rotate_session); @@ -155,11 +169,12 @@ ssize_t lttng_action_rotate_session_create_from_payload( struct lttng_payload_view *view, struct lttng_action **p_action) { - ssize_t consumed_len; + ssize_t consumed_len, ret; const struct lttng_action_rotate_session_comm *comm; const char *session_name; struct lttng_action *action; enum lttng_action_status status; + struct lttng_rate_policy *policy = NULL; action = lttng_action_rotate_session_create(); if (!action) { @@ -175,6 +190,21 @@ ssize_t lttng_action_rotate_session_create_from_payload( consumed_len = -1; goto end; } + consumed_len = sizeof(*comm) + comm->session_name_len; + + /* Rate policy. */ + { + struct lttng_payload_view policy_view = + lttng_payload_view_from_view( + view, consumed_len, -1); + ret = lttng_rate_policy_create_from_payload( + &policy_view, &policy); + if (ret < 0) { + consumed_len = -1; + goto end; + } + consumed_len += ret; + } status = lttng_action_rotate_session_set_session_name( action, session_name); @@ -183,11 +213,18 @@ ssize_t lttng_action_rotate_session_create_from_payload( goto end; } - consumed_len = sizeof(*comm) + comm->session_name_len; + assert(policy); + status = lttng_action_rotate_session_set_rate_policy(action, policy); + if (status != LTTNG_ACTION_STATUS_OK) { + consumed_len = -1; + goto end; + } + *p_action = action; action = NULL; end: + lttng_rate_policy_destroy(policy); lttng_action_rotate_session_destroy(action); return consumed_len; @@ -195,7 +232,15 @@ end: struct lttng_action *lttng_action_rotate_session_create(void) { - struct lttng_action *action; + struct lttng_action *action = NULL; + struct lttng_rate_policy *policy = NULL; + enum lttng_action_status status; + + /* Create a every N = 1 rate policy. */ + policy = lttng_rate_policy_every_n_create(1); + if (!policy) { + goto end; + } action = zmalloc(sizeof(struct lttng_action_rotate_session)); if (!action) { @@ -206,9 +251,18 @@ struct lttng_action *lttng_action_rotate_session_create(void) lttng_action_rotate_session_validate, lttng_action_rotate_session_serialize, lttng_action_rotate_session_is_equal, - lttng_action_rotate_session_destroy); + lttng_action_rotate_session_destroy, + lttng_action_rotate_session_internal_get_rate_policy); + + status = lttng_action_rotate_session_set_rate_policy(action, policy); + if (status != LTTNG_ACTION_STATUS_OK) { + free(action); + action = NULL; + goto end; + } end: + lttng_rate_policy_destroy(policy); return action; } @@ -258,3 +312,67 @@ enum lttng_action_status lttng_action_rotate_session_get_session_name( end: return status; } + +enum lttng_action_status lttng_action_rotate_session_set_rate_policy( + struct lttng_action *action, + const struct lttng_rate_policy *policy) +{ + enum lttng_action_status status; + struct lttng_action_rotate_session *rotate_session_action; + struct lttng_rate_policy *copy = NULL; + + if (!action || !policy || !IS_ROTATE_SESSION_ACTION(action)) { + status = LTTNG_ACTION_STATUS_INVALID; + goto end; + } + + copy = lttng_rate_policy_copy(policy); + if (!copy) { + status = LTTNG_ACTION_STATUS_ERROR; + goto end; + } + + rotate_session_action = action_rotate_session_from_action(action); + + /* Free the previous rate policy .*/ + lttng_rate_policy_destroy(rotate_session_action->policy); + + /* Assign the policy. */ + rotate_session_action->policy = copy; + status = LTTNG_ACTION_STATUS_OK; + copy = NULL; + +end: + lttng_rate_policy_destroy(copy); + return status; +} + +enum lttng_action_status lttng_action_rotate_session_get_rate_policy( + const struct lttng_action *action, + const struct lttng_rate_policy **policy) +{ + enum lttng_action_status status; + const struct lttng_action_rotate_session *rotate_session_action; + + if (!action || !policy || !IS_ROTATE_SESSION_ACTION(action)) { + status = LTTNG_ACTION_STATUS_INVALID; + goto end; + } + + rotate_session_action = action_rotate_session_from_action_const(action); + + *policy = rotate_session_action->policy; + status = LTTNG_ACTION_STATUS_OK; +end: + return status; +} + +static const struct lttng_rate_policy * +lttng_action_rotate_session_internal_get_rate_policy( + const struct lttng_action *action) +{ + const struct lttng_action_rotate_session *_action; + _action = action_rotate_session_from_action_const(action); + + return _action->policy; +}