X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-relayd%2Fsession.h;h=de1e44f0d7fd36410349a7c1f1ecbcac8bc3c76b;hp=cb125be18b4bbcf10ac2dfacf513e1ee4d166ee6;hb=36d2e35df61339e4394e84ad9790b984d259e0f0;hpb=c3b7390bf0fe3bcb1d5364acddcbe0fd107303d3 diff --git a/src/bin/lttng-relayd/session.h b/src/bin/lttng-relayd/session.h index cb125be18..de1e44f0d 100644 --- a/src/bin/lttng-relayd/session.h +++ b/src/bin/lttng-relayd/session.h @@ -1,6 +1,10 @@ +#ifndef _SESSION_H +#define _SESSION_H + /* * Copyright (C) 2013 - Julien Desfossez * David Goulet + * 2015 - Mathieu Desnoyers * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License, version 2 only, as @@ -16,14 +20,13 @@ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef _SESSION_H -#define _SESSION_H - #include #include #include #include +#include +#include #include /* @@ -31,35 +34,56 @@ */ struct relay_session { /* - * This session id is used to identify a set of stream to a tracing session - * but also make sure we have a unique session id associated with a session - * daemon which can provide multiple data source. + * This session id is generated by the relay daemon to guarantee + * its uniqueness even when serving multiple session daemons. + * It is used to match a set of streams to their session. */ uint64_t id; - char session_name[NAME_MAX]; + char session_name[LTTNG_NAME_MAX]; char hostname[HOST_NAME_MAX]; uint32_t live_timer; - struct lttng_ht_node_u64 session_n; - struct rcu_head rcu_node; - uint32_t stream_count; - /* Tell if this session is for a snapshot or not. */ - unsigned int snapshot:1; - /* Tell if the session has been closed on the streaming side. */ - unsigned int close_flag:1; - /* Number of viewer using it. Set to 0, it should be destroyed. */ - int viewer_refcount; + /* Session in snapshot mode. */ + bool snapshot; + + /* + * Session has no back reference to its connection because it + * has a life-time that can be longer than the consumer connection's + * life-time; a reference can still be held by the viewer + * connection through the viewer streams. + */ + + struct urcu_ref ref; + /* session reflock nests inside ctf_trace reflock. */ + pthread_mutex_t reflock; + + pthread_mutex_t lock; + + /* major/minor version used for this session. */ + uint32_t major; + uint32_t minor; + + bool viewer_attached; + /* Tell if the session connection has been closed on the streaming side. */ + bool connection_closed; /* Contains ctf_trace object of that session indexed by path name. */ struct lttng_ht *ctf_traces_ht; /* - * Indicate version protocol for this session. This is especially useful - * for the data thread that has no idea which version it operates on since - * linking control/data sockets is non trivial. + * This contains streams that are received on that connection. + * It's used to store them until we get the streams sent + * command. When this is received, we remove those streams from + * the list and publish them. + * + * Updates are protected by the recv_list_lock. + * Traversals are protected by RCU. + * recv_list_lock also protects stream_count. */ - uint64_t minor; - uint64_t major; + struct cds_list_head recv_list; /* RCU list. */ + uint32_t stream_count; + pthread_mutex_t recv_list_lock; + /* * Flag checked and exchanged with uatomic_cmpxchg to tell the * viewer-side if new streams got added since the last check. @@ -67,50 +91,26 @@ struct relay_session { unsigned long new_streams; /* - * Used to synchronize the process where we flag every streams readiness - * for the viewer when the streams_sent message is received and the viewer - * process of sending those streams. + * Node in the global session hash table. */ - pthread_mutex_t viewer_ready_lock; - + struct lttng_ht_node_u64 session_n; /* * Member of the session list in struct relay_viewer_session. + * Updates are protected by the relay_viewer_session + * session_list_lock. Traversals are protected by RCU. */ - struct cds_list_head viewer_session_list; -}; - -struct relay_viewer_session { - struct cds_list_head sessions_head; + struct cds_list_head viewer_session_node; + struct rcu_head rcu_node; /* For call_rcu teardown. */ }; -static inline void session_viewer_attach(struct relay_session *session) -{ - uatomic_inc(&session->viewer_refcount); -} - -static inline void session_viewer_detach(struct relay_session *session) -{ - uatomic_add(&session->viewer_refcount, -1); -} +struct relay_session *session_create(const char *session_name, + const char *hostname, uint32_t live_timer, + bool snapshot, uint32_t major, uint32_t minor); +struct relay_session *session_get_by_id(uint64_t id); +bool session_get(struct relay_session *session); +void session_put(struct relay_session *session); -struct relay_session *session_find_by_id(struct lttng_ht *ht, uint64_t id); -struct relay_session *session_create(void); -int session_delete(struct lttng_ht *ht, struct relay_session *session); - -/* - * Direct destroy without reading the refcount. - */ -void session_destroy(struct relay_session *session); - -/* - * Destroy the session if the refcount is down to 0. - */ -void session_try_destroy(struct lttng_ht *ht, struct relay_session *session); - -/* - * Decrement the viewer refcount and destroy it if down to 0. - */ -void session_viewer_try_destroy(struct lttng_ht *ht, - struct relay_session *session); +int session_close(struct relay_session *session); +void print_sessions(void); #endif /* _SESSION_H */