X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng-relayd%2Fsession.h;h=cb125be18b4bbcf10ac2dfacf513e1ee4d166ee6;hb=151b6b1ac2ac1a85b587e578e69b48f6e5feab6a;hp=698e8ef7f9d11d90e02e82e3fee97b70b4b4a2ca;hpb=2f8f53af90479595d530f8f02e71dd0b9fb810ee;p=lttng-tools.git diff --git a/src/bin/lttng-relayd/session.h b/src/bin/lttng-relayd/session.h index 698e8ef7f..cb125be18 100644 --- a/src/bin/lttng-relayd/session.h +++ b/src/bin/lttng-relayd/session.h @@ -22,6 +22,7 @@ #include #include #include +#include #include @@ -35,16 +36,22 @@ struct relay_session { * daemon which can provide multiple data source. */ uint64_t id; - struct lttcomm_sock *sock; char session_name[NAME_MAX]; char hostname[HOST_NAME_MAX]; uint32_t live_timer; - struct lttng_ht_node_ulong session_n; + struct lttng_ht_node_u64 session_n; struct rcu_head rcu_node; - uint32_t viewer_attached; 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; + + /* 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 @@ -65,8 +72,45 @@ struct relay_session { * process of sending those streams. */ pthread_mutex_t viewer_ready_lock; + + /* + * Member of the session list in struct relay_viewer_session. + */ + struct cds_list_head viewer_session_list; }; +struct relay_viewer_session { + struct cds_list_head sessions_head; +}; + +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_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); #endif /* _SESSION_H */