From: Jérémie Galarneau Date: Thu, 6 Dec 2018 14:39:02 +0000 (-0500) Subject: Rename ust-thread to notify-apps X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=commitdiff_plain;h=f9d2ba6ae32397fd818279ea90d3691c60f0e079 Rename ust-thread to notify-apps Signed-off-by: Jérémie Galarneau --- diff --git a/src/bin/lttng-sessiond/Makefile.am b/src/bin/lttng-sessiond/Makefile.am index fba2a5a1c..9800c4b2c 100644 --- a/src/bin/lttng-sessiond/Makefile.am +++ b/src/bin/lttng-sessiond/Makefile.am @@ -10,7 +10,7 @@ bin_PROGRAMS = lttng-sessiond lttng_sessiond_SOURCES = utils.c utils.h \ trace-kernel.c trace-kernel.h \ kernel.c kernel.h \ - ust-ctl.h ust-app.h trace-ust.h ust-thread.h \ + ust-ctl.h ust-app.h trace-ust.h notify-apps.h \ ust-registry.h \ context.c context.h \ channel.c channel.h \ @@ -53,7 +53,7 @@ lttng_sessiond_SOURCES = utils.c utils.h \ if HAVE_LIBLTTNG_UST_CTL lttng_sessiond_SOURCES += trace-ust.c ust-registry.c ust-app.c \ - ust-consumer.c ust-consumer.h ust-thread.c \ + ust-consumer.c ust-consumer.h notify-apps.c \ ust-metadata.c ust-clock.h agent-thread.c agent-thread.h \ ust-field-utils.h ust-field-utils.c endif diff --git a/src/bin/lttng-sessiond/main.c b/src/bin/lttng-sessiond/main.c index d6bc01598..5f7600c0c 100644 --- a/src/bin/lttng-sessiond/main.c +++ b/src/bin/lttng-sessiond/main.c @@ -69,7 +69,7 @@ #include "fd-limit.h" #include "health-sessiond.h" #include "testpoint.h" -#include "ust-thread.h" +#include "notify-apps.h" #include "agent-thread.h" #include "save.h" #include "notification-thread.h" diff --git a/src/bin/lttng-sessiond/notify-apps.c b/src/bin/lttng-sessiond/notify-apps.c new file mode 100644 index 000000000..fee184345 --- /dev/null +++ b/src/bin/lttng-sessiond/notify-apps.c @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2013 - David Goulet + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License, version 2 only, as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#define _LGPL_SOURCE +#include + +#include +#include + +#include "fd-limit.h" +#include "lttng-sessiond.h" +#include "notify-apps.h" +#include "health-sessiond.h" +#include "testpoint.h" +#include "utils.h" +#include "thread.h" + +struct thread_notifiers { + struct lttng_pipe *quit_pipe; + int apps_cmd_notify_pipe_read_fd; +}; + +/* + * This thread manage application notify communication. + */ +static void *thread_application_notification(void *data) +{ + int i, ret, pollfd, err = -1; + ssize_t size_ret; + uint32_t revents, nb_fd; + struct lttng_poll_event events; + struct thread_notifiers *notifiers = data; + const int quit_pipe_read_fd = lttng_pipe_get_readfd(notifiers->quit_pipe); + + DBG("[ust-thread] Manage application notify command"); + + rcu_register_thread(); + rcu_thread_online(); + + health_register(health_sessiond, + HEALTH_SESSIOND_TYPE_APP_MANAGE_NOTIFY); + + if (testpoint(sessiond_thread_app_manage_notify)) { + goto error_testpoint; + } + + health_code_update(); + + ret = lttng_poll_create(&events, 2, LTTNG_CLOEXEC); + if (ret < 0) { + goto error_poll_create; + } + + /* Add notify pipe to the pollset. */ + ret = lttng_poll_add(&events, notifiers->apps_cmd_notify_pipe_read_fd, + LPOLLIN | LPOLLERR | LPOLLHUP | LPOLLRDHUP); + if (ret < 0) { + goto error; + } + + ret = lttng_poll_add(&events, quit_pipe_read_fd, + LPOLLIN | LPOLLERR); + if (ret < 0) { + goto error; + } + + health_code_update(); + + while (1) { + 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) { + /* + * Restart interrupted system call. + */ + if (errno == EINTR) { + goto restart; + } + goto error; + } + + 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); + + if (!revents) { + /* No activity for this FD (poll implementation). */ + continue; + } + + /* Thread quit pipe has been closed. Killing thread. */ + if (pollfd == quit_pipe_read_fd) { + err = 0; + goto exit; + } else if (pollfd == notifiers->apps_cmd_notify_pipe_read_fd) { + /* Inspect the apps cmd pipe */ + int sock; + + if (revents & LPOLLIN) { + /* Get socket from dispatch thread. */ + size_ret = lttng_read(notifiers->apps_cmd_notify_pipe_read_fd, + &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); + if (ret < 0) { + /* + * It's possible we've reached the max poll fd allowed. + * Let's close the socket but continue normal execution. + */ + ret = close(sock); + if (ret) { + PERROR("close notify socket %d", sock); + } + lttng_fd_put(LTTNG_FD_APPS, 1); + continue; + } + DBG3("UST thread notify added sock %d to pollset", sock); + } else if (revents & (LPOLLERR | LPOLLHUP | LPOLLRDHUP)) { + ERR("Apps notify command pipe error"); + goto error; + } else { + ERR("Unexpected poll events %u for sock %d", revents, pollfd); + goto error; + } + } else { + /* + * At this point, we know that a registered application + * triggered the event. + */ + if (revents & (LPOLLIN | LPOLLPRI)) { + ret = ust_app_recv_notify(pollfd); + if (ret < 0) { + /* Removing from the poll set */ + ret = lttng_poll_del(&events, pollfd); + if (ret < 0) { + goto error; + } + + /* The socket is closed after a grace period here. */ + ust_app_notify_sock_unregister(pollfd); + } + } else if (revents & (LPOLLERR | LPOLLHUP | LPOLLRDHUP)) { + /* Removing from the poll set */ + ret = lttng_poll_del(&events, pollfd); + if (ret < 0) { + goto error; + } + + /* The socket is closed after a grace period here. */ + ust_app_notify_sock_unregister(pollfd); + } else { + ERR("Unexpected poll events %u for sock %d", revents, pollfd); + goto error; + } + health_code_update(); + } + } + } + +exit: +error: + lttng_poll_clean(&events); +error_poll_create: +error_testpoint: + + 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; +} + +static bool shutdown_application_notification_thread(void *data) +{ + struct thread_notifiers *notifiers = data; + const int write_fd = lttng_pipe_get_writefd(notifiers->quit_pipe); + + return notify_thread_pipe(write_fd) == 1; +} + +static void cleanup_application_notification_thread(void *data) +{ + struct thread_notifiers *notifiers = data; + + lttng_pipe_destroy(notifiers->quit_pipe); + free(notifiers); +} + +bool launch_application_notification_thread(int apps_cmd_notify_pipe_read_fd) +{ + struct lttng_thread *thread; + struct thread_notifiers *notifiers; + struct lttng_pipe *quit_pipe; + + notifiers = zmalloc(sizeof(*notifiers)); + if (!notifiers) { + goto error; + } + notifiers->apps_cmd_notify_pipe_read_fd = apps_cmd_notify_pipe_read_fd; + + quit_pipe = lttng_pipe_open(FD_CLOEXEC); + if (!quit_pipe) { + goto error; + } + notifiers->quit_pipe = quit_pipe; + + thread = lttng_thread_create("Application notification", + thread_application_notification, + shutdown_application_notification_thread, + cleanup_application_notification_thread, + notifiers); + if (!thread) { + goto error; + } + lttng_thread_put(thread); + return true; +error: + cleanup_application_notification_thread(notifiers); + return false; +} diff --git a/src/bin/lttng-sessiond/notify-apps.h b/src/bin/lttng-sessiond/notify-apps.h new file mode 100644 index 000000000..19cbe4fcd --- /dev/null +++ b/src/bin/lttng-sessiond/notify-apps.h @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2013 - David Goulet + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License, version 2 only, as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef UST_THREAD_H +#define UST_THREAD_H + +#ifdef HAVE_LIBLTTNG_UST_CTL + +bool launch_application_notification_thread(int apps_cmd_notify_pipe_read_fd); + +#else /* HAVE_LIBLTTNG_UST_CTL */ + +bool launch_application_notification_thread(int apps_cmd_notify_pipe_read_fd) +{ + return true; +} + +#endif /* HAVE_LIBLTTNG_UST_CTL */ + +#endif /* UST_THREAD_H */ diff --git a/src/bin/lttng-sessiond/ust-thread.c b/src/bin/lttng-sessiond/ust-thread.c deleted file mode 100644 index b53b07241..000000000 --- a/src/bin/lttng-sessiond/ust-thread.c +++ /dev/null @@ -1,256 +0,0 @@ -/* - * Copyright (C) 2013 - David Goulet - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License, version 2 only, as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., 51 - * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#define _LGPL_SOURCE -#include - -#include -#include - -#include "fd-limit.h" -#include "lttng-sessiond.h" -#include "ust-thread.h" -#include "health-sessiond.h" -#include "testpoint.h" -#include "utils.h" -#include "thread.h" - -struct thread_notifiers { - struct lttng_pipe *quit_pipe; - int apps_cmd_notify_pipe_read_fd; -}; - -/* - * This thread manage application notify communication. - */ -static void *thread_application_notification(void *data) -{ - int i, ret, pollfd, err = -1; - ssize_t size_ret; - uint32_t revents, nb_fd; - struct lttng_poll_event events; - struct thread_notifiers *notifiers = data; - const int quit_pipe_read_fd = lttng_pipe_get_readfd(notifiers->quit_pipe); - - DBG("[ust-thread] Manage application notify command"); - - rcu_register_thread(); - rcu_thread_online(); - - health_register(health_sessiond, - HEALTH_SESSIOND_TYPE_APP_MANAGE_NOTIFY); - - if (testpoint(sessiond_thread_app_manage_notify)) { - goto error_testpoint; - } - - health_code_update(); - - ret = lttng_poll_create(&events, 2, LTTNG_CLOEXEC); - if (ret < 0) { - goto error_poll_create; - } - - /* Add notify pipe to the pollset. */ - ret = lttng_poll_add(&events, notifiers->apps_cmd_notify_pipe_read_fd, - LPOLLIN | LPOLLERR | LPOLLHUP | LPOLLRDHUP); - if (ret < 0) { - goto error; - } - - ret = lttng_poll_add(&events, quit_pipe_read_fd, - LPOLLIN | LPOLLERR); - if (ret < 0) { - goto error; - } - - health_code_update(); - - while (1) { - 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) { - /* - * Restart interrupted system call. - */ - if (errno == EINTR) { - goto restart; - } - goto error; - } - - 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); - - if (!revents) { - /* No activity for this FD (poll implementation). */ - continue; - } - - /* Thread quit pipe has been closed. Killing thread. */ - if (pollfd == quit_pipe_read_fd) { - err = 0; - goto exit; - } else if (pollfd == notifiers->apps_cmd_notify_pipe_read_fd) { - /* Inspect the apps cmd pipe */ - int sock; - - if (revents & LPOLLIN) { - /* Get socket from dispatch thread. */ - size_ret = lttng_read(notifiers->apps_cmd_notify_pipe_read_fd, - &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); - if (ret < 0) { - /* - * It's possible we've reached the max poll fd allowed. - * Let's close the socket but continue normal execution. - */ - ret = close(sock); - if (ret) { - PERROR("close notify socket %d", sock); - } - lttng_fd_put(LTTNG_FD_APPS, 1); - continue; - } - DBG3("UST thread notify added sock %d to pollset", sock); - } else if (revents & (LPOLLERR | LPOLLHUP | LPOLLRDHUP)) { - ERR("Apps notify command pipe error"); - goto error; - } else { - ERR("Unexpected poll events %u for sock %d", revents, pollfd); - goto error; - } - } else { - /* - * At this point, we know that a registered application - * triggered the event. - */ - if (revents & (LPOLLIN | LPOLLPRI)) { - ret = ust_app_recv_notify(pollfd); - if (ret < 0) { - /* Removing from the poll set */ - ret = lttng_poll_del(&events, pollfd); - if (ret < 0) { - goto error; - } - - /* The socket is closed after a grace period here. */ - ust_app_notify_sock_unregister(pollfd); - } - } else if (revents & (LPOLLERR | LPOLLHUP | LPOLLRDHUP)) { - /* Removing from the poll set */ - ret = lttng_poll_del(&events, pollfd); - if (ret < 0) { - goto error; - } - - /* The socket is closed after a grace period here. */ - ust_app_notify_sock_unregister(pollfd); - } else { - ERR("Unexpected poll events %u for sock %d", revents, pollfd); - goto error; - } - health_code_update(); - } - } - } - -exit: -error: - lttng_poll_clean(&events); -error_poll_create: -error_testpoint: - - 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; -} - -static bool shutdown_application_notification_thread(void *data) -{ - struct thread_notifiers *notifiers = data; - const int write_fd = lttng_pipe_get_writefd(notifiers->quit_pipe); - - return notify_thread_pipe(write_fd) == 1; -} - -static void cleanup_application_notification_thread(void *data) -{ - struct thread_notifiers *notifiers = data; - - lttng_pipe_destroy(notifiers->quit_pipe); - free(notifiers); -} - -bool launch_application_notification_thread(int apps_cmd_notify_pipe_read_fd) -{ - struct lttng_thread *thread; - struct thread_notifiers *notifiers; - struct lttng_pipe *quit_pipe; - - notifiers = zmalloc(sizeof(*notifiers)); - if (!notifiers) { - goto error; - } - notifiers->apps_cmd_notify_pipe_read_fd = apps_cmd_notify_pipe_read_fd; - - quit_pipe = lttng_pipe_open(FD_CLOEXEC); - if (!quit_pipe) { - goto error; - } - notifiers->quit_pipe = quit_pipe; - - thread = lttng_thread_create("Application notification", - thread_application_notification, - shutdown_application_notification_thread, - cleanup_application_notification_thread, - notifiers); - if (!thread) { - goto error; - } - lttng_thread_put(thread); - return true; -error: - cleanup_application_notification_thread(notifiers); - return false; -} diff --git a/src/bin/lttng-sessiond/ust-thread.h b/src/bin/lttng-sessiond/ust-thread.h deleted file mode 100644 index 19cbe4fcd..000000000 --- a/src/bin/lttng-sessiond/ust-thread.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2013 - David Goulet - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License, version 2 only, as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., 51 - * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#ifndef UST_THREAD_H -#define UST_THREAD_H - -#ifdef HAVE_LIBLTTNG_UST_CTL - -bool launch_application_notification_thread(int apps_cmd_notify_pipe_read_fd); - -#else /* HAVE_LIBLTTNG_UST_CTL */ - -bool launch_application_notification_thread(int apps_cmd_notify_pipe_read_fd) -{ - return true; -} - -#endif /* HAVE_LIBLTTNG_UST_CTL */ - -#endif /* UST_THREAD_H */ diff --git a/tests/unit/Makefile.am b/tests/unit/Makefile.am index d6a87d5cd..b2804f697 100644 --- a/tests/unit/Makefile.am +++ b/tests/unit/Makefile.am @@ -81,7 +81,7 @@ SESSIOND_OBJS += $(top_builddir)/src/bin/lttng-sessiond/trace-ust.$(OBJEXT) \ $(top_builddir)/src/bin/lttng-sessiond/ust-registry.$(OBJEXT) \ $(top_builddir)/src/bin/lttng-sessiond/ust-app.$(OBJEXT) \ $(top_builddir)/src/bin/lttng-sessiond/ust-consumer.$(OBJEXT) \ - $(top_builddir)/src/bin/lttng-sessiond/ust-thread.$(OBJEXT) \ + $(top_builddir)/src/bin/lttng-sessiond/notify-apps.$(OBJEXT) \ $(top_builddir)/src/bin/lttng-sessiond/ust-metadata.$(OBJEXT) \ $(top_builddir)/src/bin/lttng-sessiond/agent-thread.$(OBJEXT) \ $(top_builddir)/src/bin/lttng-sessiond/ust-field-utils.$(OBJEXT)