#include "fd-limit.h"
#include "lttng-sessiond.h"
#include "ust-thread.h"
+#include "health.h"
/*
* This thread manage application notify communication.
*/
void *ust_thread_manage_notify(void *data)
{
- int i, ret, pollfd;
+ int i, ret, pollfd, err = -1;
uint32_t revents, nb_fd;
struct lttng_poll_event events;
rcu_register_thread();
rcu_thread_online();
+ health_register(HEALTH_TYPE_APP_MANAGE_NOTIFY);
+
+ health_code_update();
+
ret = sessiond_set_thread_pollset(&events, 2);
if (ret < 0) {
goto error_poll_create;
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.
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);
/* Thread quit pipe has been closed. Killing thread. */
ret = sessiond_check_thread_quit_pipe(pollfd, revents);
if (ret) {
+ err = 0;
goto exit;
}
PERROR("read apps notify pipe");
goto error;
}
+ health_code_update();
ret = lttng_poll_add(&events, sock,
LPOLLIN | LPOLLERR | LPOLLHUP | LPOLLRDHUP);
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();
}
}
}
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();
rcu_thread_offline();
rcu_unregister_thread();
return NULL;