X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fht-cleanup.c;h=79fb9cd630831865b08b5e2989b0bf71fe7226f5;hb=4a15001e426da818990dc21f1d423fd04b6cd492;hp=7a33840c992fa1e3bb6bb8c2db38195ffb331dcb;hpb=0b2dc8df2a6d7b3341a72a04767dd6328907c97c;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/ht-cleanup.c b/src/bin/lttng-sessiond/ht-cleanup.c index 7a33840c9..79fb9cd63 100644 --- a/src/bin/lttng-sessiond/ht-cleanup.c +++ b/src/bin/lttng-sessiond/ht-cleanup.c @@ -16,6 +16,7 @@ */ #define _GNU_SOURCE +#define _LGPL_SOURCE #include #include @@ -23,11 +24,13 @@ #include #include "lttng-sessiond.h" -#include "health.h" +#include "health-sessiond.h" +#include "testpoint.h" void *thread_ht_cleanup(void *data) { int ret, i, pollfd, err = -1; + ssize_t size_ret; uint32_t revents, nb_fd; struct lttng_poll_event events; @@ -36,11 +39,15 @@ void *thread_ht_cleanup(void *data) rcu_register_thread(); rcu_thread_online(); - health_register(HEALTH_TYPE_HT_CLEANUP); + health_register(health_sessiond, HEALTH_SESSIOND_TYPE_HT_CLEANUP); + + if (testpoint(sessiond_thread_ht_cleanup)) { + goto error_testpoint; + } health_code_update(); - ret = sessiond_set_thread_pollset(&events, 2); + ret = sessiond_set_ht_cleanup_thread_pollset(&events, 2); if (ret < 0) { goto error_poll_create; } @@ -54,11 +61,14 @@ void *thread_ht_cleanup(void *data) health_code_update(); while (1) { + int handled_event; + DBG3("[ht-thread] Polling on %d fds.", LTTNG_POLL_GETNB(&events)); /* Inifinite blocking call, waiting for transmission */ restart: + handled_event = 0; health_poll_entry(); ret = lttng_poll_wait(&events, -1); health_poll_exit(); @@ -83,13 +93,9 @@ restart: 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; + if (pollfd != ht_cleanup_pipe[0]) { + continue; } - assert(pollfd == ht_cleanup_pipe[0]); if (revents & (LPOLLERR | LPOLLHUP | LPOLLRDHUP)) { ERR("ht cleanup pipe error"); @@ -100,11 +106,10 @@ restart: goto error; } - do { - /* Get socket from dispatch thread. */ - ret = read(ht_cleanup_pipe[0], &ht, sizeof(ht)); - } while (ret < 0 && errno == EINTR); - if (ret < 0 || ret < sizeof(ht)) { + /* Get socket from dispatch thread. */ + size_ret = lttng_read(ht_cleanup_pipe[0], &ht, + sizeof(ht)); + if (size_ret < sizeof(ht)) { PERROR("ht cleanup notify pipe"); goto error; } @@ -119,20 +124,43 @@ restart: health_code_update(); } + + /* Only check cleanup quit when no more work to do. */ + if (handled_event) { + continue; + } + + 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 (pollfd == ht_cleanup_pipe[0]) { + continue; + } + + /* Thread quit pipe has been closed. Killing thread. */ + ret = sessiond_check_ht_cleanup_quit(pollfd, revents); + if (ret) { + err = 0; + goto exit; + } + } } exit: error: lttng_poll_clean(&events); error_poll_create: - utils_close_pipe(ht_cleanup_pipe); - ht_cleanup_pipe[0] = ht_cleanup_pipe[1] = -1; - DBG("[ust-thread] cleanup complete."); +error_testpoint: + DBG("[ht-cleanup] Thread terminates."); if (err) { health_error(); ERR("Health error occurred in %s", __func__); } - health_unregister(); + health_unregister(health_sessiond); rcu_thread_offline(); rcu_unregister_thread(); return NULL;