X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fcondition-internal.c;h=caab613aa733c8e534e36674f837e21561808b37;hb=a0377dfefe40662ba7d68617bce6ff467114136c;hp=dc21ca3afbc5931a09850b5625e7784d3984b52b;hpb=e98a976a8b6dbd488b1277a48e7775c76df6c79f;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/condition-internal.c b/src/bin/lttng-sessiond/condition-internal.c index dc21ca3af..caab613aa 100644 --- a/src/bin/lttng-sessiond/condition-internal.c +++ b/src/bin/lttng-sessiond/condition-internal.c @@ -13,9 +13,10 @@ #include #include #include -#include -#include +#include +#include #include +#include #include "condition-internal.h" static @@ -43,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; @@ -89,24 +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_event_rule_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_event_rule_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,41 @@ 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_EVENT_RULE_HIT: - return lttng_condition_event_rule_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(); } } + +LTTNG_HIDDEN +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; +}