Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
static
struct session_info *session_info_create(const char *name,
uid_t uid, gid_t gid,
static
struct session_info *session_info_create(const char *name,
uid_t uid, gid_t gid,
- struct lttng_session_trigger_list *trigger_list);
+ struct lttng_session_trigger_list *trigger_list,
+ struct cds_lfht *sessions_ht);
static
void session_info_add_channel(struct session_info *session_info,
struct channel_info *channel_info);
static
void session_info_add_channel(struct session_info *session_info,
struct channel_info *channel_info);
}
}
lttng_session_trigger_list_destroy(session_info->trigger_list);
}
}
lttng_session_trigger_list_destroy(session_info->trigger_list);
+
+ rcu_read_lock();
+ cds_lfht_del(session_info->sessions_ht,
+ &session_info->sessions_ht_node);
+ rcu_read_unlock();
free(session_info->name);
free(session_info);
}
free(session_info->name);
free(session_info);
}
static
struct session_info *session_info_create(const char *name, uid_t uid, gid_t gid,
static
struct session_info *session_info_create(const char *name, uid_t uid, gid_t gid,
- struct lttng_session_trigger_list *trigger_list)
+ struct lttng_session_trigger_list *trigger_list,
+ struct cds_lfht *sessions_ht)
{
struct session_info *session_info;
{
struct session_info *session_info;
session_info->uid = uid;
session_info->gid = gid;
session_info->trigger_list = trigger_list;
session_info->uid = uid;
session_info->gid = gid;
session_info->trigger_list = trigger_list;
+ session_info->sessions_ht = sessions_ht;
end:
return session_info;
error:
end:
return session_info;
error:
sessions_ht_node);
assert(session->uid == uid);
assert(session->gid == gid);
sessions_ht_node);
assert(session->uid == uid);
assert(session->gid == gid);
+ session_info_get(session);
+ goto end;
}
trigger_list = lttng_session_trigger_list_build(state, name);
}
trigger_list = lttng_session_trigger_list_build(state, name);
- session = session_info_create(name, uid, gid, trigger_list);
+ session = session_info_create(name, uid, gid, trigger_list,
+ state->sessions_ht);
if (!session) {
ERR("[notification-thread] Failed to allocation session info for session \"%s\" (uid = %i, gid = %i)",
name, uid, gid);
if (!session) {
ERR("[notification-thread] Failed to allocation session info for session \"%s\" (uid = %i, gid = %i)",
name, uid, gid);
cds_lfht_add(state->sessions_ht, hash_key_str(name, lttng_ht_seed),
&session->sessions_ht_node);
cds_lfht_add(state->sessions_ht, hash_key_str(name, lttng_ht_seed),
&session->sessions_ht_node);
rcu_read_unlock();
return session;
error:
rcu_read_unlock();
return session;
error:
hash_channel_key(&new_channel_info->key),
&channel_trigger_list->channel_triggers_ht_node);
rcu_read_unlock();
hash_channel_key(&new_channel_info->key),
&channel_trigger_list->channel_triggers_ht_node);
rcu_read_unlock();
+ session_info_put(session_info);
*cmd_result = LTTNG_OK;
return 0;
error:
*cmd_result = LTTNG_OK;
return 0;
error:
struct lttng_session_trigger_list *trigger_list;
/* Node in the notification thread state's sessions_ht. */
struct cds_lfht_node sessions_ht_node;
struct lttng_session_trigger_list *trigger_list;
/* Node in the notification thread state's sessions_ht. */
struct cds_lfht_node sessions_ht_node;
+ /*
+ * Weak reference to the thread state's sessions_ht. Used for removal on
+ * destruction.
+ */
+ struct cds_lfht *sessions_ht;
uint64_t consumed_data_size;
struct {
/* Whether a rotation is ongoing for this session. */
uint64_t consumed_data_size;
struct {
/* Whether a rotation is ongoing for this session. */