* 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>
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;
return ret;
}
-int ltt_session_stop(struct ltt_session *session)
+int ltt_session_disable(struct ltt_session *session)
{
int ret = 0;
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;
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
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);
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();
* 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;
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:
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"
- : (length_type->u.basic.integer.encoding == lttng_encode_UTF8)
+ : ((length_type->u.basic.integer.encoding == lttng_encode_UTF8)
? "UTF8"
- : "ASCII",
+ : "ASCII"),
length_type->u.basic.integer.base,
#ifdef __BIG_ENDIAN
length_type->u.basic.integer.reverse_byte_order ? " byte_order = le;" : "",
#else
- length_type->u.basic.integer.reverse_byte_order
-? " byte_order = be;" : "",
+ 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"
- : (elem_type->u.basic.integer.encoding == lttng_encode_UTF8)
+ : ((elem_type->u.basic.integer.encoding == lttng_encode_UTF8)
? "UTF8"
- : "ASCII",
+ : "ASCII"),
elem_type->u.basic.integer.base,
#ifdef __BIG_ENDIAN
elem_type->u.basic.integer.reverse_byte_order ? " byte_order = le;" : "",
elem_type->u.basic.integer.reverse_byte_order ? " byte_order = be;" : "",
#endif
field->name,
- field->name
- );
+ field->name);
break;
}
"event {\n"
" name = %s;\n"
" id = %u;\n"
- " stream_id = %u;\n"
- " context := struct {\n",
+ " stream_id = %u;\n",
event->desc->name,
event->id,
event->chan->id);
if (ret)
goto end;
+ if (event->ctx) {
+ ret = lttng_metadata_printf(session,
+ " context := struct {\n");
+ if (ret)
+ goto end;
+ }
ret = _ltt_context_metadata_statedump(session, event->ctx);
if (ret)
goto end;
+ if (event->ctx) {
+ ret = lttng_metadata_printf(session,
+ " };\n");
+ if (ret)
+ goto end;
+ }
ret = lttng_metadata_printf(session,
- " };\n"
" fields := struct {\n"
);
if (ret)
"stream {\n"
" id = %u;\n"
" event.header := %s;\n"
- " packet.context := struct packet_context;\n"
- " event.context := {\n",
+ " packet.context := struct packet_context;\n",
chan->id,
chan->header_type == 1 ? "struct event_header_compact" :
"struct event_header_large");
if (ret)
goto end;
+ if (chan->ctx) {
+ ret = lttng_metadata_printf(session,
+ " event.context := struct {\n");
+ if (ret)
+ goto end;
+ }
ret = _ltt_context_metadata_statedump(session, chan->ctx);
if (ret)
goto end;
+ if (chan->ctx) {
+ ret = lttng_metadata_printf(session,
+ " };\n");
+ if (ret)
+ goto end;
+ }
ret = lttng_metadata_printf(session,
- " };\n"
- "};\n\n"
- );
+ "};\n\n");
chan->metadata_dumped = 1;
end: