Fix: use the poll wait ret value when iterating on fd(s)
[lttng-tools.git] / src / bin / lttng-sessiond / main.c
index 8a1f753114bfe3bfaa8cd5629ea5c7e199c29aab..f2cf2856a215d51406c8468f2fb1842b9c306067 100644 (file)
@@ -689,14 +689,14 @@ static void *thread_manage_kernel(void *data)
        char tmp;
        struct lttng_poll_event events;
 
-       DBG("Thread manage kernel started");
+       DBG("[thread] Thread manage kernel started");
 
-       testpoint(thread_manage_kernel);
+       if (testpoint(thread_manage_kernel)) {
+               goto error_testpoint;
+       }
 
        health_code_update(&health_thread_kernel);
 
-       testpoint(thread_manage_kernel_before_loop);
-
        ret = create_thread_poll_set(&events, 2);
        if (ret < 0) {
                goto error_poll_create;
@@ -707,6 +707,10 @@ static void *thread_manage_kernel(void *data)
                goto error;
        }
 
+       if (testpoint(thread_manage_kernel_before_loop)) {
+               goto error;
+       }
+
        while (1) {
                health_code_update(&health_thread_kernel);
 
@@ -724,12 +728,7 @@ static void *thread_manage_kernel(void *data)
                        update_poll_flag = 0;
                }
 
-               nb_fd = LTTNG_POLL_GETNB(&events);
-
-               DBG("Thread kernel polling on %d fds", nb_fd);
-
-               /* Zeroed the poll events */
-               lttng_poll_reset(&events);
+               DBG("Thread kernel polling on %d fds", events.nb_fd);
 
                /* Poll infinite value of time */
        restart:
@@ -751,6 +750,8 @@ static void *thread_manage_kernel(void *data)
                        continue;
                }
 
+               nb_fd = ret;
+
                for (i = 0; i < nb_fd; i++) {
                        /* Fetch once the poll data */
                        revents = LTTNG_POLL_GETEV(&events, i);
@@ -794,6 +795,7 @@ exit:
 error:
        lttng_poll_clean(&events);
 error_poll_create:
+error_testpoint:
        utils_close_pipe(kernel_poll_pipe);
        kernel_poll_pipe[0] = kernel_poll_pipe[1] = -1;
        if (err) {
@@ -881,15 +883,15 @@ static void *thread_manage_consumer(void *data)
                goto error;
        }
 
-       nb_fd = LTTNG_POLL_GETNB(&events);
-
        health_code_update(&consumer_data->health);
 
        /* Inifinite blocking call, waiting for transmission */
 restart:
        health_poll_update(&consumer_data->health);
 
-       testpoint(thread_manage_consumer);
+       if (testpoint(thread_manage_consumer)) {
+               goto error;
+       }
 
        ret = lttng_poll_wait(&events, -1);
        health_poll_update(&consumer_data->health);
@@ -903,6 +905,8 @@ restart:
                goto error;
        }
 
+       nb_fd = ret;
+
        for (i = 0; i < nb_fd; i++) {
                /* Fetch once the poll data */
                revents = LTTNG_POLL_GETEV(&events, i);
@@ -980,9 +984,6 @@ restart:
 
        health_code_update(&consumer_data->health);
 
-       /* Update number of fd */
-       nb_fd = LTTNG_POLL_GETNB(&events);
-
        /* Inifinite blocking call, waiting for transmission */
 restart_poll:
        health_poll_update(&consumer_data->health);
@@ -998,6 +999,8 @@ restart_poll:
                goto error;
        }
 
+       nb_fd = ret;
+
        for (i = 0; i < nb_fd; i++) {
                /* Fetch once the poll data */
                revents = LTTNG_POLL_GETEV(&events, i);
@@ -1093,11 +1096,13 @@ static void *thread_manage_apps(void *data)
 
        DBG("[thread] Manage application started");
 
-       testpoint(thread_manage_apps);
-
        rcu_register_thread();
        rcu_thread_online();
 
+       if (testpoint(thread_manage_apps)) {
+               goto error_testpoint;
+       }
+
        health_code_update(&health_thread_app_manage);
 
        ret = create_thread_poll_set(&events, 2);
@@ -1110,17 +1115,14 @@ static void *thread_manage_apps(void *data)
                goto error;
        }
 
