Clean-up: sessiond: prepend `the_` to global variable names
[lttng-tools.git] / src / bin / lttng-sessiond / notification-thread.c
index 1ba724337b67ee69a1856087a5c8b65c45a32cd8..56f1124fbfbfbde93c7a1ba9959182221e58095d 100644 (file)
@@ -27,6 +27,7 @@
 #include "lttng-sessiond.h"
 #include "health-sessiond.h"
 #include "thread.h"
+#include "testpoint.h"
 
 #include "kernel.h"
 #include <common/kernel-ctl/kernel-ctl.h>
@@ -35,6 +36,8 @@
 #include <urcu/list.h>
 #include <urcu/rculfhash.h>
 
+
+int notifier_consumption_paused;
 /*
  * Destroy the thread data previously created by the init function.
  */
@@ -235,8 +238,8 @@ int notification_channel_socket_create(void)
        if (getuid() == 0) {
                gid_t gid;
 
-               ret =  utils_get_group_id(config.tracing_group_name.value, true,
-                               &gid);
+               ret = utils_get_group_id(the_config.tracing_group_name.value,
+                               true, &gid);
                if (ret) {
                        /* Default to root group. */
                        gid = 0;
@@ -510,6 +513,9 @@ int init_thread_state(struct notification_thread_handle *handle,
        if (!state->executor) {
                goto error;
        }
+
+       state->restart_poll = false;
+
        mark_thread_as_ready(handle);
 end:
        return 0;
@@ -571,6 +577,17 @@ static int handle_event_notification_pipe(int event_source_fd,
                goto end;
        }
 
+       if (testpoint(sessiond_handle_notifier_event_pipe)) {
+               ret = 0;
+               goto end;
+       }
+
+       if (caa_unlikely(notifier_consumption_paused)) {
+               DBG("Event notifier notification consumption paused, sleeping...");
+               sleep(1);
+               goto end;
+       }
+
        ret = handle_notification_thread_event_notification(
                        state, event_source_fd, domain);
        if (ret) {
@@ -579,6 +596,7 @@ static int handle_event_notification_pipe(int event_source_fd,
                ret = -1;
                goto end;
        }
+
 end:
        return ret;
 }
@@ -621,7 +639,7 @@ void *thread_notification(void *data)
 
        DBG("[notification-thread] Started notification thread");
 
-       health_register(health_sessiond, HEALTH_SESSIOND_TYPE_NOTIFICATION);
+       health_register(the_health_sessiond, HEALTH_SESSIOND_TYPE_NOTIFICATION);
        rcu_register_thread();
        rcu_thread_online();
 
@@ -637,6 +655,10 @@ void *thread_notification(void *data)
                goto end;
        }
 
+       if (testpoint(sessiond_thread_notification)) {
+               goto end;
+       }
+
        while (true) {
                int fd_count, i;
 
@@ -656,6 +678,12 @@ void *thread_notification(void *data)
                        goto error;
                }
 
+               /*
+                * Reset restart_poll flag so that calls below might turn it
+                * on.
+                */
+               state.restart_poll = false;
+
                fd_count = ret;
                for (i = 0; i < fd_count; i++) {
                        int fd = LTTNG_POLL_GETFD(&state.events, i);
@@ -733,6 +761,15 @@ void *thread_notification(void *data)
                                        }
                                }
                        }
+
+                       /*
+                        * Calls above might have changed the state of the
+                        * FDs in `state.events`. Call _poll_wait() again to
+                        * ensure we have a consistent state.
+                        */
+                       if (state.restart_poll) {
+                               break;
+                       }
                }
        }
 exit:
@@ -741,7 +778,7 @@ error:
 end:
        rcu_thread_offline();
        rcu_unregister_thread();
-       health_unregister(health_sessiond);
+       health_unregister(the_health_sessiond);
        return NULL;
 }
 
This page took 0.024381 seconds and 4 git commands to generate.