#include "lttng-sessiond.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;
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);
health_code_update();
while (1) {
- DBG3("[ht-thread] Polling on %d fds.",
- LTTNG_POLL_GETNB(&events));
+ DBG3("[ht-thread] Polling.");
/* Inifinite blocking call, waiting for transmission */
restart:
health_poll_entry();
ret = lttng_poll_wait(&events, -1);
+ DBG3("[ht-thread] Returning from poll on %d fds.",
+ LTTNG_POLL_GETNB(&events));
health_poll_exit();
if (ret < 0) {
/*
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. */
ret = sessiond_check_thread_quit_pipe(pollfd, revents);
if (ret) {
}
assert(pollfd == ht_cleanup_pipe[0]);
- if (revents & (LPOLLERR | LPOLLHUP | LPOLLRDHUP)) {
+ if (revents & LPOLLIN) {
+ /* 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;
+ }
+ health_code_update();
+ /*
+ * The whole point of this thread is to call
+ * lttng_ht_destroy from a context that is NOT:
+ * 1) a read-side RCU lock,
+ * 2) a call_rcu thread.
+ */
+ lttng_ht_destroy(ht);
+
+ health_code_update();
+ } else if (revents & (LPOLLERR | LPOLLHUP | LPOLLRDHUP)) {
ERR("ht cleanup pipe error");
goto error;
- } else if (!(revents & LPOLLIN)) {
- /* No POLLIN and not a catched error, stop the thread. */
- ERR("ht cleanup failed. revent: %u", revents);
- 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)) {
- PERROR("ht cleanup notify pipe");
+ } else {
+ ERR("Unexpected poll events %u for sock %d", revents, pollfd);
goto error;
}
- health_code_update();
- /*
- * The whole point of this thread is to call
- * lttng_ht_destroy from a context that is NOT:
- * 1) a read-side RCU lock,
- * 2) a call_rcu thread.
- */
- lttng_ht_destroy(ht);
-
- health_code_update();
}
}
error:
lttng_poll_clean(&events);
error_poll_create:
+error_testpoint:
utils_close_pipe(ht_cleanup_pipe);
ht_cleanup_pipe[0] = ht_cleanup_pipe[1] = -1;
DBG("[ust-thread] cleanup complete.");