Fix: Check for NULL hash tables on relay daemon teardown
[lttng-tools.git] / src / bin / lttng-relayd / session.c
index 14ae874ea782ef45624447659d988c1bd3a05258..d1c2098f8591a3a8c9c5e87b022f43e8fff627ee 100644 (file)
@@ -17,7 +17,6 @@
  * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
  * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#define _GNU_SOURCE
 #define _LGPL_SOURCE
 #include <common/common.h>
 #include <urcu/rculist.h>
 #define _LGPL_SOURCE
 #include <common/common.h>
 #include <urcu/rculist.h>
@@ -131,7 +130,14 @@ static void rcu_destroy_session(struct rcu_head *rcu_head)
        struct relay_session *session =
                        caa_container_of(rcu_head, struct relay_session,
                                rcu_node);
        struct relay_session *session =
                        caa_container_of(rcu_head, struct relay_session,
                                rcu_node);
-
+       /*
+        * Since each trace has a reference on the session, it means
+        * that if we are at the point where we teardown the session, no
+        * trace belonging to that session exist at this point.
+        * Calling lttng_ht_destroy in call_rcu worker thread so we
+        * don't hold the RCU read-side lock while calling it.
+        */
+       lttng_ht_destroy(session->ctf_traces_ht);
        free(session);
 }
 
        free(session);
 }
 
@@ -155,12 +161,6 @@ static void destroy_session(struct relay_session *session)
 
        ret = session_delete(session);
        assert(!ret);
 
        ret = session_delete(session);
        assert(!ret);
-       /*
-        * Since each trace has a reference on the session, it means
-        * that if we are at the point where we teardown the session, no
-        * trace belonging to that session exist at this point.
-        */
-       lttng_ht_destroy(session->ctf_traces_ht);
        call_rcu(&session->rcu_node, rcu_destroy_session);
 }
 
        call_rcu(&session->rcu_node, rcu_destroy_session);
 }
 
@@ -230,6 +230,10 @@ void print_sessions(void)
        struct lttng_ht_iter iter;
        struct relay_session *session;
 
        struct lttng_ht_iter iter;
        struct relay_session *session;
 
+       if (!sessions_ht) {
+               return;
+       }
+
        rcu_read_lock();
        cds_lfht_for_each_entry(sessions_ht->ht, &iter.iter, session,
                        session_n.node) {
        rcu_read_lock();
        cds_lfht_for_each_entry(sessions_ht->ht, &iter.iter, session,
                        session_n.node) {
This page took 0.023642 seconds and 4 git commands to generate.