Use lttng_read/lttng_write wrappers
[lttng-tools.git] / src / bin / lttng-sessiond / ust-thread.c
index 76d6ef99da84d31c77f89ef02de72d18931940f6..0248d7a0aa305a17cfba12cb8ceb60deb2266472 100644 (file)
 #include "fd-limit.h"
 #include "lttng-sessiond.h"
 #include "ust-thread.h"
+#include "health-sessiond.h"
 
 /*
  * This thread manage application notify communication.
  */
 void *ust_thread_manage_notify(void *data)
 {
-       int i, ret, pollfd;
+       int i, ret, pollfd, err = -1;
+       ssize_t size_ret;
        uint32_t revents, nb_fd;
        struct lttng_poll_event events;
 
@@ -38,6 +40,11 @@ void *ust_thread_manage_notify(void *data)
        rcu_register_thread();
        rcu_thread_online();
 
+       health_register(health_sessiond,
+               HEALTH_SESSIOND_TYPE_APP_MANAGE_NOTIFY);
+
+       health_code_update();
+
        ret = sessiond_set_thread_pollset(&events, 2);
        if (ret < 0) {
                goto error_poll_create;
@@ -49,13 +56,17 @@ void *ust_thread_manage_notify(void *data)
                goto error;
        }
 
+       health_code_update();
+
        while (1) {
                DBG3("[ust-thread] Manage notify polling on %d fds",
                                LTTNG_POLL_GETNB(&events));
 
                /* Inifinite blocking call, waiting for transmission */
 restart:
+               health_poll_entry();
                ret = lttng_poll_wait(&events, -1);
+               health_poll_exit();
                if (ret < 0) {
                        /*
                         * Restart interrupted system call.
@@ -69,6 +80,8 @@ restart:
                nb_fd = ret;
 
                for (i = 0; i < nb_fd; i++) {
+                       health_code_update();
+
                        /* Fetch once the poll data */
                        revents = LTTNG_POLL_GETEV(&events, i);
                        pollfd = LTTNG_POLL_GETFD(&events, i);
@@ -76,6 +89,7 @@ restart:
                        /* Thread quit pipe has been closed. Killing thread. */
                        ret = sessiond_check_thread_quit_pipe(pollfd, revents);
                        if (ret) {
+                               err = 0;
                                goto exit;
                        }
 
@@ -92,14 +106,14 @@ 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;
                                }
+                               health_code_update();
 
                                ret = lttng_poll_add(&events, sock,
                                                LPOLLIN | LPOLLERR | LPOLLHUP | LPOLLRDHUP);
@@ -128,29 +142,26 @@ restart:
                                                goto error;
                                        }
 
-                                       ret = close(pollfd);
-                                       if (ret < 0) {
-                                               PERROR("close sock %d", pollfd);
-                                       }
-                                       lttng_fd_put(LTTNG_FD_APPS, 1);
+                                       /* The socket is closed after a grace period here. */
+                                       ust_app_notify_sock_unregister(pollfd);
                                } else if (revents & (LPOLLIN | LPOLLPRI)) {
                                        ret = ust_app_recv_notify(pollfd);
                                        if (ret < 0) {
-                                               ret = lttng_poll_del(&events, pollfd);
-                                               if (ret < 0) {
-                                                       goto error;
-                                               }
-
-                                               ret = close(pollfd);
-                                               if (ret < 0) {
-                                                       PERROR("close sock %d", pollfd);
-                                               }
-                                               lttng_fd_put(LTTNG_FD_APPS, 1);
+                                               /*
+                                                * If the notification failed either the application is
+                                                * dead or an internal error happened. In both cases,
+                                                * we can only continue here. If the application is
+                                                * dead, an unregistration will follow or else the
+                                                * application will notice that we are not responding
+                                                * on that socket and will close it.
+                                                */
+                                               continue;
                                        }
                                } else {
                                        ERR("Unknown poll events %u for sock %d", revents, pollfd);
                                        continue;
                                }
+                               health_code_update();
                        }
                }
        }
@@ -162,6 +173,11 @@ error_poll_create:
        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");
+       if (err) {
+               health_error();
+               ERR("Health error occurred in %s", __func__);
+       }
+       health_unregister(health_sessiond);
        rcu_thread_offline();
        rcu_unregister_thread();
        return NULL;
This page took 0.025274 seconds and 4 git commands to generate.