X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=ltt-events.c;h=42299142ecf274b00ad758596b856ccf902a6186;hb=d0255731fe93baede90f26d19aa4388403973554;hp=9c4ba27bc2300012ebbfa1a631451e01d0f3db18;hpb=7371f44c2c8ea6e60c0457671af008dd018c0b5f;p=lttng-modules.git diff --git a/ltt-events.c b/ltt-events.c index 9c4ba27b..42299142 100644 --- a/ltt-events.c +++ b/ltt-events.c @@ -66,6 +66,10 @@ void ltt_session_destroy(struct ltt_session *session) mutex_lock(&sessions_mutex); ACCESS_ONCE(session->active) = 0; + list_for_each_entry(chan, &session->chan, list) { + ret = lttng_syscalls_unregister(chan); + WARN_ON(ret); + } list_for_each_entry(event, &session->events, list) { ret = _ltt_event_unregister(event); WARN_ON(ret); @@ -262,7 +266,8 @@ void _ltt_channel_destroy(struct ltt_channel *chan) */ struct ltt_event *ltt_event_create(struct ltt_channel *chan, struct lttng_kernel_event *event_param, - void *filter) + void *filter, + const struct lttng_event_desc *internal_desc) { struct ltt_event *event; int ret; @@ -361,6 +366,11 @@ struct ltt_event *ltt_event_create(struct ltt_channel *chan, ret = try_module_get(event->desc->owner); WARN_ON_ONCE(!ret); break; + case LTTNG_KERNEL_NOOP: + event->desc = internal_desc; + if (!event->desc) + goto register_error; + break; default: WARN_ON_ONCE(1); } @@ -372,10 +382,7 @@ struct ltt_event *ltt_event_create(struct ltt_channel *chan, return event; statedump_error: - WARN_ON_ONCE(tracepoint_probe_unregister(event_param->name, - event->desc->probe_callback, - event)); - ltt_event_put(event->desc); + /* If a statedump error occurs, events will not be readable. */ register_error: kmem_cache_free(event_cache, event); cache_error: @@ -412,6 +419,9 @@ int _ltt_event_unregister(struct ltt_event *event) lttng_ftrace_unregister(event); ret = 0; break; + case LTTNG_KERNEL_NOOP: + ret = 0; + break; default: WARN_ON_ONCE(1); } @@ -440,6 +450,8 @@ void _ltt_event_destroy(struct ltt_event *event) module_put(event->desc->owner); lttng_ftrace_destroy_private(event); break; + case LTTNG_KERNEL_NOOP: + break; default: WARN_ON_ONCE(1); } @@ -487,7 +499,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->chan), + waitret = wait_event_interruptible_timeout(*chan->ops->get_writer_buf_wait_queue(chan->chan, -1), ({ ret = chan->ops->event_reserve(&ctx, 0); ret != -ENOBUFS || !ret; @@ -518,7 +530,7 @@ int _ltt_field_statedump(struct ltt_session *session, switch (field->type.atype) { case atype_integer: ret = lttng_metadata_printf(session, - " integer { size = %u; align = %u; signed = %u; encoding = %s; base = %u;%s } %s;\n", + " integer { size = %u; align = %u; signed = %u; encoding = %s; base = %u;%s } _%s;\n", field->type.u.basic.integer.size, field->type.u.basic.integer.alignment, field->type.u.basic.integer.signedness, @@ -537,7 +549,7 @@ int _ltt_field_statedump(struct ltt_session *session, break; case atype_enum: ret = lttng_metadata_printf(session, - " %s %s;\n", + " %s _%s;\n", field->type.u.basic.enumeration.name, field->name); break; @@ -547,7 +559,7 @@ int _ltt_field_statedump(struct ltt_session *session, elem_type = &field->type.u.array.elem_type; ret = lttng_metadata_printf(session, - " integer { size = %u; align = %u; signed = %u; encoding = %s; base = %u;%s } %s[%u];\n", + " integer { size = %u; align = %u; signed = %u; encoding = %s; base = %u;%s } _%s[%u];\n", elem_type->u.basic.integer.size, elem_type->u.basic.integer.alignment, elem_type->u.basic.integer.signedness, @@ -593,7 +605,7 @@ int _ltt_field_statedump(struct ltt_session *session, return ret; ret = lttng_metadata_printf(session, - " integer { size = %u; align = %u; signed = %u; encoding = %s; base = %u;%s } %s[ __%s_length ];\n", + " integer { size = %u; align = %u; signed = %u; encoding = %s; base = %u;%s } _%s[ __%s_length ];\n", elem_type->u.basic.integer.size, (unsigned int) elem_type->u.basic.integer.alignment, elem_type->u.basic.integer.signedness, @@ -616,7 +628,7 @@ int _ltt_field_statedump(struct ltt_session *session, case atype_string: /* Default encoding is UTF8 */ ret = lttng_metadata_printf(session, - " string%s %s;\n", + " string%s _%s;\n", field->type.u.basic.string.encoding == lttng_encode_ASCII ? " { encoding = ASCII; }" : "", field->name);