X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fnotification-thread.cpp;h=320e639d0468bf917af7e3327c868c211e10a48d;hb=4f2da8b8c0f8fad2ae35dbdb9f29769da52a3dc1;hp=e8a2adec9871eb07d68a37010bb479f8602a31c2;hpb=7966af5763c4aaca39df9bbfa9277ff15715c720;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/notification-thread.cpp b/src/bin/lttng-sessiond/notification-thread.cpp index e8a2adec9..320e639d0 100644 --- a/src/bin/lttng-sessiond/notification-thread.cpp +++ b/src/bin/lttng-sessiond/notification-thread.cpp @@ -7,37 +7,43 @@ #define _LGPL_SOURCE #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include +#include #include #include -#include "notification-thread.h" -#include "notification-thread-events.h" -#include "notification-thread-commands.h" -#include "lttng-sessiond.h" -#include "health-sessiond.h" -#include "thread.h" -#include "testpoint.h" +#include "notification-thread.hpp" +#include "notification-thread-events.hpp" +#include "notification-thread-commands.hpp" +#include "lttng-sessiond.hpp" +#include "health-sessiond.hpp" +#include "thread.hpp" +#include "testpoint.hpp" -#include "kernel.h" -#include +#include "kernel.hpp" +#include #include #include #include +/* + * Flag used to temporarily pause data consumption from testpoints. + * + * This variable is dlsym-ed from a test, so needs to be exported. + */ +LTTNG_EXPORT int notifier_consumption_paused; -int notifier_consumption_paused; /* * Destroy the thread data previously created by the init function. */ @@ -54,8 +60,11 @@ void notification_thread_handle_destroy( pthread_mutex_destroy(&handle->cmd_queue.lock); sem_destroy(&handle->ready); - if (handle->cmd_queue.event_pipe) { - lttng_pipe_destroy(handle->cmd_queue.event_pipe); + if (handle->cmd_queue.event_fd >= 0) { + ret = close(handle->cmd_queue.event_fd); + if (ret < 0) { + PERROR("Failed to close notification command queue event fd"); + } } if (handle->channel_monitoring_pipes.ust32_consumer >= 0) { ret = close(handle->channel_monitoring_pipes.ust32_consumer); @@ -87,23 +96,22 @@ struct notification_thread_handle *notification_thread_handle_create( { int ret; struct notification_thread_handle *handle; - struct lttng_pipe *event_pipe = NULL; + int event_fd = -1; - handle = (notification_thread_handle *) zmalloc(sizeof(*handle)); + handle = zmalloc(); if (!handle) { goto end; } sem_init(&handle->ready, 0, 0); - event_pipe = lttng_pipe_open(FD_CLOEXEC); - if (!event_pipe) { - ERR("event_pipe creation"); + event_fd = eventfd(0, EFD_CLOEXEC | EFD_SEMAPHORE); + if (event_fd < 0) { + PERROR("event_fd creation"); goto error; } - handle->cmd_queue.event_pipe = event_pipe; - event_pipe = NULL; + handle->cmd_queue.event_fd = event_fd; CDS_INIT_LIST_HEAD(&handle->cmd_queue.list); ret = pthread_mutex_init(&handle->cmd_queue.lock, NULL); @@ -145,7 +153,6 @@ struct notification_thread_handle *notification_thread_handle_create( end: return handle; error: - lttng_pipe_destroy(event_pipe); notification_thread_handle_destroy(handle); return NULL; } @@ -157,7 +164,7 @@ char *get_notification_channel_sock_path(void) bool is_root = !getuid(); char *sock_path; - sock_path = (char *) zmalloc(LTTNG_PATH_MAX); + sock_path = calloc(LTTNG_PATH_MAX); if (!sock_path) { goto error; } @@ -285,28 +292,24 @@ int init_poll_set(struct lttng_poll_event *poll_set, goto end; } - ret = lttng_poll_add(poll_set, notification_channel_socket, - LPOLLIN | LPOLLERR | LPOLLHUP | LPOLLRDHUP); + ret = lttng_poll_add(poll_set, notification_channel_socket, LPOLLIN | LPOLLRDHUP); if (ret < 0) { ERR("Failed to add notification channel socket to pollset"); goto error; } - ret = lttng_poll_add(poll_set, lttng_pipe_get_readfd(handle->cmd_queue.event_pipe), - LPOLLIN | LPOLLERR); + ret = lttng_poll_add(poll_set, handle->cmd_queue.event_fd, LPOLLIN); if (ret < 0) { ERR("Failed to add notification command queue event fd to pollset"); goto error; } ret = lttng_poll_add(poll_set, - handle->channel_monitoring_pipes.ust32_consumer, - LPOLLIN | LPOLLERR); + handle->channel_monitoring_pipes.ust32_consumer, LPOLLIN); if (ret < 0) { ERR("Failed to add ust-32 channel monitoring pipe fd to pollset"); goto error; } ret = lttng_poll_add(poll_set, - handle->channel_monitoring_pipes.ust64_consumer, - LPOLLIN | LPOLLERR); + handle->channel_monitoring_pipes.ust64_consumer, LPOLLIN); if (ret < 0) { ERR("Failed to add ust-64 channel monitoring pipe fd to pollset"); goto error; @@ -315,8 +318,7 @@ int init_poll_set(struct lttng_poll_event *poll_set, goto end; } ret = lttng_poll_add(poll_set, - handle->channel_monitoring_pipes.kernel_consumer, - LPOLLIN | LPOLLERR); + handle->channel_monitoring_pipes.kernel_consumer, LPOLLIN); if (ret < 0) { ERR("Failed to add kernel channel monitoring pipe fd to pollset"); goto error; @@ -706,7 +708,7 @@ void *thread_notification(void *data) ERR("Unexpected poll events %u for notification socket %i", revents, fd); goto error; } - } else if (fd == lttng_pipe_get_readfd(handle->cmd_queue.event_pipe)) { + } else if (fd == handle->cmd_queue.event_fd) { ret = handle_notification_thread_command(handle, &state); if (ret < 0) {