X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Ftrace-kernel.c;h=33a9e7e5578daf8454e5ccc97bc3d97d85e7934f;hp=ab3282a17f189b9c7b288fab65a5dd224f38fe2b;hb=00a620843422e5c972aee0ada2181b811fc81b92;hpb=fac26884aa477a653fb72cc009fb14f970833baf diff --git a/src/bin/lttng-sessiond/trace-kernel.c b/src/bin/lttng-sessiond/trace-kernel.c index ab3282a17..33a9e7e55 100644 --- a/src/bin/lttng-sessiond/trace-kernel.c +++ b/src/bin/lttng-sessiond/trace-kernel.c @@ -58,6 +58,49 @@ struct ltt_kernel_channel *trace_kernel_get_channel_by_name( return NULL; } +/* + * Find the event for the given channel. + */ +struct ltt_kernel_event *trace_kernel_find_event( + char *name, struct ltt_kernel_channel *channel, + enum lttng_event_type type, + struct lttng_filter_bytecode *filter) +{ + struct ltt_kernel_event *ev; + int found = 0; + + assert(name); + assert(channel); + + cds_list_for_each_entry(ev, &channel->events_list.head, list) { + if (type != LTTNG_EVENT_ALL && ev->type != type) { + continue; + } + if (strcmp(name, ev->event->name)) { + continue; + } + if ((ev->filter && !filter) || (!ev->filter && filter)) { + continue; + } + if (ev->filter && filter) { + if (ev->filter->len != filter->len || + memcmp(ev->filter->data, filter->data, + filter->len) != 0) { + continue; + } + } + found = 1; + break; + } + if (found) { + DBG("Found event %s for channel %s", name, + channel->channel->name); + return ev; + } else { + return NULL; + } +} + /* * Find the event name for the given channel. */ @@ -66,21 +109,28 @@ struct ltt_kernel_event *trace_kernel_get_event_by_name( enum lttng_event_type type) { struct ltt_kernel_event *ev; + int found = 0; assert(name); assert(channel); cds_list_for_each_entry(ev, &channel->events_list.head, list) { - if (type != LTTNG_EVENT_ALL && ev->type != type) + if (type != LTTNG_EVENT_ALL && ev->type != type) { continue; - if (strcmp(name, ev->event->name) == 0) { - DBG("Found event by name %s for channel %s", name, - channel->channel->name); - return ev; } + if (strcmp(name, ev->event->name)) { + continue; + } + found = 1; + break; + } + if (found) { + DBG("Found event %s for channel %s", name, + channel->channel->name); + return ev; + } else { + return NULL; } - - return NULL; } /* @@ -211,7 +261,8 @@ error: * * Return pointer to structure or NULL. */ -struct ltt_kernel_event *trace_kernel_create_event(struct lttng_event *ev) +struct ltt_kernel_event *trace_kernel_create_event(struct lttng_event *ev, + char *filter_expression, struct lttng_filter_bytecode *filter) { struct ltt_kernel_event *lke; struct lttng_kernel_event *attr; @@ -270,6 +321,8 @@ struct ltt_kernel_event *trace_kernel_create_event(struct lttng_event *ev) lke->fd = -1; lke->event = attr; lke->enabled = 1; + lke->filter_expression = filter_expression; + lke->filter = filter; return lke; @@ -401,6 +454,9 @@ void trace_kernel_destroy_event(struct ltt_kernel_event *event) /* Remove from event list */ cds_list_del(&event->list); + free(event->filter_expression); + free(event->filter); + free(event->event); free(event); }