X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fagent-thread.c;h=2439b3e28ec0fe73c54c08be3d32b3c7c70af005;hp=9ac975cbf1ea9539c4d81db352089b25d12af561;hb=427392b43cfe21d440808494f87564fc0224dd70;hpb=d558f2363a2daf3e456a28a6089f7464837ed542 diff --git a/src/bin/lttng-sessiond/agent-thread.c b/src/bin/lttng-sessiond/agent-thread.c index 9ac975cbf..2439b3e28 100644 --- a/src/bin/lttng-sessiond/agent-thread.c +++ b/src/bin/lttng-sessiond/agent-thread.c @@ -15,7 +15,6 @@ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#define _GNU_SOURCE #define _LGPL_SOURCE #include @@ -28,6 +27,7 @@ #include "fd-limit.h" #include "agent-thread.h" +#include "agent.h" #include "lttng-sessiond.h" #include "session.h" #include "utils.h" @@ -73,53 +73,6 @@ static void update_agent_app(struct agent_app *app) session_unlock_list(); } -/* - * Destroy a agent application by socket. - */ -static void destroy_agent_app(int sock) -{ - struct agent_app *app; - - assert(sock >= 0); - - /* - * Not finding an application is a very important error that should NEVER - * happen. The hash table deletion is ONLY done through this call even on - * thread cleanup. - */ - rcu_read_lock(); - app = agent_find_app_by_sock(sock); - assert(app); - - /* RCU read side lock is assumed to be held by this function. */ - agent_delete_app(app); - - /* The application is freed in a RCU call but the socket is closed here. */ - agent_destroy_app(app); - rcu_read_unlock(); -} - -/* - * Cleanup remaining agent apps in the hash table. This should only be called in - * the exit path of the thread. - */ -static void clean_agent_apps_ht(void) -{ - struct lttng_ht_node_ulong *node; - struct lttng_ht_iter iter; - - DBG3("[agent-thread] Cleaning agent apps ht"); - - rcu_read_lock(); - cds_lfht_for_each_entry(agent_apps_ht_by_sock->ht, &iter.iter, node, node) { - struct agent_app *app; - - app = caa_container_of(node, struct agent_app, node); - destroy_agent_app(app->sock->fd); - } - rcu_read_unlock(); -} - /* * Create and init socket from uri. */ @@ -299,7 +252,7 @@ void *agent_thread_manage_registration(void *data) goto error_tcp_socket; } - /* Add create valid TCP socket to poll set. */ + /* Add TCP socket to poll set. */ ret = lttng_poll_add(&events, reg_sock->fd, LPOLLIN | LPOLLERR | LPOLLHUP | LPOLLRDHUP); if (ret < 0) { @@ -342,39 +295,26 @@ restart: goto exit; } - /* - * Check first if this is a POLLERR since POLLIN is also included - * in an error value thus checking first. - */ - if (revents & (LPOLLERR | LPOLLHUP | LPOLLRDHUP)) { - /* Removing from the poll set */ - ret = lttng_poll_del(&events, pollfd); - if (ret < 0) { - goto error; - } - - destroy_agent_app(pollfd); - } else if (revents & (LPOLLIN)) { + if (revents & LPOLLIN) { int new_fd; struct agent_app *app = NULL; - /* Pollin event of agent app socket should NEVER happen. */ assert(pollfd == reg_sock->fd); - new_fd = handle_registration(reg_sock, &app); if (new_fd < 0) { - WARN("[agent-thread] agent registration failed. Ignoring."); - /* Somehow the communication failed. Just continue. */ continue; } /* Should not have a NULL app on success. */ assert(app); - /* Only add poll error event to only detect shutdown. */ + /* + * Since this is a command socket (write then read), + * only add poll error event to only detect shutdown. + */ ret = lttng_poll_add(&events, new_fd, LPOLLERR | LPOLLHUP | LPOLLRDHUP); if (ret < 0) { - destroy_agent_app(new_fd); + agent_destroy_app_by_sock(new_fd); continue; } @@ -382,10 +322,26 @@ restart: update_agent_app(app); /* On failure, the poll will detect it and clean it up. */ - (void) agent_send_registration_done(app); + ret = agent_send_registration_done(app); + if (ret < 0) { + /* Removing from the poll set */ + ret = lttng_poll_del(&events, new_fd); + if (ret < 0) { + goto error; + } + agent_destroy_app_by_sock(new_fd); + continue; + } + } else if (revents & (LPOLLERR | LPOLLHUP | LPOLLRDHUP)) { + /* Removing from the poll set */ + ret = lttng_poll_del(&events, pollfd); + if (ret < 0) { + goto error; + } + agent_destroy_app_by_sock(pollfd); } else { - ERR("Unknown poll events %u for sock %d", revents, pollfd); - continue; + ERR("Unexpected poll events %u for sock %d", revents, pollfd); + goto error; } } } @@ -400,11 +356,6 @@ error_tcp_socket: error_poll_create: DBG("[agent-thread] is cleaning up and stopping."); - if (agent_apps_ht_by_sock) { - clean_agent_apps_ht(); - lttng_ht_destroy(agent_apps_ht_by_sock); - } - rcu_thread_offline(); rcu_unregister_thread(); return NULL;