2 * Copyright (C) 2020 Francis Deslauriers <francis.deslauriers@efficios.com>
4 * SPDX-License-Identifier: LGPL-2.1-only
8 #include "condition-internal.hpp"
10 #include <common/hashtable/hashtable.hpp>
11 #include <common/hashtable/utils.hpp>
13 #include <lttng/condition/buffer-usage-internal.hpp>
14 #include <lttng/condition/condition-internal.hpp>
15 #include <lttng/condition/condition.h>
16 #include <lttng/condition/event-rule-matches-internal.hpp>
17 #include <lttng/condition/event-rule-matches.h>
18 #include <lttng/condition/session-consumed-size-internal.hpp>
19 #include <lttng/condition/session-rotation-internal.hpp>
20 #include <lttng/event-rule/event-rule-internal.hpp>
22 static unsigned long lttng_condition_buffer_usage_hash(const struct lttng_condition
*_condition
)
25 unsigned long condition_type
;
26 struct lttng_condition_buffer_usage
*condition
;
28 condition
= lttng::utils::container_of(_condition
, <tng_condition_buffer_usage::parent
);
30 condition_type
= (unsigned long) condition
->parent
.type
;
31 hash
= hash_key_ulong((void *) condition_type
, lttng_ht_seed
);
32 if (condition
->session_name
) {
33 hash
^= hash_key_str(condition
->session_name
, lttng_ht_seed
);
35 if (condition
->channel_name
) {
36 hash
^= hash_key_str(condition
->channel_name
, lttng_ht_seed
);
38 if (condition
->domain
.set
) {
39 hash
^= hash_key_ulong((void *) condition
->domain
.type
, lttng_ht_seed
);
41 if (condition
->threshold_ratio
.set
) {
42 hash
^= hash_key_u64(&condition
->threshold_ratio
.value
, lttng_ht_seed
);
43 } else if (condition
->threshold_bytes
.set
) {
46 val
= condition
->threshold_bytes
.value
;
47 hash
^= hash_key_u64(&val
, lttng_ht_seed
);
53 lttng_condition_session_consumed_size_hash(const struct lttng_condition
*_condition
)
56 const unsigned long condition_type
=
57 (unsigned long) LTTNG_CONDITION_TYPE_SESSION_CONSUMED_SIZE
;
58 struct lttng_condition_session_consumed_size
*condition
;
61 condition
= lttng::utils::container_of(_condition
,
62 <tng_condition_session_consumed_size::parent
);
64 hash
= hash_key_ulong((void *) condition_type
, lttng_ht_seed
);
65 if (condition
->session_name
) {
66 hash
^= hash_key_str(condition
->session_name
, lttng_ht_seed
);
68 val
= condition
->consumed_threshold_bytes
.value
;
69 hash
^= hash_key_u64(&val
, lttng_ht_seed
);
73 static unsigned long lttng_condition_session_rotation_hash(const struct lttng_condition
*_condition
)
75 unsigned long hash
, condition_type
;
76 struct lttng_condition_session_rotation
*condition
;
79 lttng::utils::container_of(_condition
, <tng_condition_session_rotation::parent
);
80 condition_type
= (unsigned long) condition
->parent
.type
;
81 hash
= hash_key_ulong((void *) condition_type
, lttng_ht_seed
);
82 LTTNG_ASSERT(condition
->session_name
);
83 hash
^= hash_key_str(condition
->session_name
, lttng_ht_seed
);
88 lttng_condition_event_rule_matches_hash(const struct lttng_condition
*condition
)
90 unsigned long hash
, condition_type
;
91 enum lttng_condition_status condition_status
;
92 const struct lttng_event_rule
*event_rule
;
94 condition_type
= (unsigned long) condition
->type
;
95 condition_status
= lttng_condition_event_rule_matches_get_rule(condition
, &event_rule
);
96 LTTNG_ASSERT(condition_status
== LTTNG_CONDITION_STATUS_OK
);
98 hash
= hash_key_ulong((void *) condition_type
, lttng_ht_seed
);
99 return hash
^ lttng_event_rule_hash(event_rule
);
103 * The lttng_condition hashing code is kept in this file (rather than
104 * condition.c) since it makes use of GPLv2 code (hashtable utils), which we
105 * don't want to link in liblttng-ctl.
107 unsigned long lttng_condition_hash(const struct lttng_condition
*condition
)
109 switch (condition
->type
) {
110 case LTTNG_CONDITION_TYPE_BUFFER_USAGE_LOW
:
111 case LTTNG_CONDITION_TYPE_BUFFER_USAGE_HIGH
:
112 return lttng_condition_buffer_usage_hash(condition
);
113 case LTTNG_CONDITION_TYPE_SESSION_CONSUMED_SIZE
:
114 return lttng_condition_session_consumed_size_hash(condition
);
115 case LTTNG_CONDITION_TYPE_SESSION_ROTATION_ONGOING
:
116 case LTTNG_CONDITION_TYPE_SESSION_ROTATION_COMPLETED
:
117 return lttng_condition_session_rotation_hash(condition
);
118 case LTTNG_CONDITION_TYPE_EVENT_RULE_MATCHES
:
119 return lttng_condition_event_rule_matches_hash(condition
);
125 struct lttng_condition
*lttng_condition_copy(const struct lttng_condition
*condition
)
128 struct lttng_payload copy_buffer
;
129 struct lttng_condition
*copy
= nullptr;
131 lttng_payload_init(©_buffer
);
133 ret
= lttng_condition_serialize(condition
, ©_buffer
);
139 struct lttng_payload_view view
=
140 lttng_payload_view_from_payload(©_buffer
, 0, -1);
142 ret
= lttng_condition_create_from_payload(&view
, ©
);
150 lttng_payload_reset(©_buffer
);