Fix missing events for all threads pollfd struct
[lttng-tools.git] / ltt-sessiond / main.c
index 85ac06be9e32c2967417513b7902d2b226b303ba..d61cd7bc512f3c7dbb682950e55ff448db0507f4 100644 (file)
@@ -567,6 +567,8 @@ static int update_kernel_pollfd(void)
 
        /* Adding the quit pipe */
        kernel_pollfd[nb_fd - 1].fd = thread_quit_pipe[0];
+       kernel_pollfd[nb_fd - 1].events =
+               POLLHUP | POLLNVAL | POLLERR | POLLIN | POLLRDHUP | POLLPRI;
 
        return nb_fd;
 
@@ -667,6 +669,8 @@ static void *thread_manage_kernel(void *data)
                        goto error;
                } else if (ret == 0) {
                        /* Should not happen since timeout is infinite */
+                       ERR("Return value of poll is 0 with an infinite timeout.\n"
+                               "This should not have happened! Continuing...");
                        continue;
                }
 
@@ -860,6 +864,9 @@ static int update_apps_cmd_pollfd(unsigned int nb_fd, unsigned int old_nb_fd,
 
        /* First fd is always the quit pipe */
        (*pollfd)[0].fd = thread_quit_pipe[0];
+       (*pollfd)[0].events =
+               POLLHUP | POLLNVAL | POLLERR | POLLIN | POLLRDHUP | POLLPRI;
+
        /* Apps command pipe */
        (*pollfd)[1].fd = apps_cmd_pipe[0];
        (*pollfd)[1].events = POLLIN;
@@ -880,6 +887,16 @@ static int update_apps_cmd_pollfd(unsigned int nb_fd, unsigned int old_nb_fd,
                }
        }
 
+       if (nb_fd < 2) {
+               /*
+                * There should *always* be at least two fds in the pollfd. This safety
+                * check make sure the poll() will actually try on those two pipes at
+                * best which are the thread_quit_pipe and apps_cmd_pipe.
+                */
+               nb_fd = 2;
+               MSG("nb_fd < 2 --> Not good! Continuing...");
+       }
+
        /* Destroy old pollfd */
        free(old_pollfd);
 
@@ -899,7 +916,7 @@ error:
  */
 static void *thread_manage_apps(void *data)
 {
-       int i, ret, count;
+       int i, ret, current_nb_fd;
        unsigned int nb_fd = 2;
        int update_poll_flag = 1;
        struct pollfd *pollfd = NULL;
@@ -908,6 +925,7 @@ static void *thread_manage_apps(void *data)
        DBG("[thread] Manage application started");
 
        ust_cmd.sock = -1;
+       current_nb_fd = nb_fd;
 
        while (1) {
                /* See if we have a valid socket to add to pollfd */
@@ -918,7 +936,7 @@ static void *thread_manage_apps(void *data)
 
                /* The pollfd struct must be updated */
                if (update_poll_flag) {
-                       ret = update_apps_cmd_pollfd(nb_fd, ARRAY_SIZE(pollfd), &pollfd);
+                       ret = update_apps_cmd_pollfd(nb_fd, current_nb_fd, &pollfd);
                        if (ret < 0) {
                                /* malloc failed so we quit */
                                goto error;
@@ -978,8 +996,8 @@ static void *thread_manage_apps(void *data)
                        }
                }
 
-               count = nb_fd;
-               for (i = 2; i < count; i++) {
+               current_nb_fd = nb_fd;
+               for (i = 2; i < current_nb_fd; i++) {
                        /* Apps socket is closed/hungup */
                        switch (pollfd[i].revents) {
                        case POLLERR:
@@ -994,7 +1012,7 @@ static void *thread_manage_apps(void *data)
                        }
                }
 
-               if (nb_fd != count) {
+               if (nb_fd != current_nb_fd) {
                        update_poll_flag = 1;
                }
        }
@@ -1095,6 +1113,8 @@ static void *thread_registration_apps(void *data)
 
        /* First fd is always the quit pipe */
        pollfd[0].fd = thread_quit_pipe[0];
+       pollfd[0].events =
+               POLLHUP | POLLNVAL | POLLERR | POLLIN | POLLRDHUP | POLLPRI;
 
        /* Apps socket */
        pollfd[1].fd = apps_sock;
@@ -2609,6 +2629,8 @@ static void *thread_manage_clients(void *data)
 
        /* First fd is always the quit pipe */
        pollfd[0].fd = thread_quit_pipe[0];
+       pollfd[0].events =
+               POLLHUP | POLLNVAL | POLLERR | POLLIN | POLLRDHUP | POLLPRI;
 
        /* Apps socket */
        pollfd[1].fd = client_sock;
This page took 0.024186 seconds and 4 git commands to generate.