2 * Copyright (C) 2017 Jérémie Galarneau <jeremie.galarneau@efficios.com>
4 * SPDX-License-Identifier: LGPL-2.1-only
9 #include <common/error.h>
10 #include <common/macros.h>
11 #include <lttng/action/action-internal.h>
12 #include <lttng/action/notify-internal.h>
13 #include <lttng/action/rate-policy-internal.h>
15 #define IS_NOTIFY_ACTION(action) \
16 (lttng_action_get_type(action) == LTTNG_ACTION_TYPE_NOTIFY)
18 static struct lttng_action_notify
*action_notify_from_action(
19 struct lttng_action
*action
)
23 return container_of(action
, struct lttng_action_notify
, parent
);
26 static const struct lttng_action_notify
*action_notify_from_action_const(
27 const struct lttng_action
*action
)
31 return container_of(action
, struct lttng_action_notify
, parent
);
35 void lttng_action_notify_destroy(struct lttng_action
*action
)
37 struct lttng_action_notify
*notify_action
;
38 notify_action
= action_notify_from_action(action
);
39 lttng_rate_policy_destroy(notify_action
->policy
);
44 int lttng_action_notify_serialize(struct lttng_action
*action
,
45 struct lttng_payload
*payload
)
48 struct lttng_action_notify
*notify_action
;
50 if (!action
|| !IS_NOTIFY_ACTION(action
) || !payload
) {
55 DBG("Serializing notify action");
57 notify_action
= action_notify_from_action(action
);
58 DBG("Serializing notify action rate policy");
59 ret
= lttng_rate_policy_serialize(notify_action
->policy
, payload
);
66 bool lttng_action_notify_is_equal(const struct lttng_action
*a
,
67 const struct lttng_action
*b
)
69 const struct lttng_action_notify
*_a
, *_b
;
71 _a
= action_notify_from_action_const(a
);
72 _b
= action_notify_from_action_const(b
);
73 return lttng_rate_policy_is_equal(_a
->policy
, _b
->policy
);
76 static const struct lttng_rate_policy
*
77 lttng_action_notify_internal_get_rate_policy(const struct lttng_action
*action
)
79 const struct lttng_action_notify
*_action
;
80 _action
= action_notify_from_action_const(action
);
82 return _action
->policy
;
85 struct lttng_action
*lttng_action_notify_create(void)
87 struct lttng_rate_policy
*policy
= NULL
;
88 struct lttng_action_notify
*notify
= NULL
;
89 struct lttng_action
*action
= NULL
;
91 notify
= zmalloc(sizeof(struct lttng_action_notify
));
97 policy
= lttng_rate_policy_every_n_create(1);
102 lttng_action_init(¬ify
->parent
, LTTNG_ACTION_TYPE_NOTIFY
, NULL
,
103 lttng_action_notify_serialize
,
104 lttng_action_notify_is_equal
,
105 lttng_action_notify_destroy
,
106 lttng_action_notify_internal_get_rate_policy
);
108 notify
->policy
= policy
;
111 action
= ¬ify
->parent
;
116 lttng_rate_policy_destroy(policy
);
120 ssize_t
lttng_action_notify_create_from_payload(
121 struct lttng_payload_view
*view
,
122 struct lttng_action
**action
)
124 enum lttng_action_status status
;
125 ssize_t consumed_length
;
126 struct lttng_rate_policy
*rate_policy
= NULL
;
127 struct lttng_action
*_action
= NULL
;
129 consumed_length
= lttng_rate_policy_create_from_payload(
132 consumed_length
= -1;
136 _action
= lttng_action_notify_create();
138 consumed_length
= -1;
142 status
= lttng_action_notify_set_rate_policy(_action
, rate_policy
);
143 if (status
!= LTTNG_ACTION_STATUS_OK
) {
144 consumed_length
= -1;
152 lttng_rate_policy_destroy(rate_policy
);
153 lttng_action_destroy(_action
);
154 return consumed_length
;
157 enum lttng_action_status
lttng_action_notify_set_rate_policy(
158 struct lttng_action
*action
,
159 const struct lttng_rate_policy
*policy
)
161 enum lttng_action_status status
;
162 struct lttng_action_notify
*notify_action
;
163 struct lttng_rate_policy
*copy
= NULL
;
165 if (!action
|| !policy
|| !IS_NOTIFY_ACTION(action
)) {
166 status
= LTTNG_ACTION_STATUS_INVALID
;
170 copy
= lttng_rate_policy_copy(policy
);
172 status
= LTTNG_ACTION_STATUS_ERROR
;
176 notify_action
= action_notify_from_action(action
);
178 /* Free the previous rate policy .*/
179 lttng_rate_policy_destroy(notify_action
->policy
);
181 /* Assign the policy. */
182 notify_action
->policy
= copy
;
183 status
= LTTNG_ACTION_STATUS_OK
;
187 lttng_rate_policy_destroy(copy
);
191 enum lttng_action_status
lttng_action_notify_get_rate_policy(
192 const struct lttng_action
*action
,
193 const struct lttng_rate_policy
**policy
)
195 enum lttng_action_status status
;
196 const struct lttng_action_notify
*notify_action
;
198 if (!action
|| !policy
|| !IS_NOTIFY_ACTION(action
)) {
199 status
= LTTNG_ACTION_STATUS_INVALID
;
203 notify_action
= action_notify_from_action_const(action
);
205 *policy
= notify_action
->policy
;
206 status
= LTTNG_ACTION_STATUS_OK
;