Fix: double RCU unlock on event_agent_disable_all
[lttng-tools.git] / src / bin / lttng-sessiond / ust-thread.c
index 85803e472217901a50eeec10e6ace02c3c426ca1..b421eb29560c2d780ddb705224ed52e382003f28 100644 (file)
@@ -15,6 +15,7 @@
  * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 #define _GNU_SOURCE
+#define _LGPL_SOURCE
 #include <assert.h>
 
 #include <common/common.h>
@@ -24,6 +25,7 @@
 #include "lttng-sessiond.h"
 #include "ust-thread.h"
 #include "health-sessiond.h"
+#include "testpoint.h"
 
 /*
  * This thread manage application notify communication.
@@ -31,6 +33,7 @@
 void *ust_thread_manage_notify(void *data)
 {
        int i, ret, pollfd, err = -1;
+       ssize_t size_ret;
        uint32_t revents, nb_fd;
        struct lttng_poll_event events;
 
@@ -42,6 +45,10 @@ void *ust_thread_manage_notify(void *data)
        health_register(health_sessiond,
                HEALTH_SESSIOND_TYPE_APP_MANAGE_NOTIFY);
 
+       if (testpoint(sessiond_thread_app_manage_notify)) {
+               goto error_testpoint;
+       }
+
        health_code_update();
 
        ret = sessiond_set_thread_pollset(&events, 2);
@@ -58,13 +65,14 @@ void *ust_thread_manage_notify(void *data)
        health_code_update();
 
        while (1) {
-               DBG3("[ust-thread] Manage notify polling on %d fds",
-                               LTTNG_POLL_GETNB(&events));
+               DBG3("[ust-thread] Manage notify polling");
 
                /* Inifinite blocking call, waiting for transmission */
 restart:
                health_poll_entry();
                ret = lttng_poll_wait(&events, -1);
+               DBG3("[ust-thread] Manage notify return from poll on %d fds",
+                               LTTNG_POLL_GETNB(&events));
                health_poll_exit();
                if (ret < 0) {
                        /*
@@ -85,6 +93,11 @@ restart:
                        revents = LTTNG_POLL_GETEV(&events, i);
                        pollfd = LTTNG_POLL_GETFD(&events, i);
 
+                       if (!revents) {
+                               /* No activity for this FD (poll implementation). */
+                               continue;
+                       }
+
                        /* Thread quit pipe has been closed. Killing thread. */
                        ret = sessiond_check_thread_quit_pipe(pollfd, revents);
                        if (ret) {
@@ -105,11 +118,10 @@ restart:
                                        goto error;
                                }
 
-                               do {
-                                       /* Get socket from dispatch thread. */
-                                       ret = read(apps_cmd_notify_pipe[0], &sock, sizeof(sock));
-                               } while (ret < 0 && errno == EINTR);
-                               if (ret < 0 || ret < sizeof(sock)) {
+                               /* Get socket from dispatch thread. */
+                               size_ret = lttng_read(apps_cmd_notify_pipe[0],
+                                               &sock, sizeof(sock));
+                               if (size_ret < sizeof(sock)) {
                                        PERROR("read apps notify pipe");
                                        goto error;
                                }
@@ -170,6 +182,7 @@ exit:
 error:
        lttng_poll_clean(&events);
 error_poll_create:
+error_testpoint:
        utils_close_pipe(apps_cmd_notify_pipe);
        apps_cmd_notify_pipe[0] = apps_cmd_notify_pipe[1] = -1;
        DBG("Application notify communication apps thread cleanup complete");
This page took 0.025133 seconds and 5 git commands to generate.