X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;ds=sidebyside;f=liblttng-ust%2Flttng-ust-comm.c;h=4724fabc0d6a72cf57923cea7e6da44d94563052;hb=246be17ec5a99beae7cc40eede54b4958958d8fb;hp=bf2750c2dcd5700d7053e53667ff7c3bb2430433;hpb=75582b3a56366b73ba1f656e03fc8df4a991ac45;p=lttng-ust.git diff --git a/liblttng-ust/lttng-ust-comm.c b/liblttng-ust/lttng-ust-comm.c index bf2750c2..4724fabc 100644 --- a/liblttng-ust/lttng-ust-comm.c +++ b/liblttng-ust/lttng-ust-comm.c @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -51,6 +52,7 @@ #include "lttng-tracer-core.h" #include "compat.h" #include "../libringbuffer/tlsfixup.h" +#include "lttng-ust-baddr.h" /* * Has lttng ust comm constructor been called ? @@ -106,6 +108,7 @@ struct sock_info { char wait_shm_path[PATH_MAX]; char *wait_shm_mmap; + int session_enabled; }; /* Socket from app (connect) to session daemon (listen) for communication */ @@ -122,6 +125,8 @@ struct sock_info global_apps = { .notify_socket = -1, .wait_shm_path = "/" LTTNG_UST_WAIT_FILENAME, + + .session_enabled = 0, }; /* TODO: allow global_apps_sock_path override */ @@ -135,6 +140,8 @@ struct sock_info local_apps = { .socket = -1, .notify_socket = -1, + + .session_enabled = 0, }; static int wait_poll_fallback; @@ -488,6 +495,68 @@ int handle_message(struct sock_info *sock_info, } break; } + case LTTNG_UST_EXCLUSION: + { + /* Receive exclusion names */ + struct lttng_ust_excluder_node *node; + unsigned int count; + + count = lum->u.exclusion.count; + if (count == 0) { + /* There are no names to read */ + ret = 0; + goto error; + } + node = zmalloc(sizeof(*node) + + count * LTTNG_UST_SYM_NAME_LEN); + if (!node) { + ret = -ENOMEM; + goto error; + } + node->excluder.count = count; + len = ustcomm_recv_unix_sock(sock, node->excluder.names, + count * LTTNG_UST_SYM_NAME_LEN); + switch (len) { + case 0: /* orderly shutdown */ + ret = 0; + free(node); + goto error; + default: + if (len == count * LTTNG_UST_SYM_NAME_LEN) { + DBG("Exclusion data received"); + break; + } else if (len < 0) { + DBG("Receive failed from lttng-sessiond with errno %d", (int) -len); + if (len == -ECONNRESET) { + ERR("%s remote end closed connection", sock_info->name); + ret = len; + free(node); + goto error; + } + ret = len; + free(node); + goto end; + } else { + DBG("Incorrect exclusion data message size: %zd", len); + ret = -EINVAL; + free(node); + goto end; + } + } + if (ops->cmd) { + ret = ops->cmd(lum->handle, lum->cmd, + (unsigned long) node, + &args, sock_info); + if (ret) { + free(node); + } + /* Don't free exclusion data if everything went fine. */ + } else { + ret = -ENOSYS; + free(node); + } + break; + } case LTTNG_UST_CHANNEL: { void *chan_data; @@ -639,6 +708,17 @@ error: return ret; } +static +void handle_pending_statedumps(struct sock_info *sock_info) +{ + int ctor_passed = sock_info->constructor_sem_posted; + + if (ctor_passed && sock_info->session_enabled) { + sock_info->session_enabled = 0; + lttng_handle_pending_statedumps(<tng_ust_baddr_statedump); + } +} + static void cleanup_sock_info(struct sock_info *sock_info, int exiting) { @@ -1144,6 +1224,8 @@ restart: ret = handle_message(sock_info, sock, &lum); if (ret) { ERR("Error handling message for %s socket", sock_info->name); + } else { + handle_pending_statedumps(sock_info); } continue; default: @@ -1457,3 +1539,9 @@ void ust_after_fork_child(sigset_t *restore_sigset) ust_after_fork_common(restore_sigset); lttng_ust_init(); } + +void lttng_ust_sockinfo_session_enabled(void *owner) +{ + struct sock_info *sock_info = owner; + sock_info->session_enabled = 1; +}