X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=libust%2Ftracectl.c;h=830e777bb5114391e7525ca6713b138219125f38;hb=1d7304a3f27fd639b513415c27b759e133e3d484;hp=3b60975391abf72c155f9822a1b06fe3db68004d;hpb=0b362d6f999cbbe4b1a0d8cee2a9fb9a34422b7a;p=ust.git diff --git a/libust/tracectl.c b/libust/tracectl.c index 3b60975..830e777 100644 --- a/libust/tracectl.c +++ b/libust/tracectl.c @@ -543,6 +543,11 @@ unlock_traces: return retval; } +static void release_listener_mutex(void *ptr) +{ + pthread_mutex_unlock(&listener_thread_data_mutex); +} + static void listener_cleanup(void *ptr) { pthread_mutex_lock(&listen_sock_mutex); @@ -952,7 +957,7 @@ static void process_client_cmd(struct ustcomm_header *recv_header, print_markers(fp); fclose(fp); - reply_header->size = size; + reply_header->size = size + 1; /* Include final \0 */ result = ustcomm_send(sock, reply_header, ptr); @@ -978,7 +983,7 @@ static void process_client_cmd(struct ustcomm_header *recv_header, print_trace_events(fp); fclose(fp); - reply_header->size = size; + reply_header->size = size + 1; /* Include final \0 */ result = ustcomm_send(sock, reply_header, ptr); @@ -1096,6 +1101,7 @@ void *listener_main(void *p) for (i = 0; i < nfds; i++) { pthread_mutex_lock(&listener_thread_data_mutex); + pthread_cleanup_push(release_listener_mutex, NULL); epoll_sock = (struct ustcomm_sock *)events[i].data.ptr; if (epoll_sock == listen_sock) { addr_size = sizeof(struct sockaddr); @@ -1124,7 +1130,7 @@ void *listener_main(void *p) epoll_sock->fd); } } - pthread_mutex_unlock(&listener_thread_data_mutex); + pthread_cleanup_pop(1); /* release listener mutex */ } } @@ -1691,6 +1697,7 @@ void ust_before_fork(ust_fork_info_t *fork_info) * Hold listen_sock_mutex to protect from listen_sock teardown. */ pthread_mutex_lock(&listen_sock_mutex); + rcu_bp_before_fork(); } /* Don't call this function directly in a traced program */ @@ -1711,24 +1718,20 @@ static void ust_after_fork_common(ust_fork_info_t *fork_info) void ust_after_fork_parent(ust_fork_info_t *fork_info) { + rcu_bp_after_fork_parent(); /* Release mutexes and reenable signals */ ust_after_fork_common(fork_info); } void ust_after_fork_child(ust_fork_info_t *fork_info) { - /* First sanitize the child */ + /* Release urcu mutexes */ + rcu_bp_after_fork_child(); + + /* Sanitize the child */ ust_fork(); /* Then release mutexes and reenable signals */ ust_after_fork_common(fork_info); - - /* - * Make sure we clean up the urcu-bp thread list in the child by running - * the garbage collection before any pthread_create can be called. - * Failure to do so could lead to a deadlock caused by reuse of a thread - * ID before urcu-bp garbage collection is performed. - */ - synchronize_rcu(); }