X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fcondition-internal.c;h=dd9c244b3253ac68694799348066bc048daa1274;hp=07b32f86d611367820e743ebea9a754b3ffe064c;hb=3a5f70173aa04d11ccb22694d5d31a702cad33ab;hpb=e393070aaad23313daae844ff87043babaae69e7 diff --git a/src/bin/lttng-sessiond/condition-internal.c b/src/bin/lttng-sessiond/condition-internal.c index 07b32f86d..dd9c244b3 100644 --- a/src/bin/lttng-sessiond/condition-internal.c +++ b/src/bin/lttng-sessiond/condition-internal.c @@ -13,10 +13,10 @@ #include #include #include -#include -#include +#include +#include #include -#include +#include #include "condition-internal.h" static @@ -44,10 +44,7 @@ unsigned long lttng_condition_buffer_usage_hash( lttng_ht_seed); } if (condition->threshold_ratio.set) { - uint64_t val; - - val = condition->threshold_ratio.value * (double) UINT32_MAX; - hash ^= hash_key_u64(&val, lttng_ht_seed); + hash ^= hash_key_u64(&condition->threshold_ratio.value, lttng_ht_seed); } else if (condition->threshold_bytes.set) { uint64_t val; @@ -90,23 +87,22 @@ unsigned long lttng_condition_session_rotation_hash( struct lttng_condition_session_rotation, parent); condition_type = (unsigned long) condition->parent.type; hash = hash_key_ulong((void *) condition_type, lttng_ht_seed); - assert(condition->session_name); + LTTNG_ASSERT(condition->session_name); hash ^= hash_key_str(condition->session_name, lttng_ht_seed); return hash; } -static -unsigned long lttng_condition_on_event_hash( - const struct lttng_condition *condition) +static unsigned long lttng_condition_event_rule_matches_hash( + const struct lttng_condition *condition) { unsigned long hash, condition_type; enum lttng_condition_status condition_status; const struct lttng_event_rule *event_rule; condition_type = (unsigned long) condition->type; - condition_status = lttng_condition_on_event_get_rule(condition, - &event_rule); - assert(condition_status == LTTNG_CONDITION_STATUS_OK); + condition_status = lttng_condition_event_rule_matches_get_rule( + condition, &event_rule); + LTTNG_ASSERT(condition_status == LTTNG_CONDITION_STATUS_OK); hash = hash_key_ulong((void *) condition_type, lttng_ht_seed); return hash ^ lttng_event_rule_hash(event_rule); @@ -128,10 +124,40 @@ unsigned long lttng_condition_hash(const struct lttng_condition *condition) case LTTNG_CONDITION_TYPE_SESSION_ROTATION_ONGOING: case LTTNG_CONDITION_TYPE_SESSION_ROTATION_COMPLETED: return lttng_condition_session_rotation_hash(condition); - case LTTNG_CONDITION_TYPE_ON_EVENT: - return lttng_condition_on_event_hash(condition); + case LTTNG_CONDITION_TYPE_EVENT_RULE_MATCHES: + return lttng_condition_event_rule_matches_hash(condition); default: - //ERR("[notification-thread] Unexpected condition type caught"); abort(); } } + +struct lttng_condition *lttng_condition_copy(const struct lttng_condition *condition) +{ + int ret; + struct lttng_payload copy_buffer; + struct lttng_condition *copy = NULL; + + lttng_payload_init(©_buffer); + + ret = lttng_condition_serialize(condition, ©_buffer); + if (ret < 0) { + goto end; + } + + { + struct lttng_payload_view view = + lttng_payload_view_from_payload( + ©_buffer, 0, -1); + + ret = lttng_condition_create_from_payload( + &view, ©); + if (ret < 0) { + copy = NULL; + goto end; + } + } + +end: + lttng_payload_reset(©_buffer); + return copy; +}