X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;ds=sidebyside;f=ltt-events.c;h=42d486c195d73c8cdfd265b6a54a5d2bd20950ec;hb=b64bc438d1c9bbcf241c598ca9f0e00d5770d784;hp=1b53d2c11defd6a3fcaaf33a521bd9a93ddacd93;hpb=27d2368e5c6430d26f046373f0ce81da29aac1b2;p=lttng-modules.git diff --git a/ltt-events.c b/ltt-events.c index 1b53d2c1..42d486c1 100644 --- a/ltt-events.c +++ b/ltt-events.c @@ -4,6 +4,8 @@ * Copyright 2010 (c) - Mathieu Desnoyers * * Holds LTTng per-session event registry. + * + * Dual LGPL v2.1/GPL v2 license. */ #include @@ -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: