X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=libust%2Fltt-events.c;h=68531bcd628e435e62805d52b5f593054ec5089b;hb=4318ae1be57eb7983ab4857a7a8eeb4a030a8216;hp=0c6ef373079b417bc44a66e10e0f2dd0638706bb;hpb=594696b1d28139d4a6ff85389e39970460b9e778;p=lttng-ust.git diff --git a/libust/ltt-events.c b/libust/ltt-events.c index 0c6ef373..68531bcd 100644 --- a/libust/ltt-events.c +++ b/libust/ltt-events.c @@ -10,6 +10,7 @@ #define _GNU_SOURCE #include +#include #include #include #include @@ -17,33 +18,34 @@ #include #include #include -#include +#include #include #include #include -#include -#include -#include "ust/core.h" +#include +#include +#include "lttng/core.h" #include "ltt-tracer.h" #include "ltt-tracer-core.h" -#include "ust/wait.h" +#include "lttng/wait.h" #include "../libringbuffer/shm.h" typedef u32 uint32_t; -#include +#include /* * The sessions mutex is the centralized mutex across UST tracing - * control and probe registration. + * control and probe registration. All operations within this file are + * called by the communication thread, under ust_lock protection. */ static DEFINE_MUTEX(sessions_mutex); -void lock_ust(void) +void ust_lock(void) { pthread_mutex_lock(&sessions_mutex); } -void unlock_ust(void) +void ust_unlock(void) { pthread_mutex_unlock(&sessions_mutex); } @@ -144,6 +146,9 @@ int pending_probe_fix_events(const struct lttng_event_desc *desc) ret |= __tracepoint_probe_register(name, event->desc->probe_callback, event); + if (ret) + continue; + event->id = chan->free_event_id++; ret |= _ltt_event_metadata_statedump(chan->session, chan, event); } @@ -162,12 +167,10 @@ struct ltt_session *ltt_session_create(void) session = zmalloc(sizeof(struct ltt_session)); if (!session) return NULL; - pthread_mutex_lock(&sessions_mutex); CDS_INIT_LIST_HEAD(&session->chan); CDS_INIT_LIST_HEAD(&session->events); uuid_generate(session->uuid); cds_list_add(&session->list, &sessions); - pthread_mutex_unlock(&sessions_mutex); return session; } @@ -177,7 +180,6 @@ void ltt_session_destroy(struct ltt_session *session) struct ltt_event *event, *tmpevent; int ret; - pthread_mutex_lock(&sessions_mutex); CMM_ACCESS_ONCE(session->active) = 0; cds_list_for_each_entry(event, &session->events, list) { ret = _ltt_event_unregister(event); @@ -189,7 +191,6 @@ void ltt_session_destroy(struct ltt_session *session) cds_list_for_each_entry_safe(chan, tmpchan, &session->chan, list) _ltt_channel_destroy(chan); cds_list_del(&session->list); - pthread_mutex_unlock(&sessions_mutex); free(session); } @@ -198,7 +199,6 @@ int ltt_session_enable(struct ltt_session *session) int ret = 0; struct ltt_channel *chan; - pthread_mutex_lock(&sessions_mutex); if (session->active) { ret = -EBUSY; goto end; @@ -223,7 +223,6 @@ int ltt_session_enable(struct ltt_session *session) if (ret) CMM_ACCESS_ONCE(session->active) = 0; end: - pthread_mutex_unlock(&sessions_mutex); return ret; } @@ -231,14 +230,12 @@ int ltt_session_disable(struct ltt_session *session) { int ret = 0; - pthread_mutex_lock(&sessions_mutex); if (!session->active) { ret = -EBUSY; goto end; } CMM_ACCESS_ONCE(session->active) = 0; end: - pthread_mutex_unlock(&sessions_mutex); return ret; } @@ -306,12 +303,13 @@ struct ltt_channel *ltt_channel_create(struct ltt_session *session, void *buf_addr, size_t subbuf_size, size_t num_subbuf, unsigned int switch_timer_interval, - unsigned int read_timer_interval) + unsigned int read_timer_interval, + int *shm_fd, int *wait_fd, + uint64_t *memory_map_size) { struct ltt_channel *chan; struct ltt_transport *transport; - pthread_mutex_lock(&sessions_mutex); if (session->been_active) goto active; /* Refuse to add channel to active session */ transport = ltt_transport_find(transport_name); @@ -332,13 +330,13 @@ struct ltt_channel *ltt_channel_create(struct ltt_session *session, */ transport->ops.channel_create("[lttng]", chan, buf_addr, subbuf_size, num_subbuf, switch_timer_interval, - read_timer_interval); + read_timer_interval, shm_fd, wait_fd, + memory_map_size); if (!chan->chan) goto create_error; chan->enabled = 1; chan->ops = &transport->ops; cds_list_add(&chan->list, &session->chan); - pthread_mutex_unlock(&sessions_mutex); return chan; create_error: @@ -346,7 +344,6 @@ create_error: nomem: notransport: active: - pthread_mutex_unlock(&sessions_mutex); return NULL; } @@ -372,7 +369,6 @@ struct ltt_event *ltt_event_create(struct ltt_channel *chan, struct ltt_event *event; int ret; - pthread_mutex_lock(&sessions_mutex); if (chan->used_event_id == -1UL) goto full; /* @@ -426,7 +422,6 @@ struct ltt_event *ltt_event_create(struct ltt_channel *chan, goto statedump_error; } cds_list_add(&event->list, &chan->session->events); - pthread_mutex_unlock(&sessions_mutex); return event; statedump_error: @@ -442,7 +437,6 @@ register_error: cache_error: exist: full: - pthread_mutex_unlock(&sessions_mutex); return NULL; } @@ -494,14 +488,14 @@ void _ltt_event_destroy(struct ltt_event *event) /* * We have exclusive access to our metadata buffer (protected by the - * sessions_mutex), so we can do racy operations such as looking for + * ust_lock), so we can do racy operations such as looking for * remaining space left in packet and write, since mutual exclusion * protects us from concurrent writes. */ int lttng_metadata_printf(struct ltt_session *session, const char *fmt, ...) { - struct lib_ring_buffer_ctx ctx; + struct lttng_ust_lib_ring_buffer_ctx ctx; struct ltt_channel *chan = session->metadata; char *str = NULL; int ret = 0, waitret; @@ -562,7 +556,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, @@ -572,7 +566,7 @@ int _ltt_field_statedump(struct ltt_session *session, ? "UTF8" : "ASCII", field->type.u.basic.integer.base, -#ifdef __BIG_ENDIAN +#if (BYTE_ORDER == BIG_ENDIAN) field->type.u.basic.integer.reverse_byte_order ? " byte_order = le;" : "", #else field->type.u.basic.integer.reverse_byte_order ? " byte_order = be;" : "", @@ -581,11 +575,11 @@ int _ltt_field_statedump(struct ltt_session *session, break; case atype_float: ret = lttng_metadata_printf(session, - " floating_point { exp_dig = %u; mant_dig = %u; align = %u; } %s;\n", + " floating_point { exp_dig = %u; mant_dig = %u; align = %u;%s } _%s;\n", field->type.u.basic._float.exp_dig, field->type.u.basic._float.mant_dig, field->type.u.basic._float.alignment, -#ifdef __BIG_ENDIAN +#if (BYTE_ORDER == BIG_ENDIAN) field->type.u.basic.integer.reverse_byte_order ? " byte_order = le;" : "", #else field->type.u.basic.integer.reverse_byte_order ? " byte_order = be;" : "", @@ -604,7 +598,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, @@ -614,7 +608,7 @@ int _ltt_field_statedump(struct ltt_session *session, ? "UTF8" : "ASCII", elem_type->u.basic.integer.base, -#ifdef __BIG_ENDIAN +#if (BYTE_ORDER == BIG_ENDIAN) elem_type->u.basic.integer.reverse_byte_order ? " byte_order = le;" : "", #else elem_type->u.basic.integer.reverse_byte_order ? " byte_order = be;" : "", @@ -640,7 +634,7 @@ int _ltt_field_statedump(struct ltt_session *session, ? "UTF8" : "ASCII"), length_type->u.basic.integer.base, -#ifdef __BIG_ENDIAN +#if (BYTE_ORDER == 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;" : "", @@ -650,7 +644,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, @@ -660,7 +654,7 @@ int _ltt_field_statedump(struct ltt_session *session, ? "UTF8" : "ASCII"), elem_type->u.basic.integer.base, -#ifdef __BIG_ENDIAN +#if (BYTE_ORDER == BIG_ENDIAN) elem_type->u.basic.integer.reverse_byte_order ? " byte_order = le;" : "", #else elem_type->u.basic.integer.reverse_byte_order ? " byte_order = be;" : "", @@ -673,7 +667,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); @@ -951,7 +945,7 @@ int _ltt_session_metadata_statedump(struct ltt_session *session) CTF_VERSION_MAJOR, CTF_VERSION_MINOR, uuid_s, -#ifdef __BIG_ENDIAN +#if (BYTE_ORDER == BIG_ENDIAN) "be" #else "le" @@ -990,27 +984,24 @@ end: * @transport: transport structure * * Registers a transport which can be used as output to extract the data out of - * LTTng. + * LTTng. Called with ust_lock held. */ void ltt_transport_register(struct ltt_transport *transport) { - pthread_mutex_lock(&sessions_mutex); cds_list_add_tail(&transport->node, <t_transport_list); - pthread_mutex_unlock(&sessions_mutex); } /** * ltt_transport_unregister - LTT transport unregistration * @transport: transport structure + * Called with ust_lock held. */ void ltt_transport_unregister(struct ltt_transport *transport) { - pthread_mutex_lock(&sessions_mutex); cds_list_del(&transport->node); - pthread_mutex_unlock(&sessions_mutex); } -void ltt_events_exit(void) +void lttng_ust_events_exit(void) { struct ltt_session *session, *tmpsession;