X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Fevent-rule%2Fuser-tracepoint.c;h=8fa2eeb49d06c63e3b4674df396339555dce4353;hb=a0377dfefe40662ba7d68617bce6ff467114136c;hp=45b7eda257faae2807ac1c3489c2fb8ceef69703;hpb=0a23a07d7db04d7e9f1fcf08a5824fccbf2b53da;p=lttng-tools.git diff --git a/src/common/event-rule/user-tracepoint.c b/src/common/event-rule/user-tracepoint.c index 45b7eda25..8fa2eeb49 100644 --- a/src/common/event-rule/user-tracepoint.c +++ b/src/common/event-rule/user-tracepoint.c @@ -5,21 +5,21 @@ * */ -#include #include #include +#include +#include #include +#include #include -#include #include +#include #include -#include -#include #include #include #include -#include #include +#include #define IS_USER_TRACEPOINT_EVENT_RULE(rule) \ (lttng_event_rule_get_type(rule) == LTTNG_EVENT_RULE_TYPE_USER_TRACEPOINT) @@ -94,7 +94,7 @@ static int lttng_event_rule_user_tracepoint_serialize( rule, struct lttng_event_rule_user_tracepoint, parent); status = lttng_event_rule_user_tracepoint_get_name_pattern_exclusion_count(rule, &exclusion_count); - assert(status == LTTNG_EVENT_RULE_STATUS_OK); + LTTNG_ASSERT(status == LTTNG_EVENT_RULE_STATUS_OK); pattern_len = strlen(tracepoint->pattern) + 1; @@ -111,7 +111,7 @@ static int lttng_event_rule_user_tracepoint_serialize( status = lttng_event_rule_user_tracepoint_get_name_pattern_exclusion_at_index( rule, i, &exclusion); - assert(status == LTTNG_EVENT_RULE_STATUS_OK); + LTTNG_ASSERT(status == LTTNG_EVENT_RULE_STATUS_OK); /* Length field. */ exclusions_len += sizeof(uint32_t); @@ -159,7 +159,7 @@ static int lttng_event_rule_user_tracepoint_serialize( status = lttng_event_rule_user_tracepoint_get_name_pattern_exclusion_at_index( rule, i, &exclusion); - assert(status == LTTNG_EVENT_RULE_STATUS_OK); + LTTNG_ASSERT(status == LTTNG_EVENT_RULE_STATUS_OK); len = strlen(exclusion) + 1; /* Append exclusion length, includes the null terminator. */ @@ -181,7 +181,7 @@ static int lttng_event_rule_user_tracepoint_serialize( exclusions_appended_len += len; } - assert(exclusions_len == exclusions_appended_len); + LTTNG_ASSERT(exclusions_len == exclusions_appended_len); end: return ret; @@ -201,9 +201,9 @@ static bool lttng_event_rule_user_tracepoint_is_equal( b = container_of(_b, struct lttng_event_rule_user_tracepoint, parent); status = lttng_event_rule_user_tracepoint_get_name_pattern_exclusion_count(_a, &count_a); - assert(status == LTTNG_EVENT_RULE_STATUS_OK); + LTTNG_ASSERT(status == LTTNG_EVENT_RULE_STATUS_OK); status = lttng_event_rule_user_tracepoint_get_name_pattern_exclusion_count(_b, &count_b); - assert(status == LTTNG_EVENT_RULE_STATUS_OK); + LTTNG_ASSERT(status == LTTNG_EVENT_RULE_STATUS_OK); /* Quick checks. */ if (count_a != count_b) { @@ -215,8 +215,8 @@ static bool lttng_event_rule_user_tracepoint_is_equal( } /* Long check. */ - assert(a->pattern); - assert(b->pattern); + LTTNG_ASSERT(a->pattern); + LTTNG_ASSERT(b->pattern); if (strcmp(a->pattern, b->pattern)) { goto end; } @@ -240,10 +240,10 @@ static bool lttng_event_rule_user_tracepoint_is_equal( status = lttng_event_rule_user_tracepoint_get_name_pattern_exclusion_at_index( _a, i, &exclusion_a); - assert(status == LTTNG_EVENT_RULE_STATUS_OK); + LTTNG_ASSERT(status == LTTNG_EVENT_RULE_STATUS_OK); status = lttng_event_rule_user_tracepoint_get_name_pattern_exclusion_at_index( _b, i, &exclusion_b); - assert(status == LTTNG_EVENT_RULE_STATUS_OK); + LTTNG_ASSERT(status == LTTNG_EVENT_RULE_STATUS_OK); if (strcmp(exclusion_a, exclusion_b)) { goto end; } @@ -266,7 +266,7 @@ lttng_event_rule_user_tracepoint_generate_filter_bytecode( const char *filter; struct lttng_bytecode *bytecode = NULL; - assert(rule); + LTTNG_ASSERT(rule); tracepoint = container_of( rule, struct lttng_event_rule_user_tracepoint, parent); @@ -322,7 +322,7 @@ static const char *lttng_event_rule_user_tracepoint_get_internal_filter( { struct lttng_event_rule_user_tracepoint *tracepoint; - assert(rule); + LTTNG_ASSERT(rule); tracepoint = container_of( rule, struct lttng_event_rule_user_tracepoint, parent); return tracepoint->internal_filter.filter; @@ -334,7 +334,7 @@ lttng_event_rule_user_tracepoint_get_internal_filter_bytecode( { struct lttng_event_rule_user_tracepoint *tracepoint; - assert(rule); + LTTNG_ASSERT(rule); tracepoint = container_of( rule, struct lttng_event_rule_user_tracepoint, parent); return tracepoint->internal_filter.bytecode; @@ -350,11 +350,11 @@ lttng_event_rule_user_tracepoint_generate_exclusions( enum lttng_event_rule_status event_rule_status; enum lttng_event_rule_generate_exclusions_status ret_status; - assert(_exclusions); + LTTNG_ASSERT(_exclusions); event_rule_status = lttng_event_rule_user_tracepoint_get_name_pattern_exclusion_count( rule, &nb_exclusions); - assert(event_rule_status == LTTNG_EVENT_RULE_STATUS_OK); + LTTNG_ASSERT(event_rule_status == LTTNG_EVENT_RULE_STATUS_OK); if (nb_exclusions == 0) { /* Nothing to do. */ exclusions = NULL; @@ -378,7 +378,7 @@ lttng_event_rule_user_tracepoint_generate_exclusions( event_rule_status = lttng_event_rule_user_tracepoint_get_name_pattern_exclusion_at_index( rule, i, &exclusion_str); - assert(event_rule_status == LTTNG_EVENT_RULE_STATUS_OK); + LTTNG_ASSERT(event_rule_status == LTTNG_EVENT_RULE_STATUS_OK); copy_ret = lttng_strncpy(exclusions->names[i], exclusion_str, LTTNG_SYMBOL_NAME_LEN); @@ -425,20 +425,133 @@ static unsigned long lttng_event_rule_user_tracepoint_hash( status = lttng_event_rule_user_tracepoint_get_name_pattern_exclusion_count(rule, &exclusion_count); - assert(status == LTTNG_EVENT_RULE_STATUS_OK); + LTTNG_ASSERT(status == LTTNG_EVENT_RULE_STATUS_OK); for (i = 0; i < exclusion_count; i++) { const char *exclusion; status = lttng_event_rule_user_tracepoint_get_name_pattern_exclusion_at_index( rule, i, &exclusion); - assert(status == LTTNG_EVENT_RULE_STATUS_OK); + LTTNG_ASSERT(status == LTTNG_EVENT_RULE_STATUS_OK); hash ^= hash_key_str(exclusion, lttng_ht_seed); } return hash; } +static enum lttng_error_code lttng_event_rule_user_tracepoint_mi_serialize( + const struct lttng_event_rule *rule, struct mi_writer *writer) +{ + int ret; + enum lttng_error_code ret_code; + enum lttng_event_rule_status status; + const char *filter = NULL; + const char *name_pattern = NULL; + const struct lttng_log_level_rule *log_level_rule = NULL; + unsigned int exclusion_count = 0; + + LTTNG_ASSERT(rule); + LTTNG_ASSERT(writer); + LTTNG_ASSERT(IS_USER_TRACEPOINT_EVENT_RULE(rule)); + + status = lttng_event_rule_user_tracepoint_get_name_pattern( + rule, &name_pattern); + LTTNG_ASSERT(status == LTTNG_EVENT_RULE_STATUS_OK); + LTTNG_ASSERT(name_pattern); + + status = lttng_event_rule_user_tracepoint_get_filter(rule, &filter); + LTTNG_ASSERT(status == LTTNG_EVENT_RULE_STATUS_OK || + status == LTTNG_EVENT_RULE_STATUS_UNSET); + + status = lttng_event_rule_user_tracepoint_get_log_level_rule( + rule, &log_level_rule); + LTTNG_ASSERT(status == LTTNG_EVENT_RULE_STATUS_OK || + status == LTTNG_EVENT_RULE_STATUS_UNSET); + + status = lttng_event_rule_user_tracepoint_get_name_pattern_exclusion_count( + rule, &exclusion_count); + LTTNG_ASSERT(status == LTTNG_EVENT_RULE_STATUS_OK); + + /* Open event rule user tracepoint element. */ + ret = mi_lttng_writer_open_element( + writer, mi_lttng_element_event_rule_user_tracepoint); + if (ret) { + goto mi_error; + } + + /* Name pattern. */ + ret = mi_lttng_writer_write_element_string(writer, + mi_lttng_element_event_rule_name_pattern, name_pattern); + if (ret) { + goto mi_error; + } + + /* Filter expression. */ + if (filter != NULL) { + ret = mi_lttng_writer_write_element_string(writer, + mi_lttng_element_event_rule_filter_expression, + filter); + if (ret) { + goto mi_error; + } + } + + /* Log level rule. */ + if (log_level_rule) { + ret_code = lttng_log_level_rule_mi_serialize( + log_level_rule, writer); + if (ret_code != LTTNG_OK) { + goto end; + } + } + + if (exclusion_count != 0) { + int i; + + /* Open the exclusion list. */ + ret = mi_lttng_writer_open_element(writer, + mi_lttng_element_event_rule_user_tracepoint_name_pattern_exclusions); + if (ret) { + goto mi_error; + } + + for (i = 0; i < exclusion_count; i++) { + const char *exclusion; + + status = lttng_event_rule_user_tracepoint_get_name_pattern_exclusion_at_index( + rule, i, &exclusion); + LTTNG_ASSERT(status == LTTNG_EVENT_RULE_STATUS_OK); + + ret = mi_lttng_writer_write_element_string(writer, + mi_lttng_element_event_rule_user_tracepoint_name_pattern_exclusion, + exclusion); + if (ret) { + goto mi_error; + } + } + + /* Close the list. */ + ret = mi_lttng_writer_close_element(writer); + if (ret) { + goto mi_error; + } + } + + /* Close event rule user tracepoint element. */ + ret = mi_lttng_writer_close_element(writer); + if (ret) { + goto mi_error; + } + + ret_code = LTTNG_OK; + goto end; + +mi_error: + ret_code = LTTNG_ERR_MI_IO_FAIL; +end: + return ret_code; +} + struct lttng_event_rule *lttng_event_rule_user_tracepoint_create(void) { struct lttng_event_rule *rule = NULL; @@ -465,6 +578,7 @@ struct lttng_event_rule *lttng_event_rule_user_tracepoint_create(void) tp_rule->parent.generate_exclusions = lttng_event_rule_user_tracepoint_generate_exclusions; tp_rule->parent.hash = lttng_event_rule_user_tracepoint_hash; + tp_rule->parent.mi_serialize = lttng_event_rule_user_tracepoint_mi_serialize; /* Not necessary for now. */ tp_rule->parent.generate_lttng_event = NULL; @@ -588,7 +702,7 @@ skip_filter_expression: goto end; } - assert(ret == tracepoint_comm->log_level_rule_len); + LTTNG_ASSERT(ret == tracepoint_comm->log_level_rule_len); } /* Skip after the log level rule. */ @@ -797,7 +911,7 @@ static bool log_level_rule_valid(const struct lttng_log_level_rule *rule) abort(); } - assert(status == LTTNG_LOG_LEVEL_RULE_STATUS_OK); + LTTNG_ASSERT(status == LTTNG_LOG_LEVEL_RULE_STATUS_OK); if (level < LTTNG_LOGLEVEL_EMERG) { /* Invalid. */