X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fsession.c;h=16431ca15ca19d3cd3260ee99e6a4c5163232d35;hp=a6281662cf63c23e67b1172b6930e47af3094d10;hb=ea9a44f03f3f6e144b5f7f312eee2a5f7a849ecb;hpb=23324029347bb09d3c7fdc4c9675ba6a33cb2fa9 diff --git a/src/bin/lttng-sessiond/session.c b/src/bin/lttng-sessiond/session.c index a6281662c..16431ca15 100644 --- a/src/bin/lttng-sessiond/session.c +++ b/src/bin/lttng-sessiond/session.c @@ -31,6 +31,7 @@ #include "session.h" #include "utils.h" +#include "trace-ust.h" /* * NOTES: @@ -133,6 +134,14 @@ void session_lock_list(void) pthread_mutex_lock(<t_session_list.lock); } +/* + * Try to acquire session list lock + */ +int session_trylock_list(void) +{ + return pthread_mutex_trylock(<t_session_list.lock); +} + /* * Release session list lock */ @@ -141,8 +150,78 @@ void session_unlock_list(void) pthread_mutex_unlock(<t_session_list.lock); } +/* + * Get the session's consumer destination type. + * + * The caller must hold the session lock. + */ +enum consumer_dst_type session_get_consumer_destination_type( + const struct ltt_session *session) +{ + /* + * The output information is duplicated in both of those session types. + * Hence, it doesn't matter from which it is retrieved. However, it is + * possible for only one of them to be set. + */ + return session->kernel_session ? + session->kernel_session->consumer->type : + session->ust_session->consumer->type; +} + +/* + * Get the session's consumer network hostname. + * The caller must ensure that the destination is of type "net". + * + * The caller must hold the session lock. + */ +const char *session_get_net_consumer_hostname(const struct ltt_session *session) +{ + const char *hostname = NULL; + const struct consumer_output *output; + + output = session->kernel_session ? + session->kernel_session->consumer : + session->ust_session->consumer; + + /* + * hostname is assumed to be the same for both control and data + * connections. + */ + switch (output->dst.net.control.dtype) { + case LTTNG_DST_IPV4: + hostname = output->dst.net.control.dst.ipv4; + break; + case LTTNG_DST_IPV6: + hostname = output->dst.net.control.dst.ipv6; + break; + default: + abort(); + } + return hostname; +} + +/* + * Get the session's consumer network control and data ports. + * The caller must ensure that the destination is of type "net". + * + * The caller must hold the session lock. + */ +void session_get_net_consumer_ports(const struct ltt_session *session, + uint16_t *control_port, uint16_t *data_port) +{ + const struct consumer_output *output; + + output = session->kernel_session ? + session->kernel_session->consumer : + session->ust_session->consumer; + *control_port = output->dst.net.control.port; + *data_port = output->dst.net.data.port; +} + /* * Allocate the ltt_sessions_ht_by_id HT. + * + * The session list lock must be held. */ int ltt_sessions_ht_alloc(void) { @@ -161,8 +240,10 @@ end: /* * Destroy the ltt_sessions_ht_by_id HT. + * + * The session list lock must be held. */ -void ltt_sessions_ht_destroy(void) +static void ltt_sessions_ht_destroy(void) { if (!ltt_sessions_ht_by_id) { return; @@ -201,7 +282,7 @@ end: * Return 1 if empty, 0 if not empty. * The session list lock must be held. */ -static int ltt_sessions_ht_empty() +static int ltt_sessions_ht_empty(void) { int ret; @@ -294,17 +375,21 @@ struct ltt_session *session_find_by_id(uint64_t id) struct lttng_ht_iter iter; struct ltt_session *ls; + if (!ltt_sessions_ht_by_id) { + goto end; + } + lttng_ht_lookup(ltt_sessions_ht_by_id, &id, &iter); node = lttng_ht_iter_get_node_u64(&iter); if (node == NULL) { - goto error; + goto end; } ls = caa_container_of(node, struct ltt_session, node); DBG3("Session %" PRIu64 " found by id.", id); return ls; -error: +end: DBG3("Session %" PRIu64 " NOT found by id", id); return NULL; } @@ -320,7 +405,7 @@ int session_destroy(struct ltt_session *session) /* Safety check */ assert(session); - DBG("Destroying session %s", session->name); + DBG("Destroying session %s (id %" PRIu64 ")", session->name, session->id); del_session_list(session); pthread_mutex_destroy(&session->lock); del_session_ht(session); @@ -392,6 +477,12 @@ int session_create(char *name, uid_t uid, gid_t gid) goto error; } + new_session->rotate_pending = false; + new_session->rotation_state = LTTNG_ROTATION_STATE_NO_ROTATION; + new_session->rotate_pending_relay = false; + new_session->rotate_relay_pending_timer_enabled = false; + new_session->rotate_timer = false; + /* Add new session to the session list */ session_lock_list(); new_session->id = add_session_list(new_session);