Add ring buffer flush ioctl
[deliverable/lttng-modules.git] / ltt-events.c
index a4bc1544189acb35fe623ccba2a59186257b0f16..42d486c195d73c8cdfd265b6a54a5d2bd20950ec 100644 (file)
@@ -4,6 +4,8 @@
  * Copyright 2010 (c) - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
  *
  * Holds LTTng per-session event registry.
+ *
+ * Dual LGPL v2.1/GPL v2 license.
  */
 
 #include <linux/module.h>
@@ -80,7 +82,7 @@ void ltt_session_destroy(struct ltt_session *session)
        kfree(session);
 }
 
-int ltt_session_start(struct ltt_session *session)
+int ltt_session_enable(struct ltt_session *session)
 {
        int ret = 0;
        struct ltt_channel *chan;
@@ -117,7 +119,7 @@ end:
        return ret;
 }
 
-int ltt_session_stop(struct ltt_session *session)
+int ltt_session_disable(struct ltt_session *session)
 {
        int ret = 0;
 
@@ -133,6 +135,54 @@ end:
        return ret;
 }
 
+int ltt_channel_enable(struct ltt_channel *channel)
+{
+       int old;
+
+       if (channel == channel->session->metadata)
+               return -EPERM;
+       old = xchg(&channel->enabled, 1);
+       if (old)
+               return -EEXIST;
+       return 0;
+}
+
+int ltt_channel_disable(struct ltt_channel *channel)
+{
+       int old;
+
+       if (channel == channel->session->metadata)
+               return -EPERM;
+       old = xchg(&channel->enabled, 0);
+       if (!old)
+               return -EEXIST;
+       return 0;
+}
+
+int ltt_event_enable(struct ltt_event *event)
+{
+       int old;
+
+       if (event->chan == event->chan->session->metadata)
+               return -EPERM;
+       old = xchg(&event->enabled, 1);
+       if (old)
+               return -EEXIST;
+       return 0;
+}
+
+int ltt_event_disable(struct ltt_event *event)
+{
+       int old;
+
+       if (event->chan == event->chan->session->metadata)
+               return -EPERM;
+       old = xchg(&event->enabled, 0);
+       if (!old)
+               return -EEXIST;
+       return 0;
+}
+
 static struct ltt_transport *ltt_transport_find(const char *name)
 {
        struct ltt_transport *transport;
@@ -167,7 +217,6 @@ struct ltt_channel *ltt_channel_create(struct ltt_session *session,
        if (!chan)
                goto nomem;
        chan->session = session;
-       init_waitqueue_head(&chan->notify_wait);
        chan->id = session->free_chan_id++;
        /*
         * Note: the channel creation op already writes into the packet
@@ -179,6 +228,7 @@ struct ltt_channel *ltt_channel_create(struct ltt_session *session,
                        read_timer_interval);
        if (!chan->chan)
                goto create_error;
+       chan->enabled = 1;
        chan->ops = &transport->ops;
        list_add(&chan->list, &session->chan);
        mutex_unlock(&sessions_mutex);
@@ -231,6 +281,7 @@ struct ltt_event *ltt_event_create(struct ltt_channel *chan,
        event->chan = chan;
        event->filter = filter;
        event->id = chan->free_event_id++;
+       event->enabled = 1;
        event->instrumentation = event_param->instrumentation;
        /* Populate ltt_event structure before tracepoint registration. */
        smp_wmb();
@@ -383,7 +434,7 @@ int lttng_metadata_printf(struct ltt_session *session,
                 * we need to bail out after timeout or being
                 * interrupted.
                 */
-               waitret = wait_event_interruptible_timeout(*chan->ops->get_reader_wait_queue(chan),
+               waitret = wait_event_interruptible_timeout(*chan->ops->get_reader_wait_queue(chan->chan),
                        ({
                                ret = chan->ops->event_reserve(&ctx, 0);
                                ret != -ENOBUFS || !ret;
@@ -397,7 +448,7 @@ int lttng_metadata_printf(struct ltt_session *session,
                                ret = waitret;
                        goto end;
                }
-               chan->ops->event_write(&ctx, &str[pos], len);
+               chan->ops->event_write(&ctx, &str[pos], reserve_len);
                chan->ops->event_commit(&ctx);
        }
 end:
@@ -470,9 +521,8 @@ int _ltt_field_statedump(struct ltt_session *session,
                length_type = &field->type.u.sequence.length_type;
                ret = lttng_metadata_printf(session,
                        "               integer { size = %u; align = %u; signed = %u; encoding = %s; base = %u;%s } __%s_length;\n",
-                       "               integer { size = %u; align = %u; signed = %u; encoding = %s; base = %u;%s } %s[ __%s_length ];\n",
                        length_type->u.basic.integer.size,
-                       length_type->u.basic.integer.alignment,
+                       (unsigned int) length_type->u.basic.integer.alignment,
                        length_type->u.basic.integer.signedness,
                        (length_type->u.basic.integer.encoding == lttng_encode_none)
                                ? "none"
@@ -485,9 +535,14 @@ int _ltt_field_statedump(struct ltt_session *session,
 #else
                        length_type->u.basic.integer.reverse_byte_order ? " byte_order = be;" : "",
 #endif
-                       field->name,
+                       field->name);
+               if (ret)
+                       return ret;
+
+               ret = lttng_metadata_printf(session,
+                       "               integer { size = %u; align = %u; signed = %u; encoding = %s; base = %u;%s } %s[ __%s_length ];\n",
                        elem_type->u.basic.integer.size,
-                       elem_type->u.basic.integer.alignment,
+                       (unsigned int) elem_type->u.basic.integer.alignment,
                        elem_type->u.basic.integer.signedness,
                        (elem_type->u.basic.integer.encoding == lttng_encode_none)
                                ? "none"
@@ -501,8 +556,7 @@ int _ltt_field_statedump(struct ltt_session *session,
                        elem_type->u.basic.integer.reverse_byte_order ? " byte_order = be;" : "",
 #endif
                        field->name,
-                       field->name
-                       );
+                       field->name);
                break;
        }
 
This page took 0.029105 seconds and 5 git commands to generate.