clang-tidy: add Chrome-inspired checks
[lttng-tools.git] / src / common / conditions / session-consumed-size.cpp
CommitLineData
e8360425 1/*
ab5be9fa 2 * Copyright (C) 2017 Jérémie Galarneau <jeremie.galarneau@efficios.com>
e8360425 3 *
ab5be9fa 4 * SPDX-License-Identifier: LGPL-2.1-only
e8360425 5 *
e8360425
JD
6 */
7
c9e313bc
SM
8#include <common/error.hpp>
9#include <common/macros.hpp>
10#include <common/mi-lttng.hpp>
28ab034a 11
c9e313bc
SM
12#include <lttng/condition/condition-internal.hpp>
13#include <lttng/condition/session-consumed-size-internal.hpp>
319370bd 14#include <lttng/constant.h>
28ab034a
JG
15
16#include <float.h>
e8360425 17#include <math.h>
e8360425
JD
18#include <time.h>
19
28ab034a
JG
20#define IS_CONSUMED_SIZE_CONDITION(condition) \
21 (lttng_condition_get_type(condition) == LTTNG_CONDITION_TYPE_SESSION_CONSUMED_SIZE)
e8360425 22
28ab034a
JG
23#define IS_CONSUMED_SIZE_EVALUATION(evaluation) \
24 (lttng_evaluation_get_type(evaluation) == LTTNG_CONDITION_TYPE_SESSION_CONSUMED_SIZE)
e8360425 25
28ab034a 26static void lttng_condition_session_consumed_size_destroy(struct lttng_condition *condition)
e8360425
JD
27{
28 struct lttng_condition_session_consumed_size *consumed_size;
29
0114db0e 30 consumed_size = lttng::utils::container_of(condition,
28ab034a 31 &lttng_condition_session_consumed_size::parent);
e8360425
JD
32
33 free(consumed_size->session_name);
34 free(consumed_size);
35}
36
28ab034a 37static bool lttng_condition_session_consumed_size_validate(const struct lttng_condition *condition)
e8360425
JD
38{
39 bool valid = false;
40 struct lttng_condition_session_consumed_size *consumed;
41
42 if (!condition) {
43 goto end;
44 }
45
0114db0e 46 consumed = lttng::utils::container_of(condition,
28ab034a 47 &lttng_condition_session_consumed_size::parent);
e8360425 48 if (!consumed->session_name) {
9ef5b6be 49 ERR("Invalid session consumed size condition: a target session name must be set.");
e8360425
JD
50 goto end;
51 }
52 if (!consumed->consumed_threshold_bytes.set) {
9ef5b6be 53 ERR("Invalid session consumed size condition: a threshold must be set.");
e8360425
JD
54 goto end;
55 }
56
57 valid = true;
58end:
59 return valid;
60}
61
28ab034a
JG
62static int lttng_condition_session_consumed_size_serialize(const struct lttng_condition *condition,
63 struct lttng_payload *payload)
e8360425 64{
3647288f 65 int ret;
e8360425 66 size_t session_name_len;
3647288f
JG
67 struct lttng_condition_session_consumed_size *consumed;
68 struct lttng_condition_session_consumed_size_comm consumed_comm;
e8360425
JD
69
70 if (!condition || !IS_CONSUMED_SIZE_CONDITION(condition)) {
71 ret = -1;
72 goto end;
73 }
74
3647288f 75 DBG("Serializing session consumed size condition");
0114db0e 76 consumed = lttng::utils::container_of(condition,
28ab034a 77 &lttng_condition_session_consumed_size::parent);
3647288f 78
e8360425
JD
79 session_name_len = strlen(consumed->session_name) + 1;
80 if (session_name_len > LTTNG_NAME_MAX) {
81 ret = -1;
82 goto end;
83 }
3647288f 84
28ab034a 85 consumed_comm.consumed_threshold_bytes = consumed->consumed_threshold_bytes.value;
3647288f
JG
86 consumed_comm.session_name_len = (uint32_t) session_name_len;
87
28ab034a 88 ret = lttng_dynamic_buffer_append(&payload->buffer, &consumed_comm, sizeof(consumed_comm));
3647288f
JG
89 if (ret) {
90 goto end;
91 }
c0a66c84 92
28ab034a
JG
93 ret = lttng_dynamic_buffer_append(
94 &payload->buffer, consumed->session_name, session_name_len);
3647288f
JG
95 if (ret) {
96 goto end;
e8360425 97 }
e8360425
JD
98end:
99 return ret;
100}
101
28ab034a
JG
102static bool lttng_condition_session_consumed_size_is_equal(const struct lttng_condition *_a,
103 const struct lttng_condition *_b)
e8360425
JD
104{
105 bool is_equal = false;
106 struct lttng_condition_session_consumed_size *a, *b;
107
0114db0e
JG
108 a = lttng::utils::container_of(_a, &lttng_condition_session_consumed_size::parent);
109 b = lttng::utils::container_of(_b, &lttng_condition_session_consumed_size::parent);
e8360425
JD
110
111 if (a->consumed_threshold_bytes.set && b->consumed_threshold_bytes.set) {
112 uint64_t a_value, b_value;
113
114 a_value = a->consumed_threshold_bytes.value;
115 b_value = b->consumed_threshold_bytes.value;
116 if (a_value != b_value) {
117 goto end;
118 }
119 }
120
a0377dfe
FD
121 LTTNG_ASSERT(a->session_name);
122 LTTNG_ASSERT(b->session_name);
821d5e92 123 if (strcmp(a->session_name, b->session_name)) {
e8360425
JD
124 goto end;
125 }
126
127 is_equal = true;
128end:
129 return is_equal;
130}
131
28ab034a
JG
132static enum lttng_error_code
133lttng_condition_session_consumed_size_mi_serialize(const struct lttng_condition *condition,
134 struct mi_writer *writer)
6a751b95
JR
135{
136 int ret;
137 enum lttng_error_code ret_code;
138 enum lttng_condition_status status;
cd9adb8b 139 const char *session_name = nullptr;
6a751b95
JR
140 uint64_t threshold_bytes;
141
a0377dfe
FD
142 LTTNG_ASSERT(condition);
143 LTTNG_ASSERT(writer);
144 LTTNG_ASSERT(IS_CONSUMED_SIZE_CONDITION(condition));
6a751b95 145
28ab034a 146 status = lttng_condition_session_consumed_size_get_session_name(condition, &session_name);
a0377dfe
FD
147 LTTNG_ASSERT(status == LTTNG_CONDITION_STATUS_OK);
148 LTTNG_ASSERT(session_name);
6a751b95 149
28ab034a 150 status = lttng_condition_session_consumed_size_get_threshold(condition, &threshold_bytes);
a0377dfe 151 LTTNG_ASSERT(status == LTTNG_CONDITION_STATUS_OK);
6a751b95
JR
152
153 /* Open condition session consumed size element. */
154 ret = mi_lttng_writer_open_element(writer,
28ab034a 155 mi_lttng_element_condition_session_consumed_size);
6a751b95
JR
156 if (ret) {
157 goto mi_error;
158 }
159
160 /* Session name. */
161 ret = mi_lttng_writer_write_element_string(
28ab034a 162 writer, mi_lttng_element_session_name, session_name);
6a751b95
JR
163 if (ret) {
164 goto mi_error;
165 }
166
167 /* Threshold in bytes. */
28ab034a
JG
168 ret = mi_lttng_writer_write_element_unsigned_int(
169 writer, mi_lttng_element_condition_threshold_bytes, threshold_bytes);
6a751b95
JR
170 if (ret) {
171 goto mi_error;
172 }
173
174 /* Close condition session consumed size element. */
175 ret = mi_lttng_writer_close_element(writer);
176 if (ret) {
177 goto mi_error;
178 }
179
180 ret_code = LTTNG_OK;
181 goto end;
182
183mi_error:
184 ret_code = LTTNG_ERR_MI_IO_FAIL;
185end:
186 return ret_code;
187}
188
e8360425
JD
189struct lttng_condition *lttng_condition_session_consumed_size_create(void)
190{
191 struct lttng_condition_session_consumed_size *condition;
192
64803277 193 condition = zmalloc<lttng_condition_session_consumed_size>();
e8360425 194 if (!condition) {
cd9adb8b 195 return nullptr;
e8360425
JD
196 }
197
198 lttng_condition_init(&condition->parent, LTTNG_CONDITION_TYPE_SESSION_CONSUMED_SIZE);
199 condition->parent.validate = lttng_condition_session_consumed_size_validate;
200 condition->parent.serialize = lttng_condition_session_consumed_size_serialize;
201 condition->parent.equal = lttng_condition_session_consumed_size_is_equal;
202 condition->parent.destroy = lttng_condition_session_consumed_size_destroy;
6a751b95 203 condition->parent.mi_serialize = lttng_condition_session_consumed_size_mi_serialize;
e8360425
JD
204 return &condition->parent;
205}
206
28ab034a
JG
207static ssize_t init_condition_from_payload(struct lttng_condition *condition,
208 struct lttng_payload_view *src_view)
e8360425
JD
209{
210 ssize_t ret, condition_size;
211 enum lttng_condition_status status;
e8360425 212 const char *session_name;
3e6e0df2
JG
213 struct lttng_buffer_view session_name_view;
214 const struct lttng_condition_session_consumed_size_comm *condition_comm;
28ab034a
JG
215 struct lttng_payload_view condition_comm_view =
216 lttng_payload_view_from_view(src_view, 0, sizeof(*condition_comm));
e8360425 217
3e6e0df2 218 if (!lttng_payload_view_is_valid(&condition_comm_view)) {
e8360425
JD
219 ERR("Failed to initialize from malformed condition buffer: buffer too short to contain header");
220 ret = -1;
221 goto end;
222 }
223
3e6e0df2 224 condition_comm = (typeof(condition_comm)) condition_comm_view.buffer.data;
28ab034a
JG
225 session_name_view = lttng_buffer_view_from_view(
226 &src_view->buffer, sizeof(*condition_comm), condition_comm->session_name_len);
e8360425
JD
227
228 if (condition_comm->session_name_len > LTTNG_NAME_MAX) {
229 ERR("Failed to initialize from malformed condition buffer: name exceeds LTTNG_MAX_NAME");
230 ret = -1;
231 goto end;
232 }
233
3e6e0df2 234 if (!lttng_buffer_view_is_valid(&session_name_view)) {
e8360425
JD
235 ERR("Failed to initialize from malformed condition buffer: buffer too short to contain element names");
236 ret = -1;
237 goto end;
238 }
239
28ab034a
JG
240 status = lttng_condition_session_consumed_size_set_threshold(
241 condition, condition_comm->consumed_threshold_bytes);
e8360425 242 if (status != LTTNG_CONDITION_STATUS_OK) {
9ef5b6be 243 ERR("Failed to initialize session consumed size condition threshold");
e8360425
JD
244 ret = -1;
245 goto end;
246 }
247
3e6e0df2 248 session_name = session_name_view.data;
e8360425
JD
249 if (*(session_name + condition_comm->session_name_len - 1) != '\0') {
250 ERR("Malformed session name encountered in condition buffer");
251 ret = -1;
252 goto end;
253 }
254
28ab034a 255 status = lttng_condition_session_consumed_size_set_session_name(condition, session_name);
e8360425 256 if (status != LTTNG_CONDITION_STATUS_OK) {
9ef5b6be 257 ERR("Failed to set session consumed size condition's session name");
e8360425
JD
258 ret = -1;
259 goto end;
260 }
261
262 if (!lttng_condition_validate(condition)) {
263 ret = -1;
264 goto end;
265 }
266
28ab034a 267 condition_size = sizeof(*condition_comm) + (ssize_t) condition_comm->session_name_len;
e8360425
JD
268 ret = condition_size;
269end:
270 return ret;
271}
272
28ab034a
JG
273ssize_t
274lttng_condition_session_consumed_size_create_from_payload(struct lttng_payload_view *view,
275 struct lttng_condition **_condition)
e8360425
JD
276{
277 ssize_t ret;
28ab034a 278 struct lttng_condition *condition = lttng_condition_session_consumed_size_create();
e8360425
JD
279
280 if (!_condition || !condition) {
281 ret = -1;
282 goto error;
283 }
284
c0a66c84 285 ret = init_condition_from_payload(condition, view);
e8360425
JD
286 if (ret < 0) {
287 goto error;
288 }
289
290 *_condition = condition;
291 return ret;
292error:
293 lttng_condition_destroy(condition);
294 return ret;
295}
296
28ab034a
JG
297static struct lttng_evaluation *
298create_evaluation_from_payload(const struct lttng_payload_view *view)
e8360425
JD
299{
300 const struct lttng_evaluation_session_consumed_size_comm *comm =
28ab034a 301 (typeof(comm)) view->buffer.data;
cd9adb8b 302 struct lttng_evaluation *evaluation = nullptr;
e8360425 303
c0a66c84 304 if (view->buffer.size < sizeof(*comm)) {
e8360425
JD
305 goto end;
306 }
307
28ab034a 308 evaluation = lttng_evaluation_session_consumed_size_create(comm->session_consumed);
e8360425
JD
309end:
310 return evaluation;
311}
312
28ab034a
JG
313ssize_t
314lttng_evaluation_session_consumed_size_create_from_payload(struct lttng_payload_view *view,
315 struct lttng_evaluation **_evaluation)
e8360425
JD
316{
317 ssize_t ret;
cd9adb8b 318 struct lttng_evaluation *evaluation = nullptr;
e8360425
JD
319
320 if (!_evaluation) {
321 ret = -1;
322 goto error;
323 }
324
c0a66c84 325 evaluation = create_evaluation_from_payload(view);
e8360425
JD
326 if (!evaluation) {
327 ret = -1;
328 goto error;
329 }
330
331 *_evaluation = evaluation;
332 ret = sizeof(struct lttng_evaluation_session_consumed_size_comm);
333 return ret;
334error:
335 lttng_evaluation_destroy(evaluation);
336 return ret;
337}
338
339enum lttng_condition_status
28ab034a
JG
340lttng_condition_session_consumed_size_get_threshold(const struct lttng_condition *condition,
341 uint64_t *consumed_threshold_bytes)
e8360425
JD
342{
343 struct lttng_condition_session_consumed_size *consumed;
344 enum lttng_condition_status status = LTTNG_CONDITION_STATUS_OK;
345
346 if (!condition || !IS_CONSUMED_SIZE_CONDITION(condition) || !consumed_threshold_bytes) {
347 status = LTTNG_CONDITION_STATUS_INVALID;
348 goto end;
349 }
350
0114db0e 351 consumed = lttng::utils::container_of(condition,
28ab034a 352 &lttng_condition_session_consumed_size::parent);
e8360425
JD
353 if (!consumed->consumed_threshold_bytes.set) {
354 status = LTTNG_CONDITION_STATUS_UNSET;
355 goto end;
356 }
357 *consumed_threshold_bytes = consumed->consumed_threshold_bytes.value;
358end:
359 return status;
360}
361
362enum lttng_condition_status
28ab034a
JG
363lttng_condition_session_consumed_size_set_threshold(struct lttng_condition *condition,
364 uint64_t consumed_threshold_bytes)
e8360425
JD
365{
366 struct lttng_condition_session_consumed_size *consumed;
367 enum lttng_condition_status status = LTTNG_CONDITION_STATUS_OK;
368
369 if (!condition || !IS_CONSUMED_SIZE_CONDITION(condition)) {
370 status = LTTNG_CONDITION_STATUS_INVALID;
371 goto end;
372 }
373
0114db0e 374 consumed = lttng::utils::container_of(condition,
28ab034a 375 &lttng_condition_session_consumed_size::parent);
e8360425
JD
376 consumed->consumed_threshold_bytes.set = true;
377 consumed->consumed_threshold_bytes.value = consumed_threshold_bytes;
378end:
379 return status;
380}
381
382enum lttng_condition_status
28ab034a
JG
383lttng_condition_session_consumed_size_get_session_name(const struct lttng_condition *condition,
384 const char **session_name)
e8360425
JD
385{
386 struct lttng_condition_session_consumed_size *consumed;
387 enum lttng_condition_status status = LTTNG_CONDITION_STATUS_OK;
388
389 if (!condition || !IS_CONSUMED_SIZE_CONDITION(condition) || !session_name) {
390 status = LTTNG_CONDITION_STATUS_INVALID;
391 goto end;
392 }
393
0114db0e 394 consumed = lttng::utils::container_of(condition,
28ab034a 395 &lttng_condition_session_consumed_size::parent);
e8360425
JD
396 if (!consumed->session_name) {
397 status = LTTNG_CONDITION_STATUS_UNSET;
398 goto end;
399 }
400 *session_name = consumed->session_name;
401end:
402 return status;
403}
404
405enum lttng_condition_status
28ab034a
JG
406lttng_condition_session_consumed_size_set_session_name(struct lttng_condition *condition,
407 const char *session_name)
e8360425
JD
408{
409 char *session_name_copy;
410 struct lttng_condition_session_consumed_size *consumed;
411 enum lttng_condition_status status = LTTNG_CONDITION_STATUS_OK;
412
28ab034a
JG
413 if (!condition || !IS_CONSUMED_SIZE_CONDITION(condition) || !session_name ||
414 strlen(session_name) == 0) {
e8360425
JD
415 status = LTTNG_CONDITION_STATUS_INVALID;
416 goto end;
417 }
418
0114db0e 419 consumed = lttng::utils::container_of(condition,
28ab034a 420 &lttng_condition_session_consumed_size::parent);
e8360425
JD
421 session_name_copy = strdup(session_name);
422 if (!session_name_copy) {
423 status = LTTNG_CONDITION_STATUS_ERROR;
424 goto end;
425 }
426
427 if (consumed->session_name) {
428 free(consumed->session_name);
429 }
430 consumed->session_name = session_name_copy;
431end:
432 return status;
433}
434
28ab034a
JG
435static int
436lttng_evaluation_session_consumed_size_serialize(const struct lttng_evaluation *evaluation,
437 struct lttng_payload *payload)
e8360425 438{
e8360425 439 struct lttng_evaluation_session_consumed_size *consumed;
3647288f 440 struct lttng_evaluation_session_consumed_size_comm comm;
e8360425 441
0114db0e 442 consumed = lttng::utils::container_of(evaluation,
28ab034a 443 &lttng_evaluation_session_consumed_size::parent);
3647288f 444 comm.session_consumed = consumed->session_consumed;
28ab034a 445 return lttng_dynamic_buffer_append(&payload->buffer, &comm, sizeof(comm));
e8360425
JD
446}
447
28ab034a 448static void lttng_evaluation_session_consumed_size_destroy(struct lttng_evaluation *evaluation)
e8360425
JD
449{
450 struct lttng_evaluation_session_consumed_size *consumed;
451
0114db0e 452 consumed = lttng::utils::container_of(evaluation,
28ab034a 453 &lttng_evaluation_session_consumed_size::parent);
e8360425
JD
454 free(consumed);
455}
456
28ab034a 457struct lttng_evaluation *lttng_evaluation_session_consumed_size_create(uint64_t consumed)
e8360425
JD
458{
459 struct lttng_evaluation_session_consumed_size *consumed_eval;
460
64803277 461 consumed_eval = zmalloc<lttng_evaluation_session_consumed_size>();
e8360425
JD
462 if (!consumed_eval) {
463 goto end;
464 }
465
5f2c1c0f 466 consumed_eval->parent.type = LTTNG_CONDITION_TYPE_SESSION_CONSUMED_SIZE;
e8360425
JD
467 consumed_eval->session_consumed = consumed;
468 consumed_eval->parent.serialize = lttng_evaluation_session_consumed_size_serialize;
469 consumed_eval->parent.destroy = lttng_evaluation_session_consumed_size_destroy;
470end:
471 return &consumed_eval->parent;
472}
473
474enum lttng_evaluation_status
28ab034a
JG
475lttng_evaluation_session_consumed_size_get_consumed_size(const struct lttng_evaluation *evaluation,
476 uint64_t *session_consumed)
e8360425
JD
477{
478 struct lttng_evaluation_session_consumed_size *consumed;
479 enum lttng_evaluation_status status = LTTNG_EVALUATION_STATUS_OK;
480
28ab034a 481 if (!evaluation || !IS_CONSUMED_SIZE_EVALUATION(evaluation) || !session_consumed) {
e8360425
JD
482 status = LTTNG_EVALUATION_STATUS_INVALID;
483 goto end;
484 }
485
0114db0e 486 consumed = lttng::utils::container_of(evaluation,
28ab034a 487 &lttng_evaluation_session_consumed_size::parent);
e8360425
JD
488 *session_consumed = consumed->session_consumed;
489end:
490 return status;
491}
This page took 0.073323 seconds and 4 git commands to generate.