X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;ds=sidebyside;f=liblttng-ust%2Flttng-ust-comm.c;h=60beef8f43d5625fbc6554acdedf226de67b2b9c;hb=7d3e35b6923378dd9011cd4d044d79e938152f67;hp=18763c45fd3a9c0e499f50ddf657b2b3996c0f29;hpb=34a91bdb42a2a3b01b687ab5e1ba7638401e6dfc;p=lttng-ust.git diff --git a/liblttng-ust/lttng-ust-comm.c b/liblttng-ust/lttng-ust-comm.c index 18763c45..60beef8f 100644 --- a/liblttng-ust/lttng-ust-comm.c +++ b/liblttng-ust/lttng-ust-comm.c @@ -209,10 +209,12 @@ void print_cmd(int cmd, int handle) { const char *cmd_name = "Unknown"; - if (cmd_name_mapping[cmd]) { + if (cmd >= 0 && cmd < LTTNG_ARRAY_SIZE(cmd_name_mapping) + && cmd_name_mapping[cmd]) { cmd_name = cmd_name_mapping[cmd]; } - DBG("Message Received \"%s\", Handle \"%s\" (%d)", cmd_name, + DBG("Message Received \"%s\" (%d), Handle \"%s\" (%d)", + cmd_name, cmd, lttng_ust_obj_get_name(handle), handle); } @@ -443,6 +445,7 @@ int handle_message(struct sock_info *sock_info, goto error; } ret = len; + free(bytecode); goto end; } else { DBG("incorrect filter data message size: %zd", len); @@ -624,6 +627,25 @@ void cleanup_sock_info(struct sock_info *sock_info, int exiting) { int ret; + if (sock_info->root_handle != -1) { + ret = lttng_ust_objd_unref(sock_info->root_handle, 1); + if (ret) { + ERR("Error unref root handle"); + } + sock_info->root_handle = -1; + } + sock_info->constructor_sem_posted = 0; + + /* + * wait_shm_mmap, socket and notify socket are used by listener + * threads outside of the ust lock, so we cannot tear them down + * ourselves, because we cannot join on these threads. Leave + * responsibility of cleaning up these resources to the OS + * process exit. + */ + if (exiting) + return; + if (sock_info->socket != -1) { ret = ustcomm_close_unix_sock(sock_info->socket); if (ret) { @@ -638,21 +660,7 @@ void cleanup_sock_info(struct sock_info *sock_info, int exiting) } sock_info->notify_socket = -1; } - if (sock_info->root_handle != -1) { - ret = lttng_ust_objd_unref(sock_info->root_handle, 1); - if (ret) { - ERR("Error unref root handle"); - } - sock_info->root_handle = -1; - } - sock_info->constructor_sem_posted = 0; - /* - * wait_shm_mmap is used by listener threads outside of the - * ust lock, so we cannot tear it down ourselves, because we - * cannot join on these threads. Leave this task to the OS - * process exit. - */ - if (!exiting && sock_info->wait_shm_mmap) { + if (sock_info->wait_shm_mmap) { ret = munmap(sock_info->wait_shm_mmap, sysconf(_SC_PAGE_SIZE)); if (ret) { ERR("Error unmapping wait shm"); @@ -909,11 +917,6 @@ restart: has_waited = 1; prev_connect_failed = 0; } - ust_lock(); - - if (lttng_ust_comm_should_quit) { - goto quit; - } if (sock_info->socket != -1) { ret = ustcomm_close_unix_sock(sock_info->socket); @@ -938,6 +941,13 @@ restart: if (ret < 0) { DBG("Info: sessiond not accepting connections to %s apps socket", sock_info->name); prev_connect_failed = 1; + + ust_lock(); + + if (lttng_ust_comm_should_quit) { + goto quit; + } + /* * If we cannot find the sessiond daemon, don't delay * constructor execution. @@ -975,6 +985,12 @@ restart: WARN("Unsuppoorted timeout value %ld", timeout); } + ust_lock(); + + if (lttng_ust_comm_should_quit) { + goto quit; + } + /* * Create only one root handle per listener thread for the whole * process lifetime, so we ensure we get ID which is statically @@ -1123,6 +1139,7 @@ void __attribute__((constructor)) lttng_ust_init(void) lttng_ring_buffer_client_overwrite_rt_init(); lttng_ring_buffer_client_discard_init(); lttng_ring_buffer_client_discard_rt_init(); + lttng_context_init(); timeout_mode = get_constructor_timeout(&constructor_timeout); @@ -1225,6 +1242,7 @@ void lttng_ust_cleanup(int exiting) */ lttng_ust_abi_exit(); lttng_ust_events_exit(); + lttng_context_exit(); lttng_ring_buffer_client_discard_rt_exit(); lttng_ring_buffer_client_discard_exit(); lttng_ring_buffer_client_overwrite_rt_exit();