X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng%2Fcommands%2Fenable_events.c;h=231b7b38ee7750e8fd3d256a07b0c242f5ea59df;hp=2dff63b92fb4969423f6b9e0a2f84c5f44d6a89f;hb=748bde765422ca3b2868999cdc7cb5a2de6d5d0e;hpb=67b5863058c0fbe14e0b527013b50aef8eabdd88 diff --git a/src/bin/lttng/commands/enable_events.c b/src/bin/lttng/commands/enable_events.c index 2dff63b92..231b7b38e 100644 --- a/src/bin/lttng/commands/enable_events.c +++ b/src/bin/lttng/commands/enable_events.c @@ -43,6 +43,7 @@ static char *opt_function; static char *opt_function_entry_symbol; static char *opt_channel_name; static char *opt_filter; +static char *opt_exclude; #if 0 /* Not implemented yet */ static char *opt_cmd_name; @@ -61,6 +62,7 @@ enum { OPT_LOGLEVEL_ONLY, OPT_LIST_OPTIONS, OPT_FILTER, + OPT_EXCLUDE, }; static struct lttng_handle *handle; @@ -89,6 +91,7 @@ static struct poptOption long_options[] = { {"loglevel-only", 0, POPT_ARG_STRING, 0, OPT_LOGLEVEL_ONLY, 0, 0}, {"list-options", 0, POPT_ARG_NONE, NULL, OPT_LIST_OPTIONS, NULL, NULL}, {"filter", 'f', POPT_ARG_STRING, &opt_filter, OPT_FILTER, 0, 0}, + {"exclude", 'x', POPT_ARG_STRING, &opt_exclude, OPT_EXCLUDE, 0, 0}, {0, 0, 0, 0, 0, 0, 0} }; @@ -192,6 +195,12 @@ static void usage(FILE *ofp) fprintf(ofp, " '$ctx.procname == \"demo*\"'\n"); fprintf(ofp, " '$ctx.vpid >= 4433 && $ctx.vpid < 4455'\n"); fprintf(ofp, " '$ctx.vtid == 1234'\n"); + fprintf(ofp, " -x, --exclude LIST\n"); + fprintf(ofp, " Add exclusions to UST tracepoints:\n"); + fprintf(ofp, " Events that match any of the items\n"); + fprintf(ofp, " in the comma-separated LIST are not\n"); + fprintf(ofp, " enabled, even if they match a wildcard\n"); + fprintf(ofp, " definition of the event.\n"); fprintf(ofp, "\n"); } @@ -327,6 +336,94 @@ const char *print_raw_channel_name(const char *name) return name ? : ""; } +/* + * Compare list of exclusions against an event name. + * Return a list of legal exclusion names. + * Produce an error or a warning about others (depending on the situation) + */ +static +int check_exclusion_subsets(const char *event_name, + const char *exclusions, + int *exclusion_count_ptr, + char ***exclusion_list_ptr) +{ + const char *excluder_ptr; + const char *event_ptr; + const char *next_excluder; + int excluder_length; + int exclusion_count = 0; + char **exclusion_list = NULL; + int ret = CMD_SUCCESS; + + if (event_name[strlen(event_name) - 1] != '*') { + ERR("Event %s: Excluders can only be used with wildcarded events", event_name); + goto error; + } + + next_excluder = exclusions; + while (*next_excluder != 0) { + event_ptr = event_name; + excluder_ptr = next_excluder; + excluder_length = strcspn(next_excluder, ","); + + /* Scan both the excluder and the event letter by letter */ + while (1) { + char e, x; + + e = *event_ptr; + x = *excluder_ptr; + + if (x == '*') { + /* Event is a subset of the excluder */ + ERR("Event %s: %.*s excludes all events from %s", + event_name, + excluder_length, + next_excluder, + event_name); + goto error; + } + if (e == '*') { + /* Excluder is a proper subset of event */ + exclusion_count++; + exclusion_list = realloc(exclusion_list, sizeof(char **) * exclusion_count); + exclusion_list[exclusion_count - 1] = strndup(next_excluder, excluder_length); + + break; + } + if (x != e) { + /* Excluder and event sets have no common elements */ + WARN("Event %s: %.*s does not exclude any events from %s", + event_name, + excluder_length, + next_excluder, + event_name); + break; + } + excluder_ptr++; + event_ptr++; + } + /* next excluder */ + next_excluder += excluder_length; + if (*next_excluder == ',') { + next_excluder++; + } + } + goto end; +error: + while (exclusion_count--) { + free(exclusion_list[exclusion_count]); + } + if (exclusion_list != NULL) { + free(exclusion_list); + } + exclusion_list = NULL; + exclusion_count = 0; + ret = CMD_ERROR; +end: + *exclusion_count_ptr = exclusion_count; + *exclusion_list_ptr = exclusion_list; + return ret; +} /* * Enabling event using the lttng API. */ @@ -714,6 +811,8 @@ int cmd_enable_events(int argc, const char **argv) goto end; case OPT_FILTER: break; + case OPT_EXCLUDE: + break; default: usage(stderr); ret = CMD_UNDEFINED;