Add the sessiond notification-handling subsystem
[lttng-tools.git] / src / bin / lttng-sessiond / trace-kernel.c
index 1069d1f8fcb2e6f23b0d81df6c0d8c243f4c4f5e..29432de49a0355b16863ab69189929a6c37719f3 100644 (file)
@@ -15,7 +15,6 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#define _GNU_SOURCE
 #define _LGPL_SOURCE
 #include <stdio.h>
 #include <stdlib.h>
@@ -58,26 +57,79 @@ 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.
  */
 struct ltt_kernel_event *trace_kernel_get_event_by_name(
-               char *name, struct ltt_kernel_channel *channel)
+               char *name, struct ltt_kernel_channel *channel,
+               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 (strcmp(name, ev->event->name) == 0) {
-                       DBG("Found event by name %s for channel %s", name,
-                                       channel->channel->name);
-                       return ev;
+               if (type != LTTNG_EVENT_ALL && ev->type != type) {
+                       continue;
                }
+               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;
 }
 
 /*
@@ -109,14 +161,6 @@ struct ltt_kernel_session *trace_kernel_create_session(void)
                goto error;
        }
 
-       /*
-        * The tmp_consumer stays NULL until a set_consumer_uri command is
-        * executed. At this point, the consumer should be nullify until an
-        * enable_consumer command. This assignment is symbolic since we've zmalloc
-        * the struct.
-        */
-       lks->tmp_consumer = NULL;
-
        return lks;
 
 error:
@@ -205,10 +249,12 @@ error:
 
 /*
  * Allocate and initialize a kernel event. Set name and event type.
+ * We own filter_expression, and filter.
  *
  * 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;
@@ -267,10 +313,14 @@ 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;
 
 error:
+       free(filter_expression);
+       free(filter);
        free(lke);
        free(attr);
        return NULL;
@@ -398,6 +448,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);
 }
@@ -516,8 +569,7 @@ void trace_kernel_destroy_session(struct ltt_kernel_session *session)
        }
 
        /* Wipe consumer output object */
-       consumer_destroy_output(session->consumer);
-       consumer_destroy_output(session->tmp_consumer);
+       consumer_output_put(session->consumer);
 
        free(session);
 }
This page took 0.025984 seconds and 5 git commands to generate.