2 * Copyright (C) 2017 - Jérémie Galarneau <jeremie.galarneau@efficios.com>
4 * This library is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU Lesser General Public License, version 2.1 only,
6 * as published by the Free Software Foundation.
8 * This library is distributed in the hope that it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this library; if not, write to the Free Software Foundation,
15 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 #include <lttng/condition/condition-internal.h>
19 #include <lttng/condition/buffer-usage-internal.h>
20 #include <lttng/condition/session-consumed-size-internal.h>
21 #include <lttng/condition/session-rotation-internal.h>
22 #include <common/macros.h>
23 #include <common/error.h>
24 #include <common/dynamic-buffer.h>
25 #include <common/buffer-view.h>
29 enum lttng_condition_type
lttng_condition_get_type(
30 const struct lttng_condition
*condition
)
32 return condition
? condition
->type
: LTTNG_CONDITION_TYPE_UNKNOWN
;
35 void lttng_condition_destroy(struct lttng_condition
*condition
)
41 assert(condition
->destroy
);
42 condition
->destroy(condition
);
46 bool lttng_condition_validate(const struct lttng_condition
*condition
)
55 if (!condition
->validate
) {
56 /* Sub-class guarantees that it can never be invalid. */
61 valid
= condition
->validate(condition
);
67 int lttng_condition_serialize(const struct lttng_condition
*condition
,
68 struct lttng_dynamic_buffer
*buf
)
71 struct lttng_condition_comm condition_comm
= { 0 };
78 condition_comm
.condition_type
= (int8_t) condition
->type
;
80 ret
= lttng_dynamic_buffer_append(buf
, &condition_comm
,
81 sizeof(condition_comm
));
86 ret
= condition
->serialize(condition
, buf
);
95 bool lttng_condition_is_equal(const struct lttng_condition
*a
,
96 const struct lttng_condition
*b
)
98 bool is_equal
= false;
104 if (a
->type
!= b
->type
) {
113 is_equal
= a
->equal
? a
->equal(a
, b
) : true;
119 ssize_t
lttng_condition_create_from_buffer(
120 const struct lttng_buffer_view
*buffer
,
121 struct lttng_condition
**condition
)
123 ssize_t ret
, condition_size
= 0;
124 const struct lttng_condition_comm
*condition_comm
;
125 condition_create_from_buffer_cb create_from_buffer
= NULL
;
127 if (!buffer
|| !condition
) {
132 DBG("Deserializing condition from buffer");
133 condition_comm
= (const struct lttng_condition_comm
*) buffer
->data
;
134 condition_size
+= sizeof(*condition_comm
);
136 switch ((enum lttng_condition_type
) condition_comm
->condition_type
) {
137 case LTTNG_CONDITION_TYPE_BUFFER_USAGE_LOW
:
138 create_from_buffer
= lttng_condition_buffer_usage_low_create_from_buffer
;
140 case LTTNG_CONDITION_TYPE_BUFFER_USAGE_HIGH
:
141 create_from_buffer
= lttng_condition_buffer_usage_high_create_from_buffer
;
143 case LTTNG_CONDITION_TYPE_SESSION_CONSUMED_SIZE
:
144 create_from_buffer
= lttng_condition_session_consumed_size_create_from_buffer
;
146 case LTTNG_CONDITION_TYPE_SESSION_ROTATION_ONGOING
:
147 create_from_buffer
= lttng_condition_session_rotation_ongoing_create_from_buffer
;
149 case LTTNG_CONDITION_TYPE_SESSION_ROTATION_COMPLETED
:
150 create_from_buffer
= lttng_condition_session_rotation_completed_create_from_buffer
;
153 ERR("Attempted to create condition of unknown type (%i)",
154 (int) condition_comm
->condition_type
);
159 if (create_from_buffer
) {
160 const struct lttng_buffer_view view
=
161 lttng_buffer_view_from_view(buffer
,
162 sizeof(*condition_comm
), -1);
164 ret
= create_from_buffer(&view
, condition
);
168 condition_size
+= ret
;
174 ret
= condition_size
;
180 void lttng_condition_init(struct lttng_condition
*condition
,
181 enum lttng_condition_type type
)
183 condition
->type
= type
;