-       testpoint(thread_manage_apps_before_loop);
+       if (testpoint(thread_manage_apps_before_loop)) {
+               goto error;
+       }
 
        health_code_update(&health_thread_app_manage);
 
        while (1) {
-               /* Zeroed the events structure */
-               lttng_poll_reset(&events);
-
-               nb_fd = LTTNG_POLL_GETNB(&events);
-
-               DBG("Apps thread polling on %d fds", nb_fd);
+               DBG("Apps thread polling on %d fds", events.nb_fd);
 
                /* Inifinite blocking call, waiting for transmission */
        restart:
@@ -1137,6 +1139,8 @@ static void *thread_manage_apps(void *data)
                        goto error;
                }
 
+               nb_fd = ret;
+
                for (i = 0; i < nb_fd; i++) {
                        /* Fetch once the poll data */
                        revents = LTTNG_POLL_GETEV(&events, i);
@@ -1250,6 +1254,7 @@ exit:
 error:
        lttng_poll_clean(&events);
 error_poll_create:
+error_testpoint:
        utils_close_pipe(apps_cmd_pipe);
        apps_cmd_pipe[0] = apps_cmd_pipe[1] = -1;
 
@@ -1358,7 +1363,9 @@ static void *thread_registration_apps(void *data)
 
        DBG("[thread] Manage application registration started");
 
-       testpoint(thread_registration_apps);
+       if (testpoint(thread_registration_apps)) {
+               goto error_testpoint;
+       }
 
        ret = lttcomm_listen_unix_sock(apps_sock);
        if (ret < 0) {
@@ -1391,8 +1398,6 @@ static void *thread_registration_apps(void *data)
        while (1) {
                DBG("Accepting application registration");
 
-               nb_fd = LTTNG_POLL_GETNB(&events);
-
                /* Inifinite blocking call, waiting for transmission */
        restart:
                health_poll_update(&health_thread_app_reg);
@@ -1408,6 +1413,8 @@ static void *thread_registration_apps(void *data)
                        goto error;
                }
 
+               nb_fd = ret;
+
                for (i = 0; i < nb_fd; i++) {
                        health_code_update(&health_thread_app_reg);
 
@@ -1513,7 +1520,6 @@ error:
                health_error(&health_thread_app_reg);
                ERR("Health error occurred in %s", __func__);
        }
-       health_exit(&health_thread_app_reg);
 
        /* Notify that the registration thread is gone */
        notify_ust_apps(0);
@@ -1537,7 +1543,9 @@ error_poll_add:
        lttng_poll_clean(&events);
 error_listen:
 error_create_poll:
+error_testpoint:
        DBG("UST Registration thread cleanup complete");
+       health_exit(&health_thread_app_reg);
 
        return NULL;
 }
@@ -2967,8 +2975,6 @@ static void *thread_manage_health(void *data)
        while (1) {
                DBG("Health check ready");
 
-               nb_fd = LTTNG_POLL_GETNB(&events);
-
                /* Inifinite blocking call, waiting for transmission */
 restart:
                ret = lttng_poll_wait(&events, -1);
@@ -2982,6 +2988,8 @@ restart:
                        goto error;
                }
 
+               nb_fd = ret;
+
                for (i = 0; i < nb_fd; i++) {
                        /* Fetch once the poll data */
                        revents = LTTNG_POLL_GETEV(&events, i);
@@ -3122,10 +3130,12 @@ static void *thread_manage_clients(void *data)
 
        DBG("[thread] Manage client started");
 
-       testpoint(thread_manage_clients);
-
        rcu_register_thread();
 
+       if (testpoint(thread_manage_clients)) {
+               goto error_testpoint;
+       }
+
        health_code_update(&health_thread_cmd);
 
        ret = lttcomm_listen_unix_sock(client_sock);
@@ -3155,15 +3165,15 @@ static void *thread_manage_clients(void *data)
                kill(ppid, SIGUSR1);
        }
 
-       testpoint(thread_manage_clients_before_loop);
+       if (testpoint(thread_manage_clients_before_loop)) {
+               goto error;
+       }
 
        health_code_update(&health_thread_cmd);
 
        while (1) {
                DBG("Accepting client command ...");
 
-               nb_fd = LTTNG_POLL_GETNB(&events);
-
                /* Inifinite blocking call, waiting for transmission */
        restart:
                health_poll_update(&health_thread_cmd);
@@ -3179,6 +3189,8 @@ static void *thread_manage_clients(void *data)
                        goto error;
                }
 
+               nb_fd = ret;
+
                for (i = 0; i < nb_fd; i++) {
                        /* Fetch once the poll data */
                        revents = LTTNG_POLL_GETEV(&events, i);
@@ -3330,6 +3342,7 @@ error:
 
 error_listen:
 error_create_poll:
+error_testpoint:
        unlink(client_unix_sock_path);
        if (client_sock >= 0) {
                ret = close(client_sock);
This page took 0.027547 seconds and 5 git commands to generate.