X-Git-Url: https://git.liburcu.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Ferror-query.c;h=38f47c224da98d67c45c28a9019dab19cfadfcb2;hp=0be04fa13b414f05a0c77638a37e5ac96aad4704;hb=63dd3d7b5b0979c4b11a6bb8d0e4155120482977;hpb=a8940c5eb1046e84c10bb0cf72c0f2575a8c9e4e diff --git a/src/common/error-query.c b/src/common/error-query.c index 0be04fa13..38f47c224 100644 --- a/src/common/error-query.c +++ b/src/common/error-query.c @@ -36,6 +36,12 @@ struct lttng_error_query_trigger { struct lttng_trigger *trigger; }; +struct lttng_error_query_condition { + struct lttng_error_query parent; + /* Mutable only because of the reference count. */ + struct lttng_trigger *trigger; +}; + struct lttng_error_query_action { struct lttng_error_query parent; /* Mutable only because of the reference count. */ @@ -111,6 +117,37 @@ end: return query ? &query->parent : NULL; } +struct lttng_error_query *lttng_error_query_condition_create( + const struct lttng_trigger *trigger) +{ + struct lttng_error_query_condition *query = NULL; + struct lttng_trigger *trigger_copy = NULL; + + if (!trigger) { + goto end; + } + + trigger_copy = lttng_trigger_copy(trigger); + if (!trigger_copy) { + goto end; + } + + query = zmalloc(sizeof(*query)); + if (!query) { + PERROR("Failed to allocate condition error query"); + goto error; + } + + query->parent.target_type = LTTNG_ERROR_QUERY_TARGET_TYPE_CONDITION; + query->trigger = trigger_copy; + trigger_copy = NULL; + +error: + lttng_trigger_put(trigger_copy); +end: + return query ? &query->parent : NULL; +} + static struct lttng_action *get_trigger_action_from_path( struct lttng_trigger *trigger, @@ -605,6 +642,28 @@ end: return ret; } +static +int lttng_error_query_condition_serialize(const struct lttng_error_query *query, + struct lttng_payload *payload) +{ + int ret; + const struct lttng_error_query_condition *query_trigger = + container_of(query, typeof(*query_trigger), parent); + + if (!lttng_trigger_validate(query_trigger->trigger)) { + ret = -1; + goto end; + } + + ret = lttng_trigger_serialize(query_trigger->trigger, payload); + if (ret) { + goto end; + } + +end: + return ret; +} + static int lttng_error_query_action_serialize(const struct lttng_error_query *query, struct lttng_payload *payload) @@ -649,6 +708,16 @@ const struct lttng_trigger *lttng_error_query_trigger_borrow_target( return query_trigger->trigger; } +LTTNG_HIDDEN +const struct lttng_trigger *lttng_error_query_condition_borrow_target( + const struct lttng_error_query *query) +{ + const struct lttng_error_query_condition *query_trigger = + container_of(query, typeof(*query_trigger), parent); + + return query_trigger->trigger; +} + LTTNG_HIDDEN const struct lttng_trigger *lttng_error_query_action_borrow_trigger_target( const struct lttng_error_query *query) @@ -694,6 +763,13 @@ int lttng_error_query_serialize(const struct lttng_error_query *query, goto end; } + break; + case LTTNG_ERROR_QUERY_TARGET_TYPE_CONDITION: + ret = lttng_error_query_condition_serialize(query, payload); + if (ret) { + goto end; + } + break; case LTTNG_ERROR_QUERY_TARGET_TYPE_ACTION: ret = lttng_error_query_action_serialize(query, payload); @@ -758,6 +834,35 @@ ssize_t lttng_error_query_create_from_payload(struct lttng_payload_view *view, break; } + case LTTNG_ERROR_QUERY_TARGET_TYPE_CONDITION: + { + ssize_t trigger_used_size; + struct lttng_payload_view trigger_view = + lttng_payload_view_from_view( + view, used_size, -1); + + if (!lttng_payload_view_is_valid(&trigger_view)) { + used_size = -1; + goto end; + } + + trigger_used_size = lttng_trigger_create_from_payload( + &trigger_view, &trigger); + if (trigger_used_size < 0) { + used_size = -1; + goto end; + } + + used_size += trigger_used_size; + + *query = lttng_error_query_condition_create(trigger); + if (!*query) { + used_size = -1; + goto end; + } + + break; + } case LTTNG_ERROR_QUERY_TARGET_TYPE_ACTION: { struct lttng_action_path *action_path = NULL;