}
/*
- * Remove a ltt_session from the ltt_sessions_ht_by_id/name.
+ * Remove a ltt_session from the ltt_sessions_ht_by_id.
* If empty, the ltt_sessions_ht_by_id/name HTs are freed.
* The session list lock must be held.
*/
ret = lttng_ht_del(ltt_sessions_ht_by_id, &iter);
LTTNG_ASSERT(!ret);
- iter.iter.node = &ls->node_by_name.node;
- ret = lttng_ht_del(ltt_sessions_ht_by_name, &iter);
- LTTNG_ASSERT(!ret);
-
if (ltt_sessions_ht_empty()) {
DBG("Empty ltt_sessions_ht_by_id/name, destroying hast tables");
ltt_sessions_ht_destroy();
*/
void session_destroy(struct ltt_session *session)
{
+ int ret;
+ struct lttng_ht_iter iter;
+
LTTNG_ASSERT(!session->destroyed);
session->destroyed = true;
+
+ /*
+ * Remove immediately from the "session by name" hash table. Only one
+ * session is expected to exist with a given name for at any given time.
+ *
+ * Even if a session still technically exists for a little while longer,
+ * there is no point in performing action on a "destroyed" session.
+ */
+ iter.iter.node = &session->node_by_name.node;
+ ret = lttng_ht_del(ltt_sessions_ht_by_name, &iter);
+ LTTNG_ASSERT(!ret);
+
session_put(session);
}