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;
OPT_LOGLEVEL_ONLY,
OPT_LIST_OPTIONS,
OPT_FILTER,
+ OPT_EXCLUDE,
};
static struct lttng_handle *handle;
{"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}
};
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");
}
return name ? : "<default>";
}
+/*
+ * 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.
*/
ret = CMD_ERROR;
goto error;
}
+ if (opt_loglevel) {
+ WARN("Kernel loglevels are not supported.");
+ }
}
/* Create lttng domain */
switch (opt_event_type) {
case LTTNG_EVENT_TRACEPOINT:
- if (opt_loglevel) {
+ if (opt_loglevel && dom.type != LTTNG_DOMAIN_KERNEL) {
MSG("All %s tracepoints are enabled in channel %s for loglevel %s",
get_domain_str(dom.type),
print_channel_name(channel_name),
MSG("All %s tracepoints are enabled in channel %s",
get_domain_str(dom.type),
print_channel_name(channel_name));
-
}
break;
case LTTNG_EVENT_SYSCALL:
}
break;
case LTTNG_EVENT_ALL:
- if (opt_loglevel) {
+ if (opt_loglevel && dom.type != LTTNG_DOMAIN_KERNEL) {
MSG("All %s events are enabled in channel %s for loglevel %s",
get_domain_str(dom.type),
print_channel_name(channel_name),
goto error;
}
- if (opt_loglevel) {
- MSG("Kernel loglevels are not supported.");
- ret = CMD_UNSUPPORTED;
- goto error;
- }
-
/* kernel loglevels not implemented */
ev.loglevel_type = LTTNG_EVENT_LOGLEVEL_ALL;
} else if (opt_userspace) { /* User-space tracer action */
goto end;
case OPT_FILTER:
break;
+ case OPT_EXCLUDE:
+ break;
default:
usage(stderr);
ret = CMD_UNDEFINED;